aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxoviat <[email protected]>2025-11-20 22:19:22 +0000
committerGitHub <[email protected]>2025-11-20 22:19:22 +0000
commit96a026c73bad2ebb8dfc78e88c9690611bf2cb97 (patch)
treec38404a055dcd2173b35be67e83dcf52f8d7686a
parentde1e5f731839587e4743e91ce965415720380fb4 (diff)
parent759d5d511a309db020eb6ee30a63b1d7925f99bb (diff)
Merge pull request #4927 from leftger/fix/stm32wba-adc4
stm32: Fixed ADC4 enable() for WBA
-rw-r--r--embassy-stm32/CHANGELOG.md1
-rw-r--r--embassy-stm32/src/adc/adc4.rs18
-rw-r--r--examples/stm32wba6/src/bin/adc.rs28
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
4use defmt::*; 4use defmt::*;
5use embassy_stm32::Config;
5use embassy_stm32::adc::{Adc, AdcChannel, SampleTime, adc4}; 6use embassy_stm32::adc::{Adc, AdcChannel, SampleTime, adc4};
7use embassy_stm32::rcc::{
8 AHB5Prescaler, AHBPrescaler, APBPrescaler, PllDiv, PllMul, PllPreDiv, PllSource, Sysclk, VoltageScale,
9};
6use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
7 11
8#[embassy_executor::main] 12#[embassy_executor::main]
9async fn main(_spawner: embassy_executor::Spawner) { 13async 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