diff options
| author | xoviat <[email protected]> | 2025-11-20 22:19:22 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-11-20 22:19:22 +0000 |
| commit | 96a026c73bad2ebb8dfc78e88c9690611bf2cb97 (patch) | |
| tree | c38404a055dcd2173b35be67e83dcf52f8d7686a | |
| parent | de1e5f731839587e4743e91ce965415720380fb4 (diff) | |
| parent | 759d5d511a309db020eb6ee30a63b1d7925f99bb (diff) | |
Merge pull request #4927 from leftger/fix/stm32wba-adc4
stm32: Fixed ADC4 enable() for WBA
| -rw-r--r-- | embassy-stm32/CHANGELOG.md | 1 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/adc4.rs | 18 | ||||
| -rw-r--r-- | examples/stm32wba6/src/bin/adc.rs | 28 |
3 files changed, 45 insertions, 2 deletions
diff --git a/embassy-stm32/CHANGELOG.md b/embassy-stm32/CHANGELOG.md index f4d9dcf09..87a8ef7c9 100644 --- a/embassy-stm32/CHANGELOG.md +++ b/embassy-stm32/CHANGELOG.md | |||
| @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 7 | 7 | ||
| 8 | ## Unreleased - ReleaseDate | 8 | ## Unreleased - ReleaseDate |
| 9 | 9 | ||
| 10 | - fix: Fixed ADC4 enable() for WBA | ||
| 10 | - feat: allow use of anyadcchannel for adc4 | 11 | - feat: allow use of anyadcchannel for adc4 |
| 11 | - fix: fix incorrect logic for buffered usart transmission complete. | 12 | - fix: fix incorrect logic for buffered usart transmission complete. |
| 12 | - feat: add poll_for methods to exti | 13 | - feat: add poll_for methods to exti |
diff --git a/embassy-stm32/src/adc/adc4.rs b/embassy-stm32/src/adc/adc4.rs index 499fc2093..472eb46fd 100644 --- a/embassy-stm32/src/adc/adc4.rs +++ b/embassy-stm32/src/adc/adc4.rs | |||
| @@ -113,10 +113,26 @@ foreach_adc!( | |||
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | fn enable() { | 115 | fn enable() { |
| 116 | let cr_initial = ADC4::regs().cr().read(); | ||
| 117 | let isr_initial = ADC4::regs().isr().read(); | ||
| 118 | |||
| 119 | if cr_initial.aden() && isr_initial.adrdy() { | ||
| 120 | return; | ||
| 121 | } | ||
| 122 | |||
| 123 | if cr_initial.aden() || cr_initial.adstart() { | ||
| 124 | if cr_initial.adstart() { | ||
| 125 | ADC4::regs().cr().modify(|w| w.set_adstp(true)); | ||
| 126 | while ADC4::regs().cr().read().adstart() {} | ||
| 127 | } | ||
| 128 | |||
| 129 | ADC4::regs().cr().modify(|w| w.set_addis(true)); | ||
| 130 | while ADC4::regs().cr().read().aden() {} | ||
| 131 | } | ||
| 132 | |||
| 116 | ADC4::regs().isr().write(|w| w.set_adrdy(true)); | 133 | ADC4::regs().isr().write(|w| w.set_adrdy(true)); |
| 117 | ADC4::regs().cr().modify(|w| w.set_aden(true)); | 134 | ADC4::regs().cr().modify(|w| w.set_aden(true)); |
| 118 | while !ADC4::regs().isr().read().adrdy() {} | 135 | while !ADC4::regs().isr().read().adrdy() {} |
| 119 | ADC4::regs().isr().write(|w| w.set_adrdy(true)); | ||
| 120 | } | 136 | } |
| 121 | 137 | ||
| 122 | fn start() { | 138 | fn start() { |
diff --git a/examples/stm32wba6/src/bin/adc.rs b/examples/stm32wba6/src/bin/adc.rs index 9d1f39419..51dcff57a 100644 --- a/examples/stm32wba6/src/bin/adc.rs +++ b/examples/stm32wba6/src/bin/adc.rs | |||
| @@ -2,12 +2,38 @@ | |||
| 2 | #![no_main] | 2 | #![no_main] |
| 3 | 3 | ||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_stm32::Config; | ||
| 5 | use embassy_stm32::adc::{Adc, AdcChannel, SampleTime, adc4}; | 6 | use embassy_stm32::adc::{Adc, AdcChannel, SampleTime, adc4}; |
| 7 | use embassy_stm32::rcc::{ | ||
| 8 | AHB5Prescaler, AHBPrescaler, APBPrescaler, PllDiv, PllMul, PllPreDiv, PllSource, Sysclk, VoltageScale, | ||
| 9 | }; | ||
| 6 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {defmt_rtt as _, panic_probe as _}; |
| 7 | 11 | ||
| 8 | #[embassy_executor::main] | 12 | #[embassy_executor::main] |
| 9 | async fn main(_spawner: embassy_executor::Spawner) { | 13 | async fn main(_spawner: embassy_executor::Spawner) { |
| 10 | let config = embassy_stm32::Config::default(); | 14 | let mut config = Config::default(); |
| 15 | // Fine-tune PLL1 dividers/multipliers | ||
| 16 | config.rcc.pll1 = Some(embassy_stm32::rcc::Pll { | ||
| 17 | source: PllSource::HSI, | ||
| 18 | prediv: PllPreDiv::DIV1, // PLLM = 1 → HSI / 1 = 16 MHz | ||
| 19 | mul: PllMul::MUL30, // PLLN = 30 → 16 MHz * 30 = 480 MHz VCO | ||
| 20 | divr: Some(PllDiv::DIV5), // PLLR = 5 → 96 MHz (Sysclk) | ||
| 21 | // divq: Some(PllDiv::DIV10), // PLLQ = 10 → 48 MHz (NOT USED) | ||
| 22 | divq: None, | ||
| 23 | divp: Some(PllDiv::DIV30), // PLLP = 30 → 16 MHz (USBOTG) | ||
| 24 | frac: Some(0), // Fractional part (enabled) | ||
| 25 | }); | ||
| 26 | |||
| 27 | config.rcc.ahb_pre = AHBPrescaler::DIV1; | ||
| 28 | config.rcc.apb1_pre = APBPrescaler::DIV1; | ||
| 29 | config.rcc.apb2_pre = APBPrescaler::DIV1; | ||
| 30 | config.rcc.apb7_pre = APBPrescaler::DIV1; | ||
| 31 | config.rcc.ahb5_pre = AHB5Prescaler::DIV4; | ||
| 32 | |||
| 33 | // voltage scale for max performance | ||
| 34 | config.rcc.voltage_scale = VoltageScale::RANGE1; | ||
| 35 | // route PLL1_P into the USB‐OTG‐HS block | ||
| 36 | config.rcc.sys = Sysclk::PLL1_R; | ||
| 11 | 37 | ||
| 12 | let mut p = embassy_stm32::init(config); | 38 | let mut p = embassy_stm32::init(config); |
| 13 | 39 | ||
