aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlle Sandberg <[email protected]>2023-09-05 12:14:04 +0200
committerOlle Sandberg <[email protected]>2023-09-06 06:57:30 +0200
commit0d3ff34d80c98f62a1f6e8b4df1226f6c36337a0 (patch)
tree78b29a0c530eed101d974b010b7171639e318b73
parentbb2d6c854273ea57eb7d898c0f67dd9f8020f3e7 (diff)
adc: enable ADC and clock selection for STM32WLx
-rw-r--r--embassy-stm32/src/adc/v3.rs2
-rw-r--r--embassy-stm32/src/rcc/wl.rs29
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.
14fn enable() { 14fn 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 @@
1pub use super::bus::{AHBPrescaler, APBPrescaler, VoltageScale}; 1pub use super::bus::{AHBPrescaler, APBPrescaler, VoltageScale};
2use crate::pac::rcc::vals::Adcsel;
2use crate::pac::{FLASH, PWR, RCC}; 3use crate::pac::{FLASH, PWR, RCC};
3use crate::rcc::bd::{BackupDomain, RtcClockSource}; 4use crate::rcc::bd::{BackupDomain, RtcClockSource};
4use crate::rcc::{set_freqs, Clocks}; 5use crate::rcc::{set_freqs, Clocks};
@@ -106,6 +107,29 @@ impl Into<u8> for MSIRange {
106 } 107 }
107} 108}
108 109
110#[derive(Clone, Copy)]
111pub enum AdcClockSource {
112 HSI16,
113 PLLPCLK,
114 SYSCLK,
115}
116
117impl 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
127impl Default for AdcClockSource {
128 fn default() -> Self {
129 Self::HSI16
130 }
131}
132
109/// Clocks configutation 133/// Clocks configutation
110pub struct Config { 134pub 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
121impl Default for Config { 146impl 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 {