diff options
| author | Olle Sandberg <[email protected]> | 2023-09-05 12:14:04 +0200 |
|---|---|---|
| committer | Olle Sandberg <[email protected]> | 2023-09-06 06:57:30 +0200 |
| commit | 0d3ff34d80c98f62a1f6e8b4df1226f6c36337a0 (patch) | |
| tree | 78b29a0c530eed101d974b010b7171639e318b73 | |
| parent | bb2d6c854273ea57eb7d898c0f67dd9f8020f3e7 (diff) | |
adc: enable ADC and clock selection for STM32WLx
| -rw-r--r-- | embassy-stm32/src/adc/v3.rs | 2 | ||||
| -rw-r--r-- | embassy-stm32/src/rcc/wl.rs | 29 |
2 files changed, 30 insertions, 1 deletions
diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs index 7d63b0cee..011ecc281 100644 --- a/embassy-stm32/src/adc/v3.rs +++ b/embassy-stm32/src/adc/v3.rs | |||
| @@ -13,7 +13,7 @@ pub const VREF_CALIB_MV: u32 = 3000; | |||
| 13 | /// configuration. | 13 | /// configuration. |
| 14 | fn enable() { | 14 | fn enable() { |
| 15 | critical_section::with(|_| { | 15 | critical_section::with(|_| { |
| 16 | #[cfg(stm32h7)] | 16 | #[cfg(any(stm32h7, stm32wl))] |
| 17 | crate::pac::RCC.apb2enr().modify(|w| w.set_adcen(true)); | 17 | crate::pac::RCC.apb2enr().modify(|w| w.set_adcen(true)); |
| 18 | #[cfg(stm32g0)] | 18 | #[cfg(stm32g0)] |
| 19 | crate::pac::RCC.apbenr2().modify(|w| w.set_adcen(true)); | 19 | crate::pac::RCC.apbenr2().modify(|w| w.set_adcen(true)); |
diff --git a/embassy-stm32/src/rcc/wl.rs b/embassy-stm32/src/rcc/wl.rs index e33690d10..47be00ad8 100644 --- a/embassy-stm32/src/rcc/wl.rs +++ b/embassy-stm32/src/rcc/wl.rs | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | pub use super::bus::{AHBPrescaler, APBPrescaler, VoltageScale}; | 1 | pub use super::bus::{AHBPrescaler, APBPrescaler, VoltageScale}; |
| 2 | use crate::pac::rcc::vals::Adcsel; | ||
| 2 | use crate::pac::{FLASH, PWR, RCC}; | 3 | use crate::pac::{FLASH, PWR, RCC}; |
| 3 | use crate::rcc::bd::{BackupDomain, RtcClockSource}; | 4 | use crate::rcc::bd::{BackupDomain, RtcClockSource}; |
| 4 | use crate::rcc::{set_freqs, Clocks}; | 5 | use crate::rcc::{set_freqs, Clocks}; |
| @@ -106,6 +107,29 @@ impl Into<u8> for MSIRange { | |||
| 106 | } | 107 | } |
| 107 | } | 108 | } |
| 108 | 109 | ||
| 110 | #[derive(Clone, Copy)] | ||
| 111 | pub enum AdcClockSource { | ||
| 112 | HSI16, | ||
| 113 | PLLPCLK, | ||
| 114 | SYSCLK, | ||
| 115 | } | ||
| 116 | |||
| 117 | impl AdcClockSource { | ||
| 118 | pub fn adcsel(&self) -> Adcsel { | ||
| 119 | match self { | ||
| 120 | AdcClockSource::HSI16 => Adcsel::HSI16, | ||
| 121 | AdcClockSource::PLLPCLK => Adcsel::PLLPCLK, | ||
| 122 | AdcClockSource::SYSCLK => Adcsel::SYSCLK, | ||
| 123 | } | ||
| 124 | } | ||
| 125 | } | ||
| 126 | |||
| 127 | impl Default for AdcClockSource { | ||
| 128 | fn default() -> Self { | ||
| 129 | Self::HSI16 | ||
| 130 | } | ||
| 131 | } | ||
| 132 | |||
| 109 | /// Clocks configutation | 133 | /// Clocks configutation |
| 110 | pub struct Config { | 134 | pub struct Config { |
| 111 | pub mux: ClockSrc, | 135 | pub mux: ClockSrc, |
| @@ -116,6 +140,7 @@ pub struct Config { | |||
| 116 | pub enable_lsi: bool, | 140 | pub enable_lsi: bool, |
| 117 | pub enable_rtc_apb: bool, | 141 | pub enable_rtc_apb: bool, |
| 118 | pub rtc_mux: RtcClockSource, | 142 | pub rtc_mux: RtcClockSource, |
| 143 | pub adc_clock_source: AdcClockSource, | ||
| 119 | } | 144 | } |
| 120 | 145 | ||
| 121 | impl Default for Config { | 146 | impl Default for Config { |
| @@ -130,6 +155,7 @@ impl Default for Config { | |||
| 130 | enable_lsi: false, | 155 | enable_lsi: false, |
| 131 | enable_rtc_apb: false, | 156 | enable_rtc_apb: false, |
| 132 | rtc_mux: RtcClockSource::LSI, | 157 | rtc_mux: RtcClockSource::LSI, |
| 158 | adc_clock_source: AdcClockSource::default(), | ||
| 133 | } | 159 | } |
| 134 | } | 160 | } |
| 135 | } | 161 | } |
| @@ -299,6 +325,9 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 299 | w.set_ppre2(config.apb2_pre.into()); | 325 | w.set_ppre2(config.apb2_pre.into()); |
| 300 | }); | 326 | }); |
| 301 | 327 | ||
| 328 | // ADC clock MUX | ||
| 329 | RCC.ccipr().modify(|w| w.set_adcsel(config.adc_clock_source.adcsel())); | ||
| 330 | |||
| 302 | // TODO: switch voltage range | 331 | // TODO: switch voltage range |
| 303 | 332 | ||
| 304 | if config.enable_lsi { | 333 | if config.enable_lsi { |
