aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxoviat <[email protected]>2025-11-21 07:43:37 -0600
committerxoviat <[email protected]>2025-11-21 07:43:37 -0600
commit1cc2643ae60d429d0389213f5c1f6bbc007c6a2b (patch)
treebd05a305851592b591460a69e7f30b1f135b65fd
parent96a026c73bad2ebb8dfc78e88c9690611bf2cb97 (diff)
adc: fix start sequence for blocking_read
-rw-r--r--embassy-stm32/src/adc/adc4.rs35
-rw-r--r--embassy-stm32/src/adc/mod.rs2
-rw-r--r--embassy-stm32/src/adc/v2.rs17
3 files changed, 23 insertions, 31 deletions
diff --git a/embassy-stm32/src/adc/adc4.rs b/embassy-stm32/src/adc/adc4.rs
index 472eb46fd..453513309 100644
--- a/embassy-stm32/src/adc/adc4.rs
+++ b/embassy-stm32/src/adc/adc4.rs
@@ -113,26 +113,11 @@ foreach_adc!(
113 } 113 }
114 114
115 fn enable() { 115 fn enable() {
116 let cr_initial = ADC4::regs().cr().read(); 116 if !ADC4::regs().cr().read().aden() || !ADC4::regs().isr().read().adrdy() {
117 let isr_initial = ADC4::regs().isr().read(); 117 ADC4::regs().isr().write(|w| w.set_adrdy(true));
118 118 ADC4::regs().cr().modify(|w| w.set_aden(true));
119 if cr_initial.aden() && isr_initial.adrdy() { 119 while !ADC4::regs().isr().read().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 } 120 }
132
133 ADC4::regs().isr().write(|w| w.set_adrdy(true));
134 ADC4::regs().cr().modify(|w| w.set_aden(true));
135 while !ADC4::regs().isr().read().adrdy() {}
136 } 121 }
137 122
138 fn start() { 123 fn start() {
@@ -143,13 +128,17 @@ foreach_adc!(
143 } 128 }
144 129
145 fn stop() { 130 fn stop() {
146 if ADC4::regs().cr().read().adstart() && !ADC4::regs().cr().read().addis() { 131 let cr = ADC4::regs().cr().read();
147 ADC4::regs().cr().modify(|reg| { 132 if cr.adstart() {
148 reg.set_adstp(true); 133 ADC4::regs().cr().modify(|w| w.set_adstp(true));
149 });
150 while ADC4::regs().cr().read().adstart() {} 134 while ADC4::regs().cr().read().adstart() {}
151 } 135 }
152 136
137 if cr.aden() || cr.adstart() {
138 ADC4::regs().cr().modify(|w| w.set_addis(true));
139 while ADC4::regs().cr().read().aden() {}
140 }
141
153 // Reset configuration. 142 // Reset configuration.
154 ADC4::regs().cfgr1().modify(|reg| { 143 ADC4::regs().cfgr1().modify(|reg| {
155 reg.set_dmaen(false); 144 reg.set_dmaen(false);
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs
index 755cb78c2..6d53d9b91 100644
--- a/embassy-stm32/src/adc/mod.rs
+++ b/embassy-stm32/src/adc/mod.rs
@@ -192,6 +192,8 @@ impl<'d, T: AnyInstance> Adc<'d, T> {
192 #[cfg(any(adc_v1, adc_c0, adc_l0, adc_v2, adc_g4, adc_v4, adc_u5, adc_wba))] 192 #[cfg(any(adc_v1, adc_c0, adc_l0, adc_v2, adc_g4, adc_v4, adc_u5, adc_wba))]
193 channel.setup(); 193 channel.setup();
194 194
195 // Ensure no conversions are ongoing
196 T::stop();
195 #[cfg(any(adc_v2, adc_v3, adc_g0, adc_h7rs, adc_u0, adc_u5, adc_wba, adc_c0))] 197 #[cfg(any(adc_v2, adc_v3, adc_g0, adc_h7rs, adc_u0, adc_u5, adc_wba, adc_c0))]
196 T::enable(); 198 T::enable();
197 T::configure_sequence([((channel.channel(), channel.is_differential()), sample_time)].into_iter()); 199 T::configure_sequence([((channel.channel(), channel.is_differential()), sample_time)].into_iter());
diff --git a/embassy-stm32/src/adc/v2.rs b/embassy-stm32/src/adc/v2.rs
index 341b15674..3c4431ae0 100644
--- a/embassy-stm32/src/adc/v2.rs
+++ b/embassy-stm32/src/adc/v2.rs
@@ -79,12 +79,17 @@ impl<T: Instance> super::SealedAnyInstance for T {
79 T::regs().dr().as_ptr() as *mut u16 79 T::regs().dr().as_ptr() as *mut u16
80 } 80 }
81 81
82 fn enable() {} 82 fn enable() {
83 T::regs().cr2().modify(|reg| {
84 reg.set_adon(true);
85 });
86
87 blocking_delay_us(3);
88 }
83 89
84 fn start() { 90 fn start() {
85 // Begin ADC conversions 91 // Begin ADC conversions
86 T::regs().cr2().modify(|reg| { 92 T::regs().cr2().modify(|reg| {
87 reg.set_adon(true);
88 reg.set_swstart(true); 93 reg.set_swstart(true);
89 }); 94 });
90 } 95 }
@@ -198,7 +203,7 @@ impl<T: Instance> super::SealedAnyInstance for T {
198 203
199impl<'d, T> Adc<'d, T> 204impl<'d, T> Adc<'d, T>
200where 205where
201 T: Instance, 206 T: Instance + super::AnyInstance,
202{ 207{
203 pub fn new(adc: Peri<'d, T>) -> Self { 208 pub fn new(adc: Peri<'d, T>) -> Self {
204 Self::new_with_config(adc, Default::default()) 209 Self::new_with_config(adc, Default::default())
@@ -209,11 +214,7 @@ where
209 214
210 let presc = from_pclk2(T::frequency()); 215 let presc = from_pclk2(T::frequency());
211 T::common_regs().ccr().modify(|w| w.set_adcpre(presc)); 216 T::common_regs().ccr().modify(|w| w.set_adcpre(presc));
212 T::regs().cr2().modify(|reg| { 217 T::enable();
213 reg.set_adon(true);
214 });
215
216 blocking_delay_us(3);
217 218
218 if let Some(resolution) = config.resolution { 219 if let Some(resolution) = config.resolution {
219 T::regs().cr1().modify(|reg| reg.set_res(resolution.into())); 220 T::regs().cr1().modify(|reg| reg.set_res(resolution.into()));