aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxoviat <[email protected]>2025-11-10 09:56:42 -0600
committerxoviat <[email protected]>2025-11-10 09:56:42 -0600
commit12b59dc610fb659a4d51ccc364865a7e154379d6 (patch)
tree4d91375fb1ba72c65a5a50ab213181a03828c280
parent1da05747c416c989a128aabbbde4b46df7bba9b9 (diff)
adc: remove sample_time from struct
-rw-r--r--embassy-stm32/src/adc/adc4.rs18
-rw-r--r--embassy-stm32/src/adc/c0.rs15
-rw-r--r--embassy-stm32/src/adc/f1.rs13
-rw-r--r--embassy-stm32/src/adc/f3.rs13
-rw-r--r--embassy-stm32/src/adc/f3_v1_1.rs5
-rw-r--r--embassy-stm32/src/adc/g4.rs22
-rw-r--r--embassy-stm32/src/adc/mod.rs2
-rw-r--r--embassy-stm32/src/adc/v1.rs13
-rw-r--r--embassy-stm32/src/adc/v2.rs17
-rw-r--r--embassy-stm32/src/adc/v3.rs36
-rw-r--r--embassy-stm32/src/adc/v4.rs23
-rw-r--r--embassy-stm32/src/adc/watchdog_v1.rs6
-rw-r--r--examples/stm32c0/src/bin/adc.rs8
-rw-r--r--examples/stm32f0/src/bin/adc-watchdog.rs6
-rw-r--r--examples/stm32f0/src/bin/adc.rs5
-rw-r--r--examples/stm32f1/src/bin/adc.rs6
-rw-r--r--examples/stm32f334/src/bin/adc.rs8
-rw-r--r--examples/stm32f334/src/bin/opamp.rs8
-rw-r--r--examples/stm32f4/src/bin/adc.rs10
-rw-r--r--examples/stm32f4/src/bin/adc_dma.rs8
-rw-r--r--examples/stm32f7/src/bin/adc.rs6
-rw-r--r--examples/stm32g0/src/bin/adc.rs5
-rw-r--r--examples/stm32g0/src/bin/adc_oversampling.rs3
-rw-r--r--examples/stm32g4/src/bin/adc.rs3
-rw-r--r--examples/stm32g4/src/bin/adc_differential.rs3
-rw-r--r--examples/stm32g4/src/bin/adc_oversampling.rs3
-rw-r--r--examples/stm32h5/src/bin/adc.rs6
-rw-r--r--examples/stm32h7/src/bin/adc.rs6
-rw-r--r--examples/stm32l0/src/bin/adc.rs5
-rw-r--r--examples/stm32l4/src/bin/adc.rs4
-rw-r--r--examples/stm32l4/src/bin/adc_dma.rs10
-rw-r--r--examples/stm32u0/src/bin/adc.rs4
-rw-r--r--examples/stm32u5/src/bin/adc.rs18
-rw-r--r--examples/stm32wba/src/bin/adc.rs6
-rw-r--r--examples/stm32wba6/src/bin/adc.rs5
-rw-r--r--examples/stm32wl/src/bin/adc.rs6
-rw-r--r--examples/stm32wle5/src/bin/adc.rs5
-rw-r--r--tests/stm32/src/bin/dac.rs9
-rw-r--r--tests/stm32/src/bin/dac_l1.rs11
39 files changed, 131 insertions, 229 deletions
diff --git a/embassy-stm32/src/adc/adc4.rs b/embassy-stm32/src/adc/adc4.rs
index 2608160a3..befa8ed4a 100644
--- a/embassy-stm32/src/adc/adc4.rs
+++ b/embassy-stm32/src/adc/adc4.rs
@@ -327,18 +327,6 @@ impl<'d, T: Instance> Adc4<'d, T> {
327 Dac {} 327 Dac {}
328 } 328 }
329 329
330 /// Set the ADC sample time.
331 pub fn set_sample_time(&mut self, sample_time: SampleTime) {
332 T::regs().smpr().modify(|w| {
333 w.set_smp(0, sample_time);
334 });
335 }
336
337 /// Get the ADC sample time.
338 pub fn sample_time(&self) -> SampleTime {
339 T::regs().smpr().read().smp(0)
340 }
341
342 /// Set the ADC resolution. 330 /// Set the ADC resolution.
343 pub fn set_resolution(&mut self, resolution: Resolution) { 331 pub fn set_resolution(&mut self, resolution: Resolution) {
344 T::regs().cfgr1().modify(|w| w.set_res(resolution.into())); 332 T::regs().cfgr1().modify(|w| w.set_res(resolution.into()));
@@ -387,7 +375,11 @@ impl<'d, T: Instance> Adc4<'d, T> {
387 } 375 }
388 376
389 /// Read an ADC channel. 377 /// Read an ADC channel.
390 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 378 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
379 T::regs().smpr().modify(|w| {
380 w.set_smp(0, sample_time);
381 });
382
391 channel.setup(); 383 channel.setup();
392 384
393 // Select channel 385 // Select channel
diff --git a/embassy-stm32/src/adc/c0.rs b/embassy-stm32/src/adc/c0.rs
index fc28df346..70302ef96 100644
--- a/embassy-stm32/src/adc/c0.rs
+++ b/embassy-stm32/src/adc/c0.rs
@@ -156,7 +156,7 @@ pub enum Averaging {
156 156
157impl<'d, T: Instance> Adc<'d, T> { 157impl<'d, T: Instance> Adc<'d, T> {
158 /// Create a new ADC driver. 158 /// Create a new ADC driver.
159 pub fn new(adc: Peri<'d, T>, sample_time: SampleTime, resolution: Resolution) -> Self { 159 pub fn new(adc: Peri<'d, T>, resolution: Resolution) -> Self {
160 rcc::enable_and_reset::<T>(); 160 rcc::enable_and_reset::<T>();
161 161
162 T::regs().cfgr2().modify(|w| w.set_ckmode(Ckmode::SYSCLK)); 162 T::regs().cfgr2().modify(|w| w.set_ckmode(Ckmode::SYSCLK));
@@ -174,10 +174,7 @@ impl<'d, T: Instance> Adc<'d, T> {
174 ); 174 );
175 } 175 }
176 176
177 let mut s = Self { 177 let mut s = Self { adc };
178 adc,
179 sample_time: SampleTime::from_bits(0),
180 };
181 178
182 s.power_up(); 179 s.power_up();
183 180
@@ -189,8 +186,6 @@ impl<'d, T: Instance> Adc<'d, T> {
189 186
190 s.configure_default(); 187 s.configure_default();
191 188
192 s.set_sample_time_all_channels(sample_time);
193
194 s 189 s
195 } 190 }
196 191
@@ -258,8 +253,6 @@ impl<'d, T: Instance> Adc<'d, T> {
258 /// Set the ADC sample time. 253 /// Set the ADC sample time.
259 /// Shall only be called when ADC is not converting. 254 /// Shall only be called when ADC is not converting.
260 pub fn set_sample_time_all_channels(&mut self, sample_time: SampleTime) { 255 pub fn set_sample_time_all_channels(&mut self, sample_time: SampleTime) {
261 self.sample_time = sample_time;
262
263 // Set all channels to use SMP1 field as source. 256 // Set all channels to use SMP1 field as source.
264 T::regs().smpr().modify(|w| { 257 T::regs().smpr().modify(|w| {
265 w.smpsel(0); 258 w.smpsel(0);
@@ -288,7 +281,9 @@ impl<'d, T: Instance> Adc<'d, T> {
288 T::regs().dr().read().data() as u16 281 T::regs().dr().read().data() as u16
289 } 282 }
290 283
291 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 284 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
285 self.set_sample_time_all_channels(sample_time);
286
292 Self::configure_channel(channel); 287 Self::configure_channel(channel);
293 T::regs().cfgr1().write(|reg| { 288 T::regs().cfgr1().write(|reg| {
294 reg.set_chselrmod(false); 289 reg.set_chselrmod(false);
diff --git a/embassy-stm32/src/adc/f1.rs b/embassy-stm32/src/adc/f1.rs
index f9c23d72b..32e330d76 100644
--- a/embassy-stm32/src/adc/f1.rs
+++ b/embassy-stm32/src/adc/f1.rs
@@ -71,10 +71,7 @@ impl<'d, T: Instance> Adc<'d, T> {
71 T::Interrupt::unpend(); 71 T::Interrupt::unpend();
72 unsafe { T::Interrupt::enable() }; 72 unsafe { T::Interrupt::enable() };
73 73
74 Self { 74 Self { adc }
75 adc,
76 sample_time: SampleTime::from_bits(0),
77 }
78 } 75 }
79 76
80 fn freq() -> Hertz { 77 fn freq() -> Hertz {
@@ -108,10 +105,6 @@ impl<'d, T: Instance> Adc<'d, T> {
108 Temperature {} 105 Temperature {}
109 } 106 }
110 107
111 pub fn set_sample_time(&mut self, sample_time: SampleTime) {
112 self.sample_time = sample_time;
113 }
114
115 /// Perform a single conversion. 108 /// Perform a single conversion.
116 async fn convert(&mut self) -> u16 { 109 async fn convert(&mut self) -> u16 {
117 T::regs().cr2().modify(|reg| { 110 T::regs().cr2().modify(|reg| {
@@ -134,8 +127,8 @@ impl<'d, T: Instance> Adc<'d, T> {
134 T::regs().dr().read().0 as u16 127 T::regs().dr().read().0 as u16
135 } 128 }
136 129
137 pub async fn read(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 130 pub async fn read(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
138 Self::set_channel_sample_time(channel.channel(), self.sample_time); 131 Self::set_channel_sample_time(channel.channel(), sample_time);
139 T::regs().cr1().modify(|reg| { 132 T::regs().cr1().modify(|reg| {
140 reg.set_scan(false); 133 reg.set_scan(false);
141 reg.set_discen(false); 134 reg.set_discen(false);
diff --git a/embassy-stm32/src/adc/f3.rs b/embassy-stm32/src/adc/f3.rs
index 73ceb087a..cf31aa81b 100644
--- a/embassy-stm32/src/adc/f3.rs
+++ b/embassy-stm32/src/adc/f3.rs
@@ -90,10 +90,7 @@ impl<'d, T: Instance> Adc<'d, T> {
90 T::Interrupt::enable(); 90 T::Interrupt::enable();
91 } 91 }
92 92
93 Self { 93 Self { adc }
94 adc,
95 sample_time: SampleTime::from_bits(0),
96 }
97 } 94 }
98 95
99 fn freq() -> Hertz { 96 fn freq() -> Hertz {
@@ -124,10 +121,6 @@ impl<'d, T: Instance> Adc<'d, T> {
124 Temperature {} 121 Temperature {}
125 } 122 }
126 123
127 pub fn set_sample_time(&mut self, sample_time: SampleTime) {
128 self.sample_time = sample_time;
129 }
130
131 /// Perform a single conversion. 124 /// Perform a single conversion.
132 async fn convert(&mut self) -> u16 { 125 async fn convert(&mut self) -> u16 {
133 T::regs().isr().write(|_| {}); 126 T::regs().isr().write(|_| {});
@@ -150,8 +143,8 @@ impl<'d, T: Instance> Adc<'d, T> {
150 T::regs().dr().read().rdata() 143 T::regs().dr().read().rdata()
151 } 144 }
152 145
153 pub async fn read(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 146 pub async fn read(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
154 Self::set_channel_sample_time(channel.channel(), self.sample_time); 147 Self::set_channel_sample_time(channel.channel(), sample_time);
155 148
156 // Configure the channel to sample 149 // Configure the channel to sample
157 T::regs().sqr1().write(|w| w.set_sq(0, channel.channel())); 150 T::regs().sqr1().write(|w| w.set_sq(0, channel.channel()));
diff --git a/embassy-stm32/src/adc/f3_v1_1.rs b/embassy-stm32/src/adc/f3_v1_1.rs
index cd5de54f5..919ac3cc0 100644
--- a/embassy-stm32/src/adc/f3_v1_1.rs
+++ b/embassy-stm32/src/adc/f3_v1_1.rs
@@ -79,7 +79,7 @@ impl<T: Instance> Vref<T> {
79 } 79 }
80 80
81 pub async fn calibrate(&mut self, adc: &mut Adc<'_, T>) -> Calibration { 81 pub async fn calibrate(&mut self, adc: &mut Adc<'_, T>) -> Calibration {
82 let vref_val = adc.read(self).await; 82 let vref_val = adc.read(self, SampleTime::from(0)).await;
83 Calibration { 83 Calibration {
84 vref_cal: self.calibrated_value(), 84 vref_cal: self.calibrated_value(),
85 vref_val, 85 vref_val,
@@ -270,7 +270,8 @@ impl<'d, T: Instance> Adc<'d, T> {
270 } 270 }
271 } 271 }
272 272
273 pub async fn read(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 273 pub async fn read(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
274 self.set_sample_time(channel, sample_time).await;
274 self.set_sample_sequence(&[channel.channel()]).await; 275 self.set_sample_sequence(&[channel.channel()]).await;
275 self.convert().await 276 self.convert().await
276 } 277 }
diff --git a/embassy-stm32/src/adc/g4.rs b/embassy-stm32/src/adc/g4.rs
index 3767820cf..5066aeec0 100644
--- a/embassy-stm32/src/adc/g4.rs
+++ b/embassy-stm32/src/adc/g4.rs
@@ -168,10 +168,7 @@ impl<'d, T: Instance> Adc<'d, T> {
168 ); 168 );
169 } 169 }
170 170
171 let mut s = Self { 171 let mut s = Self { adc };
172 adc,
173 sample_time: SampleTime::from_bits(0),
174 };
175 s.power_up(); 172 s.power_up();
176 s.configure_differential_inputs(); 173 s.configure_differential_inputs();
177 174
@@ -297,7 +294,7 @@ impl<'d, T: Instance> Adc<'d, T> {
297 /// channel on the other ADC unusable. The only exception is when ADC master and the slave 294 /// channel on the other ADC unusable. The only exception is when ADC master and the slave
298 /// operate in interleaved mode. 295 /// operate in interleaved mode.
299 #[cfg(stm32g4)] 296 #[cfg(stm32g4)]
300 pub fn set_differential_channel(&mut self, ch: usize, enable: bool) { 297 fn set_differential_channel(&mut self, ch: usize, enable: bool) {
301 T::regs().cr().modify(|w| w.set_aden(false)); // disable adc 298 T::regs().cr().modify(|w| w.set_aden(false)); // disable adc
302 T::regs().difsel().modify(|w| { 299 T::regs().difsel().modify(|w| {
303 w.set_difsel( 300 w.set_difsel(
@@ -350,11 +347,6 @@ impl<'d, T: Instance> Adc<'d, T> {
350 // T::regs().cfgr2().modify(|reg| reg.set_jovse(enable)); 347 // T::regs().cfgr2().modify(|reg| reg.set_jovse(enable));
351 // } 348 // }
352 349
353 /// Set the ADC sample time.
354 pub fn set_sample_time(&mut self, sample_time: SampleTime) {
355 self.sample_time = sample_time;
356 }
357
358 /// Set the ADC resolution. 350 /// Set the ADC resolution.
359 pub fn set_resolution(&mut self, resolution: Resolution) { 351 pub fn set_resolution(&mut self, resolution: Resolution) {
360 T::regs().cfgr().modify(|reg| reg.set_res(resolution.into())); 352 T::regs().cfgr().modify(|reg| reg.set_res(resolution.into()));
@@ -380,10 +372,10 @@ impl<'d, T: Instance> Adc<'d, T> {
380 } 372 }
381 373
382 /// Read an ADC pin. 374 /// Read an ADC pin.
383 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 375 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
384 channel.setup(); 376 channel.setup();
385 377
386 self.read_channel(channel) 378 self.read_channel(channel, sample_time)
387 } 379 }
388 380
389 /// Start regular adc conversion 381 /// Start regular adc conversion
@@ -755,12 +747,10 @@ impl<'d, T: Instance> Adc<'d, T> {
755 ( 747 (
756 Self { 748 Self {
757 adc: self.adc.clone_unchecked(), 749 adc: self.adc.clone_unchecked(),
758 sample_time: self.sample_time,
759 } 750 }
760 .into_ring_buffered(dma, dma_buf, regular_sequence, regular_conversion_mode), 751 .into_ring_buffered(dma, dma_buf, regular_sequence, regular_conversion_mode),
761 Self { 752 Self {
762 adc: self.adc.clone_unchecked(), 753 adc: self.adc.clone_unchecked(),
763 sample_time: self.sample_time,
764 } 754 }
765 .setup_injected_conversions(injected_sequence, injected_trigger, injected_interrupt), 755 .setup_injected_conversions(injected_sequence, injected_trigger, injected_interrupt),
766 ) 756 )
@@ -805,8 +795,8 @@ impl<'d, T: Instance> Adc<'d, T> {
805 Self::set_channel_sample_time(channel.channel(), sample_time); 795 Self::set_channel_sample_time(channel.channel(), sample_time);
806 } 796 }
807 797
808 fn read_channel(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 798 fn read_channel(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
809 Self::configure_channel(channel, self.sample_time); 799 Self::configure_channel(channel, sample_time);
810 #[cfg(stm32h7)] 800 #[cfg(stm32h7)]
811 { 801 {
812 T::regs().cfgr2().modify(|w| w.set_lshift(0)); 802 T::regs().cfgr2().modify(|w| w.set_lshift(0));
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs
index ea7341f75..a6b796fb9 100644
--- a/embassy-stm32/src/adc/mod.rs
+++ b/embassy-stm32/src/adc/mod.rs
@@ -47,8 +47,6 @@ dma_trait!(RxDma4, adc4::Instance);
47pub struct Adc<'d, T: Instance> { 47pub struct Adc<'d, T: Instance> {
48 #[allow(unused)] 48 #[allow(unused)]
49 adc: crate::Peri<'d, T>, 49 adc: crate::Peri<'d, T>,
50 #[cfg(not(any(adc_f3v3, adc_f3v2, adc_wba)))]
51 sample_time: SampleTime,
52} 50}
53 51
54#[cfg(any(adc_f1, adc_f3v1, adc_v1, adc_l0, adc_f3v2))] 52#[cfg(any(adc_f1, adc_f3v1, adc_v1, adc_l0, adc_f3v2))]
diff --git a/embassy-stm32/src/adc/v1.rs b/embassy-stm32/src/adc/v1.rs
index a5869d110..3838cc12a 100644
--- a/embassy-stm32/src/adc/v1.rs
+++ b/embassy-stm32/src/adc/v1.rs
@@ -114,10 +114,7 @@ impl<'d, T: Instance> Adc<'d, T> {
114 T::Interrupt::enable(); 114 T::Interrupt::enable();
115 } 115 }
116 116
117 Self { 117 Self { adc }
118 adc,
119 sample_time: SampleTime::from_bits(0),
120 }
121 } 118 }
122 119
123 #[cfg(not(adc_l0))] 120 #[cfg(not(adc_l0))]
@@ -149,10 +146,6 @@ impl<'d, T: Instance> Adc<'d, T> {
149 Temperature 146 Temperature
150 } 147 }
151 148
152 pub fn set_sample_time(&mut self, sample_time: SampleTime) {
153 self.sample_time = sample_time;
154 }
155
156 pub fn set_resolution(&mut self, resolution: Resolution) { 149 pub fn set_resolution(&mut self, resolution: Resolution) {
157 T::regs().cfgr1().modify(|reg| reg.set_res(resolution.into())); 150 T::regs().cfgr1().modify(|reg| reg.set_res(resolution.into()));
158 } 151 }
@@ -163,12 +156,13 @@ impl<'d, T: Instance> Adc<'d, T> {
163 T::regs().cfgr2().modify(|reg| reg.set_ckmode(ckmode)); 156 T::regs().cfgr2().modify(|reg| reg.set_ckmode(ckmode));
164 } 157 }
165 158
166 pub async fn read(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 159 pub async fn read(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
167 let ch_num = channel.channel(); 160 let ch_num = channel.channel();
168 channel.setup(); 161 channel.setup();
169 162
170 // A.7.5 Single conversion sequence code example - Software trigger 163 // A.7.5 Single conversion sequence code example - Software trigger
171 T::regs().chselr().write(|reg| reg.set_chsel_x(ch_num as usize, true)); 164 T::regs().chselr().write(|reg| reg.set_chsel_x(ch_num as usize, true));
165 T::regs().smpr().modify(|reg| reg.set_smp(sample_time.into()));
172 166
173 self.convert().await 167 self.convert().await
174 } 168 }
@@ -179,7 +173,6 @@ impl<'d, T: Instance> Adc<'d, T> {
179 reg.set_eosmp(true); 173 reg.set_eosmp(true);
180 }); 174 });
181 175
182 T::regs().smpr().modify(|reg| reg.set_smp(self.sample_time.into()));
183 T::regs().ier().modify(|w| w.set_eocie(true)); 176 T::regs().ier().modify(|w| w.set_eocie(true));
184 T::regs().cr().modify(|reg| reg.set_adstart(true)); 177 T::regs().cr().modify(|reg| reg.set_adstart(true));
185 178
diff --git a/embassy-stm32/src/adc/v2.rs b/embassy-stm32/src/adc/v2.rs
index 90c6294d2..67721770a 100644
--- a/embassy-stm32/src/adc/v2.rs
+++ b/embassy-stm32/src/adc/v2.rs
@@ -117,10 +117,7 @@ where
117 117
118 blocking_delay_us(3); 118 blocking_delay_us(3);
119 119
120 Self { 120 Self { adc }
121 adc,
122 sample_time: SampleTime::from_bits(0),
123 }
124 } 121 }
125 122
126 /// Configures the ADC to use a DMA ring buffer for continuous data acquisition. 123 /// Configures the ADC to use a DMA ring buffer for continuous data acquisition.
@@ -137,7 +134,7 @@ where
137 self, 134 self,
138 dma: Peri<'d, impl RxDma<T>>, 135 dma: Peri<'d, impl RxDma<T>>,
139 dma_buf: &'d mut [u16], 136 dma_buf: &'d mut [u16],
140 sequence: impl ExactSizeIterator<Item = (&'a mut AnyAdcChannel<T>, SampleTime)>, 137 sequence: impl ExactSizeIterator<Item = (AnyAdcChannel<T>, SampleTime)>,
141 ) -> RingBufferedAdc<'d, T> { 138 ) -> RingBufferedAdc<'d, T> {
142 assert!(!dma_buf.is_empty() && dma_buf.len() <= 0xFFFF); 139 assert!(!dma_buf.is_empty() && dma_buf.len() <= 0xFFFF);
143 140
@@ -150,7 +147,7 @@ where
150 r.set_l((sequence.len() - 1).try_into().unwrap()); 147 r.set_l((sequence.len() - 1).try_into().unwrap());
151 }); 148 });
152 149
153 for (i, (channel, sample_time)) in sequence.enumerate() { 150 for (i, (mut channel, sample_time)) in sequence.enumerate() {
154 // Set this GPIO as an analog input. 151 // Set this GPIO as an analog input.
155 channel.setup(); 152 channel.setup();
156 153
@@ -215,10 +212,6 @@ where
215 }); 212 });
216 } 213 }
217 214
218 pub fn set_sample_time(&mut self, sample_time: SampleTime) {
219 self.sample_time = sample_time;
220 }
221
222 pub fn set_resolution(&mut self, resolution: Resolution) { 215 pub fn set_resolution(&mut self, resolution: Resolution) {
223 T::regs().cr1().modify(|reg| reg.set_res(resolution.into())); 216 T::regs().cr1().modify(|reg| reg.set_res(resolution.into()));
224 } 217 }
@@ -278,7 +271,7 @@ where
278 T::regs().dr().read().0 as u16 271 T::regs().dr().read().0 as u16
279 } 272 }
280 273
281 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 274 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
282 channel.setup(); 275 channel.setup();
283 276
284 // Configure ADC 277 // Configure ADC
@@ -288,7 +281,7 @@ where
288 T::regs().sqr3().write(|reg| reg.set_sq(0, channel)); 281 T::regs().sqr3().write(|reg| reg.set_sq(0, channel));
289 282
290 // Configure channel 283 // Configure channel
291 Self::set_channel_sample_time(channel, self.sample_time); 284 Self::set_channel_sample_time(channel, sample_time);
292 285
293 self.convert() 286 self.convert()
294 } 287 }
diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs
index 170b08a25..bbbaf73c8 100644
--- a/embassy-stm32/src/adc/v3.rs
+++ b/embassy-stm32/src/adc/v3.rs
@@ -218,10 +218,7 @@ impl<'d, T: Instance> Adc<'d, T> {
218 pub fn new(adc: Peri<'d, T>) -> Self { 218 pub fn new(adc: Peri<'d, T>) -> Self {
219 Self::init_regulator(); 219 Self::init_regulator();
220 Self::init_calibrate(); 220 Self::init_calibrate();
221 Self { 221 Self { adc }
222 adc,
223 sample_time: SampleTime::from_bits(0),
224 }
225 } 222 }
226 223
227 #[cfg(adc_g0)] 224 #[cfg(adc_g0)]
@@ -257,10 +254,7 @@ impl<'d, T: Instance> Adc<'d, T> {
257 254
258 Self::init_calibrate(); 255 Self::init_calibrate();
259 256
260 Self { 257 Self { adc }
261 adc,
262 sample_time: SampleTime::from_bits(0),
263 }
264 } 258 }
265 259
266 // Enable ADC only when it is not already running. 260 // Enable ADC only when it is not already running.
@@ -342,16 +336,6 @@ impl<'d, T: Instance> Adc<'d, T> {
342 Vbat {} 336 Vbat {}
343 } 337 }
344 338
345 /// Set the ADC sample time.
346 pub fn set_sample_time(&mut self, sample_time: SampleTime) {
347 self.sample_time = sample_time;
348 }
349
350 /// Get the ADC sample time.
351 pub fn sample_time(&self) -> SampleTime {
352 self.sample_time
353 }
354
355 /// Set the ADC resolution. 339 /// Set the ADC resolution.
356 pub fn set_resolution(&mut self, resolution: Resolution) { 340 pub fn set_resolution(&mut self, resolution: Resolution) {
357 #[cfg(not(any(adc_g0, adc_u0)))] 341 #[cfg(not(any(adc_g0, adc_u0)))]
@@ -413,8 +397,8 @@ impl<'d, T: Instance> Adc<'d, T> {
413 } 397 }
414 398
415 /// Read an ADC channel. 399 /// Read an ADC channel.
416 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 400 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
417 self.read_channel(channel) 401 self.read_channel(channel, sample_time)
418 } 402 }
419 403
420 /// Read one or multiple ADC channels using DMA. 404 /// Read one or multiple ADC channels using DMA.
@@ -616,7 +600,7 @@ impl<'d, T: Instance> Adc<'d, T> {
616 &mut self, 600 &mut self,
617 dma: Peri<'a, impl RxDma<T>>, 601 dma: Peri<'a, impl RxDma<T>>,
618 dma_buf: &'a mut [u16], 602 dma_buf: &'a mut [u16],
619 sequence: impl ExactSizeIterator<Item = (&'a mut AnyAdcChannel<T>, SampleTime)>, 603 sequence: impl ExactSizeIterator<Item = (AnyAdcChannel<T>, SampleTime)>,
620 ) -> RingBufferedAdc<'a, T> { 604 ) -> RingBufferedAdc<'a, T> {
621 assert!(!dma_buf.is_empty() && dma_buf.len() <= 0xFFFF); 605 assert!(!dma_buf.is_empty() && dma_buf.len() <= 0xFFFF);
622 assert!(sequence.len() != 0, "Asynchronous read sequence cannot be empty"); 606 assert!(sequence.len() != 0, "Asynchronous read sequence cannot be empty");
@@ -665,8 +649,8 @@ impl<'d, T: Instance> Adc<'d, T> {
665 let mut channel_mask = 0; 649 let mut channel_mask = 0;
666 650
667 // Configure channels and ranks 651 // Configure channels and ranks
668 for (_i, (channel, sample_time)) in sequence.enumerate() { 652 for (_i, (mut channel, sample_time)) in sequence.enumerate() {
669 Self::configure_channel(channel, sample_time); 653 Self::configure_channel(&mut channel, sample_time);
670 654
671 // Each channel is sampled according to sequence 655 // Each channel is sampled according to sequence
672 #[cfg(not(any(adc_g0, adc_u0)))] 656 #[cfg(not(any(adc_g0, adc_u0)))]
@@ -745,13 +729,13 @@ impl<'d, T: Instance> Adc<'d, T> {
745 Self::set_channel_sample_time(channel.channel(), sample_time); 729 Self::set_channel_sample_time(channel.channel(), sample_time);
746 } 730 }
747 731
748 fn read_channel(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 732 fn read_channel(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
749 self.enable(); 733 self.enable();
750 #[cfg(not(adc_g0))] 734 #[cfg(not(adc_g0))]
751 Self::configure_channel(channel, self.sample_time); 735 Self::configure_channel(channel, sample_time);
752 #[cfg(adc_g0)] 736 #[cfg(adc_g0)]
753 T::regs().smpr().write(|reg| { 737 T::regs().smpr().write(|reg| {
754 reg.set_sample_time(0, self.sample_time); 738 reg.set_sample_time(0, sample_time);
755 reg.set_smpsel(channel.channel().into(), Smpsel::SMP1); 739 reg.set_smpsel(channel.channel().into(), Smpsel::SMP1);
756 }); 740 });
757 // Select channel 741 // Select channel
diff --git a/embassy-stm32/src/adc/v4.rs b/embassy-stm32/src/adc/v4.rs
index c7d0103a6..cc3f8b34e 100644
--- a/embassy-stm32/src/adc/v4.rs
+++ b/embassy-stm32/src/adc/v4.rs
@@ -190,10 +190,7 @@ impl<'d, T: Instance> Adc<'d, T> {
190 }; 190 };
191 T::regs().cr().modify(|w| w.set_boost(boost)); 191 T::regs().cr().modify(|w| w.set_boost(boost));
192 } 192 }
193 let mut s = Self { 193 let mut s = Self { adc };
194 adc,
195 sample_time: SampleTime::from_bits(0),
196 };
197 s.power_up(); 194 s.power_up();
198 s.configure_differential_inputs(); 195 s.configure_differential_inputs();
199 196
@@ -277,16 +274,6 @@ impl<'d, T: Instance> Adc<'d, T> {
277 Vbat {} 274 Vbat {}
278 } 275 }
279 276
280 /// Set the ADC sample time.
281 pub fn set_sample_time(&mut self, sample_time: SampleTime) {
282 self.sample_time = sample_time;
283 }
284
285 /// Get the ADC sample time.
286 pub fn sample_time(&self) -> SampleTime {
287 self.sample_time
288 }
289
290 /// Set the ADC resolution. 277 /// Set the ADC resolution.
291 pub fn set_resolution(&mut self, resolution: Resolution) { 278 pub fn set_resolution(&mut self, resolution: Resolution) {
292 T::regs().cfgr().modify(|reg| reg.set_res(resolution.into())); 279 T::regs().cfgr().modify(|reg| reg.set_res(resolution.into()));
@@ -335,8 +322,8 @@ impl<'d, T: Instance> Adc<'d, T> {
335 } 322 }
336 323
337 /// Read an ADC channel. 324 /// Read an ADC channel.
338 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 325 pub fn blocking_read(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
339 self.read_channel(channel) 326 self.read_channel(channel, sample_time)
340 } 327 }
341 328
342 /// Read one or multiple ADC channels using DMA. 329 /// Read one or multiple ADC channels using DMA.
@@ -472,8 +459,8 @@ impl<'d, T: Instance> Adc<'d, T> {
472 } 459 }
473 } 460 }
474 461
475 fn read_channel(&mut self, channel: &mut impl AdcChannel<T>) -> u16 { 462 fn read_channel(&mut self, channel: &mut impl AdcChannel<T>, sample_time: SampleTime) -> u16 {
476 Self::configure_channel(channel, self.sample_time); 463 Self::configure_channel(channel, sample_time);
477 464
478 T::regs().sqr1().modify(|reg| { 465 T::regs().sqr1().modify(|reg| {
479 reg.set_sq(0, channel.channel()); 466 reg.set_sq(0, channel.channel());
diff --git a/embassy-stm32/src/adc/watchdog_v1.rs b/embassy-stm32/src/adc/watchdog_v1.rs
index bbe8e1971..b12e0d333 100644
--- a/embassy-stm32/src/adc/watchdog_v1.rs
+++ b/embassy-stm32/src/adc/watchdog_v1.rs
@@ -1,7 +1,7 @@
1use core::future::poll_fn; 1use core::future::poll_fn;
2use core::task::Poll; 2use core::task::Poll;
3 3
4use stm32_metapac::adc::vals::{Align, Awdsgl, Res}; 4use stm32_metapac::adc::vals::{Align, Awdsgl, Res, SampleTime};
5 5
6use crate::adc::{Adc, AdcChannel, Instance}; 6use crate::adc::{Adc, AdcChannel, Instance};
7 7
@@ -67,7 +67,7 @@ impl<'d, T: Instance> Adc<'d, T> {
67 /// let v_high = adc.monitor_watchdog().await; 67 /// let v_high = adc.monitor_watchdog().await;
68 /// info!("ADC sample is high {}", v_high); 68 /// info!("ADC sample is high {}", v_high);
69 /// ``` 69 /// ```
70 pub async fn monitor_watchdog(&mut self) -> u16 { 70 pub async fn monitor_watchdog(&mut self, sample_time: SampleTime) -> u16 {
71 assert!( 71 assert!(
72 match T::regs().cfgr1().read().awdsgl() { 72 match T::regs().cfgr1().read().awdsgl() {
73 Awdsgl::SINGLE_CHANNEL => T::regs().cfgr1().read().awdch() != 0, 73 Awdsgl::SINGLE_CHANNEL => T::regs().cfgr1().read().awdch() != 0,
@@ -76,7 +76,7 @@ impl<'d, T: Instance> Adc<'d, T> {
76 "`set_channel` should be called before `monitor`", 76 "`set_channel` should be called before `monitor`",
77 ); 77 );
78 assert!(T::regs().chselr().read().0 != 0); 78 assert!(T::regs().chselr().read().0 != 0);
79 T::regs().smpr().modify(|reg| reg.set_smp(self.sample_time.into())); 79 T::regs().smpr().modify(|reg| reg.set_smp(sample_time.into()));
80 Self::start_awd(); 80 Self::start_awd();
81 81
82 let sample = poll_fn(|cx| { 82 let sample = poll_fn(|cx| {
diff --git a/examples/stm32c0/src/bin/adc.rs b/examples/stm32c0/src/bin/adc.rs
index 1f54b0b18..b52c9e7f8 100644
--- a/examples/stm32c0/src/bin/adc.rs
+++ b/examples/stm32c0/src/bin/adc.rs
@@ -17,7 +17,7 @@ async fn main(_spawner: Spawner) {
17 info!("ADC STM32C0 example."); 17 info!("ADC STM32C0 example.");
18 18
19 // We need to set certain sample time to be able to read temp sensor. 19 // We need to set certain sample time to be able to read temp sensor.
20 let mut adc = Adc::new(p.ADC1, SampleTime::CYCLES12_5, Resolution::BITS12); 20 let mut adc = Adc::new(p.ADC1, Resolution::BITS12);
21 let mut temp = adc.enable_temperature().degrade_adc(); 21 let mut temp = adc.enable_temperature().degrade_adc();
22 let mut vref = adc.enable_vrefint().degrade_adc(); 22 let mut vref = adc.enable_vrefint().degrade_adc();
23 let mut pin0 = p.PA0.degrade_adc(); 23 let mut pin0 = p.PA0.degrade_adc();
@@ -27,9 +27,9 @@ async fn main(_spawner: Spawner) {
27 27
28 loop { 28 loop {
29 info!("============================"); 29 info!("============================");
30 let blocking_temp = adc.blocking_read(&mut temp); 30 let blocking_temp = adc.blocking_read(&mut temp, SampleTime::CYCLES12_5);
31 let blocking_vref = adc.blocking_read(&mut vref); 31 let blocking_vref = adc.blocking_read(&mut vref, SampleTime::CYCLES12_5);
32 let blocing_pin0 = adc.blocking_read(&mut pin0); 32 let blocing_pin0 = adc.blocking_read(&mut pin0, SampleTime::CYCLES12_5);
33 info!( 33 info!(
34 "Blocking ADC read: vref = {}, temp = {}, pin0 = {}.", 34 "Blocking ADC read: vref = {}, temp = {}, pin0 = {}.",
35 blocking_vref, blocking_temp, blocing_pin0 35 blocking_vref, blocking_temp, blocing_pin0
diff --git a/examples/stm32f0/src/bin/adc-watchdog.rs b/examples/stm32f0/src/bin/adc-watchdog.rs
index ff98aac8e..6879dd10a 100644
--- a/examples/stm32f0/src/bin/adc-watchdog.rs
+++ b/examples/stm32f0/src/bin/adc-watchdog.rs
@@ -3,7 +3,7 @@
3 3
4use defmt::*; 4use defmt::*;
5use embassy_executor::Spawner; 5use embassy_executor::Spawner;
6use embassy_stm32::adc::{self, Adc, WatchdogChannels}; 6use embassy_stm32::adc::{self, Adc, SampleTime, WatchdogChannels};
7use embassy_stm32::bind_interrupts; 7use embassy_stm32::bind_interrupts;
8use embassy_stm32::peripherals::ADC1; 8use embassy_stm32::peripherals::ADC1;
9use {defmt_rtt as _, panic_probe as _}; 9use {defmt_rtt as _, panic_probe as _};
@@ -23,12 +23,12 @@ async fn main(_spawner: Spawner) {
23 loop { 23 loop {
24 // Wait for pin to go high 24 // Wait for pin to go high
25 adc.init_watchdog(WatchdogChannels::from_channel(&pin), 0, 0x07F); 25 adc.init_watchdog(WatchdogChannels::from_channel(&pin), 0, 0x07F);
26 let v_high = adc.monitor_watchdog().await; 26 let v_high = adc.monitor_watchdog(SampleTime::CYCLES13_5).await;
27 info!("ADC sample is high {}", v_high); 27 info!("ADC sample is high {}", v_high);
28 28
29 // Wait for pin to go low 29 // Wait for pin to go low
30 adc.init_watchdog(WatchdogChannels::from_channel(&pin), 0x01f, 0xFFF); 30 adc.init_watchdog(WatchdogChannels::from_channel(&pin), 0x01f, 0xFFF);
31 let v_low = adc.monitor_watchdog().await; 31 let v_low = adc.monitor_watchdog(SampleTime::CYCLES13_5).await;
32 info!("ADC sample is low {}", v_low); 32 info!("ADC sample is low {}", v_low);
33 } 33 }
34} 34}
diff --git a/examples/stm32f0/src/bin/adc.rs b/examples/stm32f0/src/bin/adc.rs
index 8825e2687..fafeeffaf 100644
--- a/examples/stm32f0/src/bin/adc.rs
+++ b/examples/stm32f0/src/bin/adc.rs
@@ -19,11 +19,10 @@ async fn main(_spawner: Spawner) {
19 info!("Hello World!"); 19 info!("Hello World!");
20 20
21 let mut adc = Adc::new(p.ADC1, Irqs); 21 let mut adc = Adc::new(p.ADC1, Irqs);
22 adc.set_sample_time(SampleTime::CYCLES71_5);
23 let mut pin = p.PA1; 22 let mut pin = p.PA1;
24 23
25 let mut vrefint = adc.enable_vref(); 24 let mut vrefint = adc.enable_vref();
26 let vrefint_sample = adc.read(&mut vrefint).await; 25 let vrefint_sample = adc.read(&mut vrefint, SampleTime::CYCLES13_5).await;
27 let convert_to_millivolts = |sample| { 26 let convert_to_millivolts = |sample| {
28 // From https://www.st.com/resource/en/datasheet/stm32f031c6.pdf 27 // From https://www.st.com/resource/en/datasheet/stm32f031c6.pdf
29 // 6.3.4 Embedded reference voltage 28 // 6.3.4 Embedded reference voltage
@@ -33,7 +32,7 @@ async fn main(_spawner: Spawner) {
33 }; 32 };
34 33
35 loop { 34 loop {
36 let v = adc.read(&mut pin).await; 35 let v = adc.read(&mut pin, SampleTime::CYCLES13_5).await;
37 info!("--> {} - {} mV", v, convert_to_millivolts(v)); 36 info!("--> {} - {} mV", v, convert_to_millivolts(v));
38 Timer::after_millis(100).await; 37 Timer::after_millis(100).await;
39 } 38 }
diff --git a/examples/stm32f1/src/bin/adc.rs b/examples/stm32f1/src/bin/adc.rs
index 541ff159e..2451aee3d 100644
--- a/examples/stm32f1/src/bin/adc.rs
+++ b/examples/stm32f1/src/bin/adc.rs
@@ -3,7 +3,7 @@
3 3
4use defmt::*; 4use defmt::*;
5use embassy_executor::Spawner; 5use embassy_executor::Spawner;
6use embassy_stm32::adc::Adc; 6use embassy_stm32::adc::{Adc, SampleTime};
7use embassy_stm32::peripherals::ADC1; 7use embassy_stm32::peripherals::ADC1;
8use embassy_stm32::{adc, bind_interrupts}; 8use embassy_stm32::{adc, bind_interrupts};
9use embassy_time::Timer; 9use embassy_time::Timer;
@@ -22,7 +22,7 @@ async fn main(_spawner: Spawner) {
22 let mut pin = p.PB1; 22 let mut pin = p.PB1;
23 23
24 let mut vrefint = adc.enable_vref(); 24 let mut vrefint = adc.enable_vref();
25 let vrefint_sample = adc.read(&mut vrefint).await; 25 let vrefint_sample = adc.read(&mut vrefint, SampleTime::CYCLES13_5).await;
26 let convert_to_millivolts = |sample| { 26 let convert_to_millivolts = |sample| {
27 // From http://www.st.com/resource/en/datasheet/CD00161566.pdf 27 // From http://www.st.com/resource/en/datasheet/CD00161566.pdf
28 // 5.3.4 Embedded reference voltage 28 // 5.3.4 Embedded reference voltage
@@ -32,7 +32,7 @@ async fn main(_spawner: Spawner) {
32 }; 32 };
33 33
34 loop { 34 loop {
35 let v = adc.read(&mut pin).await; 35 let v = adc.read(&mut pin, SampleTime::CYCLES13_5).await;
36 info!("--> {} - {} mV", v, convert_to_millivolts(v)); 36 info!("--> {} - {} mV", v, convert_to_millivolts(v));
37 Timer::after_millis(100).await; 37 Timer::after_millis(100).await;
38 } 38 }
diff --git a/examples/stm32f334/src/bin/adc.rs b/examples/stm32f334/src/bin/adc.rs
index a993b00ca..a420c8876 100644
--- a/examples/stm32f334/src/bin/adc.rs
+++ b/examples/stm32f334/src/bin/adc.rs
@@ -40,21 +40,19 @@ async fn main(_spawner: Spawner) -> ! {
40 40
41 let mut adc = Adc::new(p.ADC1, Irqs); 41 let mut adc = Adc::new(p.ADC1, Irqs);
42 42
43 adc.set_sample_time(SampleTime::CYCLES601_5);
44
45 info!("enable vrefint..."); 43 info!("enable vrefint...");
46 44
47 let mut vrefint = adc.enable_vref(); 45 let mut vrefint = adc.enable_vref();
48 let mut temperature = adc.enable_temperature(); 46 let mut temperature = adc.enable_temperature();
49 47
50 loop { 48 loop {
51 let vref = adc.read(&mut vrefint).await; 49 let vref = adc.read(&mut vrefint, SampleTime::CYCLES601_5).await;
52 info!("read vref: {} (should be {})", vref, vrefint.value()); 50 info!("read vref: {} (should be {})", vref, vrefint.value());
53 51
54 let temp = adc.read(&mut temperature).await; 52 let temp = adc.read(&mut temperature, SampleTime::CYCLES601_5).await;
55 info!("read temperature: {}", temp); 53 info!("read temperature: {}", temp);
56 54
57 let pin = adc.read(&mut p.PA0).await; 55 let pin = adc.read(&mut p.PA0, SampleTime::CYCLES601_5).await;
58 info!("read pin: {}", pin); 56 info!("read pin: {}", pin);
59 57
60 let pin_mv = (pin as u32 * vrefint.value() as u32 / vref as u32) * 3300 / 4095; 58 let pin_mv = (pin as u32 * vrefint.value() as u32 / vref as u32) * 3300 / 4095;
diff --git a/examples/stm32f334/src/bin/opamp.rs b/examples/stm32f334/src/bin/opamp.rs
index 3e621f2a1..ddefdd03d 100644
--- a/examples/stm32f334/src/bin/opamp.rs
+++ b/examples/stm32f334/src/bin/opamp.rs
@@ -42,8 +42,6 @@ async fn main(_spawner: Spawner) -> ! {
42 let mut adc = Adc::new(p.ADC2, Irqs); 42 let mut adc = Adc::new(p.ADC2, Irqs);
43 let mut opamp = OpAmp::new(p.OPAMP2); 43 let mut opamp = OpAmp::new(p.OPAMP2);
44 44
45 adc.set_sample_time(SampleTime::CYCLES601_5);
46
47 info!("enable vrefint..."); 45 info!("enable vrefint...");
48 46
49 let mut vrefint = adc.enable_vref(); 47 let mut vrefint = adc.enable_vref();
@@ -51,13 +49,13 @@ async fn main(_spawner: Spawner) -> ! {
51 let mut buffer = opamp.buffer_ext(p.PA7.reborrow(), p.PA6.reborrow()); 49 let mut buffer = opamp.buffer_ext(p.PA7.reborrow(), p.PA6.reborrow());
52 50
53 loop { 51 loop {
54 let vref = adc.read(&mut vrefint).await; 52 let vref = adc.read(&mut vrefint, SampleTime::CYCLES601_5).await;
55 info!("read vref: {} (should be {})", vref, vrefint.value()); 53 info!("read vref: {} (should be {})", vref, vrefint.value());
56 54
57 let temp = adc.read(&mut temperature).await; 55 let temp = adc.read(&mut temperature, SampleTime::CYCLES601_5).await;
58 info!("read temperature: {}", temp); 56 info!("read temperature: {}", temp);
59 57
60 let buffer = adc.read(&mut buffer).await; 58 let buffer = adc.read(&mut buffer, SampleTime::CYCLES601_5).await;
61 info!("read buffer: {}", buffer); 59 info!("read buffer: {}", buffer);
62 60
63 let pin_mv = (buffer as u32 * vrefint.value() as u32 / vref as u32) * 3300 / 4095; 61 let pin_mv = (buffer as u32 * vrefint.value() as u32 / vref as u32) * 3300 / 4095;
diff --git a/examples/stm32f4/src/bin/adc.rs b/examples/stm32f4/src/bin/adc.rs
index 423d29225..5628cb827 100644
--- a/examples/stm32f4/src/bin/adc.rs
+++ b/examples/stm32f4/src/bin/adc.rs
@@ -4,7 +4,7 @@
4use cortex_m::prelude::_embedded_hal_blocking_delay_DelayUs; 4use cortex_m::prelude::_embedded_hal_blocking_delay_DelayUs;
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::adc::{Adc, Temperature, VrefInt}; 7use embassy_stm32::adc::{Adc, SampleTime, Temperature, VrefInt};
8use embassy_time::{Delay, Timer}; 8use embassy_time::{Delay, Timer};
9use {defmt_rtt as _, panic_probe as _}; 9use {defmt_rtt as _, panic_probe as _};
10 10
@@ -23,7 +23,7 @@ async fn main(_spawner: Spawner) {
23 // Startup delay can be combined to the maximum of either 23 // Startup delay can be combined to the maximum of either
24 delay.delay_us(Temperature::start_time_us().max(VrefInt::start_time_us())); 24 delay.delay_us(Temperature::start_time_us().max(VrefInt::start_time_us()));
25 25
26 let vrefint_sample = adc.blocking_read(&mut vrefint); 26 let vrefint_sample = adc.blocking_read(&mut vrefint, SampleTime::CYCLES112);
27 27
28 let convert_to_millivolts = |sample| { 28 let convert_to_millivolts = |sample| {
29 // From http://www.st.com/resource/en/datasheet/DM00071990.pdf 29 // From http://www.st.com/resource/en/datasheet/DM00071990.pdf
@@ -50,16 +50,16 @@ async fn main(_spawner: Spawner) {
50 50
51 loop { 51 loop {
52 // Read pin 52 // Read pin
53 let v = adc.blocking_read(&mut pin); 53 let v = adc.blocking_read(&mut pin, SampleTime::CYCLES112);
54 info!("PC1: {} ({} mV)", v, convert_to_millivolts(v)); 54 info!("PC1: {} ({} mV)", v, convert_to_millivolts(v));
55 55
56 // Read internal temperature 56 // Read internal temperature
57 let v = adc.blocking_read(&mut temp); 57 let v = adc.blocking_read(&mut temp, SampleTime::CYCLES112);
58 let celcius = convert_to_celcius(v); 58 let celcius = convert_to_celcius(v);
59 info!("Internal temp: {} ({} C)", v, celcius); 59 info!("Internal temp: {} ({} C)", v, celcius);
60 60
61 // Read internal voltage reference 61 // Read internal voltage reference
62 let v = adc.blocking_read(&mut vrefint); 62 let v = adc.blocking_read(&mut vrefint, SampleTime::CYCLES112);
63 info!("VrefInt: {}", v); 63 info!("VrefInt: {}", v);
64 64
65 Timer::after_millis(100).await; 65 Timer::after_millis(100).await;
diff --git a/examples/stm32f4/src/bin/adc_dma.rs b/examples/stm32f4/src/bin/adc_dma.rs
index f8da91336..01b881c79 100644
--- a/examples/stm32f4/src/bin/adc_dma.rs
+++ b/examples/stm32f4/src/bin/adc_dma.rs
@@ -27,8 +27,8 @@ async fn adc_task(p: Peripherals) {
27 p.DMA2_CH0, 27 p.DMA2_CH0,
28 adc_data, 28 adc_data,
29 [ 29 [
30 (&mut p.PA0.degrade_adc(), SampleTime::CYCLES112), 30 (p.PA0.degrade_adc(), SampleTime::CYCLES112),
31 (&mut p.PA2.degrade_adc(), SampleTime::CYCLES112), 31 (p.PA2.degrade_adc(), SampleTime::CYCLES112),
32 ] 32 ]
33 .into_iter(), 33 .into_iter(),
34 ); 34 );
@@ -36,8 +36,8 @@ async fn adc_task(p: Peripherals) {
36 p.DMA2_CH2, 36 p.DMA2_CH2,
37 adc_data2, 37 adc_data2,
38 [ 38 [
39 (&mut p.PA1.degrade_adc(), SampleTime::CYCLES112), 39 (p.PA1.degrade_adc(), SampleTime::CYCLES112),
40 (&mut p.PA3.degrade_adc(), SampleTime::CYCLES112), 40 (p.PA3.degrade_adc(), SampleTime::CYCLES112),
41 ] 41 ]
42 .into_iter(), 42 .into_iter(),
43 ); 43 );
diff --git a/examples/stm32f7/src/bin/adc.rs b/examples/stm32f7/src/bin/adc.rs
index 6689e3b5d..0f226d34e 100644
--- a/examples/stm32f7/src/bin/adc.rs
+++ b/examples/stm32f7/src/bin/adc.rs
@@ -3,7 +3,7 @@
3 3
4use defmt::*; 4use defmt::*;
5use embassy_executor::Spawner; 5use embassy_executor::Spawner;
6use embassy_stm32::adc::Adc; 6use embassy_stm32::adc::{Adc, SampleTime};
7use embassy_time::Timer; 7use embassy_time::Timer;
8use {defmt_rtt as _, panic_probe as _}; 8use {defmt_rtt as _, panic_probe as _};
9 9
@@ -16,7 +16,7 @@ async fn main(_spawner: Spawner) {
16 let mut pin = p.PA3; 16 let mut pin = p.PA3;
17 17
18 let mut vrefint = adc.enable_vrefint(); 18 let mut vrefint = adc.enable_vrefint();
19 let vrefint_sample = adc.blocking_read(&mut vrefint); 19 let vrefint_sample = adc.blocking_read(&mut vrefint, SampleTime::CYCLES112);
20 let convert_to_millivolts = |sample| { 20 let convert_to_millivolts = |sample| {
21 // From http://www.st.com/resource/en/datasheet/DM00273119.pdf 21 // From http://www.st.com/resource/en/datasheet/DM00273119.pdf
22 // 6.3.27 Reference voltage 22 // 6.3.27 Reference voltage
@@ -26,7 +26,7 @@ async fn main(_spawner: Spawner) {
26 }; 26 };
27 27
28 loop { 28 loop {
29 let v = adc.blocking_read(&mut pin); 29 let v = adc.blocking_read(&mut pin, SampleTime::CYCLES112);
30 info!("--> {} - {} mV", v, convert_to_millivolts(v)); 30 info!("--> {} - {} mV", v, convert_to_millivolts(v));
31 Timer::after_millis(100).await; 31 Timer::after_millis(100).await;
32 } 32 }
diff --git a/examples/stm32g0/src/bin/adc.rs b/examples/stm32g0/src/bin/adc.rs
index 7d8653ef2..972e43b55 100644
--- a/examples/stm32g0/src/bin/adc.rs
+++ b/examples/stm32g0/src/bin/adc.rs
@@ -13,11 +13,10 @@ async fn main(_spawner: Spawner) {
13 info!("Hello World!"); 13 info!("Hello World!");
14 14
15 let mut adc = Adc::new_with_clock(p.ADC1, Clock::Async { div: Presc::DIV1 }); 15 let mut adc = Adc::new_with_clock(p.ADC1, Clock::Async { div: Presc::DIV1 });
16 adc.set_sample_time(SampleTime::CYCLES79_5);
17 let mut pin = p.PA1; 16 let mut pin = p.PA1;
18 17
19 let mut vrefint = adc.enable_vrefint(); 18 let mut vrefint = adc.enable_vrefint();
20 let vrefint_sample = adc.blocking_read(&mut vrefint); 19 let vrefint_sample = adc.blocking_read(&mut vrefint, SampleTime::CYCLES79_5);
21 let convert_to_millivolts = |sample| { 20 let convert_to_millivolts = |sample| {
22 // From https://www.st.com/resource/en/datasheet/stm32g031g8.pdf 21 // From https://www.st.com/resource/en/datasheet/stm32g031g8.pdf
23 // 6.3.3 Embedded internal reference voltage 22 // 6.3.3 Embedded internal reference voltage
@@ -27,7 +26,7 @@ async fn main(_spawner: Spawner) {
27 }; 26 };
28 27
29 loop { 28 loop {
30 let v = adc.blocking_read(&mut pin); 29 let v = adc.blocking_read(&mut pin, SampleTime::CYCLES79_5);
31 info!("--> {} - {} mV", v, convert_to_millivolts(v)); 30 info!("--> {} - {} mV", v, convert_to_millivolts(v));
32 Timer::after_millis(100).await; 31 Timer::after_millis(100).await;
33 } 32 }
diff --git a/examples/stm32g0/src/bin/adc_oversampling.rs b/examples/stm32g0/src/bin/adc_oversampling.rs
index 834d1cd4a..f6979889d 100644
--- a/examples/stm32g0/src/bin/adc_oversampling.rs
+++ b/examples/stm32g0/src/bin/adc_oversampling.rs
@@ -17,7 +17,6 @@ async fn main(_spawner: Spawner) {
17 info!("Adc oversample test"); 17 info!("Adc oversample test");
18 18
19 let mut adc = Adc::new_with_clock(p.ADC1, Clock::Async { div: Presc::DIV1 }); 19 let mut adc = Adc::new_with_clock(p.ADC1, Clock::Async { div: Presc::DIV1 });
20 adc.set_sample_time(SampleTime::CYCLES1_5);
21 let mut pin = p.PA1; 20 let mut pin = p.PA1;
22 21
23 adc.set_oversampling_ratio(Ovsr::MUL16); 22 adc.set_oversampling_ratio(Ovsr::MUL16);
@@ -25,7 +24,7 @@ async fn main(_spawner: Spawner) {
25 adc.oversampling_enable(true); 24 adc.oversampling_enable(true);
26 25
27 loop { 26 loop {
28 let v = adc.blocking_read(&mut pin); 27 let v = adc.blocking_read(&mut pin, SampleTime::CYCLES1_5);
29 info!("--> {} ", v); //max 65520 = 0xFFF0 28 info!("--> {} ", v); //max 65520 = 0xFFF0
30 Timer::after_millis(100).await; 29 Timer::after_millis(100).await;
31 } 30 }
diff --git a/examples/stm32g4/src/bin/adc.rs b/examples/stm32g4/src/bin/adc.rs
index 920142a18..695f37115 100644
--- a/examples/stm32g4/src/bin/adc.rs
+++ b/examples/stm32g4/src/bin/adc.rs
@@ -29,10 +29,9 @@ async fn main(_spawner: Spawner) {
29 info!("Hello World!"); 29 info!("Hello World!");
30 30
31 let mut adc = Adc::new(p.ADC2); 31 let mut adc = Adc::new(p.ADC2);
32 adc.set_sample_time(SampleTime::CYCLES24_5);
33 32
34 loop { 33 loop {
35 let measured = adc.blocking_read(&mut p.PA7); 34 let measured = adc.blocking_read(&mut p.PA7, SampleTime::CYCLES24_5);
36 info!("measured: {}", measured); 35 info!("measured: {}", measured);
37 Timer::after_millis(500).await; 36 Timer::after_millis(500).await;
38 } 37 }
diff --git a/examples/stm32g4/src/bin/adc_differential.rs b/examples/stm32g4/src/bin/adc_differential.rs
index 301f0da84..a6e2f7d33 100644
--- a/examples/stm32g4/src/bin/adc_differential.rs
+++ b/examples/stm32g4/src/bin/adc_differential.rs
@@ -33,14 +33,13 @@ async fn main(_spawner: Spawner) {
33 let mut p = embassy_stm32::init(config); 33 let mut p = embassy_stm32::init(config);
34 34
35 let mut adc = Adc::new(p.ADC1); 35 let mut adc = Adc::new(p.ADC1);
36 adc.set_sample_time(SampleTime::CYCLES247_5);
37 adc.set_differential(&mut p.PA0, true); //p:pa0,n:pa1 36 adc.set_differential(&mut p.PA0, true); //p:pa0,n:pa1
38 37
39 // can also use 38 // can also use
40 // adc.set_differential_channel(1, true); 39 // adc.set_differential_channel(1, true);
41 info!("adc initialized"); 40 info!("adc initialized");
42 loop { 41 loop {
43 let measured = adc.blocking_read(&mut p.PA0); 42 let measured = adc.blocking_read(&mut p.PA0, SampleTime::CYCLES247_5);
44 info!("data: {}", measured); 43 info!("data: {}", measured);
45 Timer::after_millis(500).await; 44 Timer::after_millis(500).await;
46 } 45 }
diff --git a/examples/stm32g4/src/bin/adc_oversampling.rs b/examples/stm32g4/src/bin/adc_oversampling.rs
index 1e464183a..cb99ab2a7 100644
--- a/examples/stm32g4/src/bin/adc_oversampling.rs
+++ b/examples/stm32g4/src/bin/adc_oversampling.rs
@@ -33,7 +33,6 @@ async fn main(_spawner: Spawner) {
33 let mut p = embassy_stm32::init(config); 33 let mut p = embassy_stm32::init(config);
34 34
35 let mut adc = Adc::new(p.ADC1); 35 let mut adc = Adc::new(p.ADC1);
36 adc.set_sample_time(SampleTime::CYCLES6_5);
37 // From https://www.st.com/resource/en/reference_manual/rm0440-stm32g4-series-advanced-armbased-32bit-mcus-stmicroelectronics.pdf 36 // From https://www.st.com/resource/en/reference_manual/rm0440-stm32g4-series-advanced-armbased-32bit-mcus-stmicroelectronics.pdf
38 // page652 Oversampler 37 // page652 Oversampler
39 // Table 172. Maximum output results vs N and M. Grayed values indicates truncation 38 // Table 172. Maximum output results vs N and M. Grayed values indicates truncation
@@ -50,7 +49,7 @@ async fn main(_spawner: Spawner) {
50 adc.enable_regular_oversampling_mode(Rovsm::RESUMED, Trovs::AUTOMATIC, true); 49 adc.enable_regular_oversampling_mode(Rovsm::RESUMED, Trovs::AUTOMATIC, true);
51 50
52 loop { 51 loop {
53 let measured = adc.blocking_read(&mut p.PA0); 52 let measured = adc.blocking_read(&mut p.PA0, SampleTime::CYCLES6_5);
54 info!("data: 0x{:X}", measured); //max 0xFFF0 -> 65520 53 info!("data: 0x{:X}", measured); //max 0xFFF0 -> 65520
55 Timer::after_millis(500).await; 54 Timer::after_millis(500).await;
56 } 55 }
diff --git a/examples/stm32h5/src/bin/adc.rs b/examples/stm32h5/src/bin/adc.rs
index 0566320d4..c919b1a95 100644
--- a/examples/stm32h5/src/bin/adc.rs
+++ b/examples/stm32h5/src/bin/adc.rs
@@ -45,14 +45,12 @@ async fn main(_spawner: Spawner) {
45 45
46 let mut adc = Adc::new(p.ADC1); 46 let mut adc = Adc::new(p.ADC1);
47 47
48 adc.set_sample_time(SampleTime::CYCLES24_5);
49
50 let mut vrefint_channel = adc.enable_vrefint(); 48 let mut vrefint_channel = adc.enable_vrefint();
51 49
52 loop { 50 loop {
53 let vrefint = adc.blocking_read(&mut vrefint_channel); 51 let vrefint = adc.blocking_read(&mut vrefint_channel, SampleTime::CYCLES24_5);
54 info!("vrefint: {}", vrefint); 52 info!("vrefint: {}", vrefint);
55 let measured = adc.blocking_read(&mut p.PA0); 53 let measured = adc.blocking_read(&mut p.PA0, SampleTime::CYCLES24_5);
56 info!("measured: {}", measured); 54 info!("measured: {}", measured);
57 Timer::after_millis(500).await; 55 Timer::after_millis(500).await;
58 } 56 }
diff --git a/examples/stm32h7/src/bin/adc.rs b/examples/stm32h7/src/bin/adc.rs
index a53c9d8d5..fc45541bf 100644
--- a/examples/stm32h7/src/bin/adc.rs
+++ b/examples/stm32h7/src/bin/adc.rs
@@ -46,14 +46,12 @@ async fn main(_spawner: Spawner) {
46 46
47 let mut adc = Adc::new(p.ADC3); 47 let mut adc = Adc::new(p.ADC3);
48 48
49 adc.set_sample_time(SampleTime::CYCLES32_5);
50
51 let mut vrefint_channel = adc.enable_vrefint(); 49 let mut vrefint_channel = adc.enable_vrefint();
52 50
53 loop { 51 loop {
54 let vrefint = adc.blocking_read(&mut vrefint_channel); 52 let vrefint = adc.blocking_read(&mut vrefint_channel, SampleTime::CYCLES32_5);
55 info!("vrefint: {}", vrefint); 53 info!("vrefint: {}", vrefint);
56 let measured = adc.blocking_read(&mut p.PC0); 54 let measured = adc.blocking_read(&mut p.PC0, SampleTime::CYCLES32_5);
57 info!("measured: {}", measured); 55 info!("measured: {}", measured);
58 Timer::after_millis(500).await; 56 Timer::after_millis(500).await;
59 } 57 }
diff --git a/examples/stm32l0/src/bin/adc.rs b/examples/stm32l0/src/bin/adc.rs
index 9dd09bc45..83be74ed9 100644
--- a/examples/stm32l0/src/bin/adc.rs
+++ b/examples/stm32l0/src/bin/adc.rs
@@ -19,11 +19,10 @@ async fn main(_spawner: Spawner) {
19 info!("Hello World!"); 19 info!("Hello World!");
20 20
21 let mut adc = Adc::new(p.ADC1, Irqs); 21 let mut adc = Adc::new(p.ADC1, Irqs);
22 adc.set_sample_time(SampleTime::CYCLES79_5);
23 let mut pin = p.PA1; 22 let mut pin = p.PA1;
24 23
25 let mut vrefint = adc.enable_vref(); 24 let mut vrefint = adc.enable_vref();
26 let vrefint_sample = adc.read(&mut vrefint).await; 25 let vrefint_sample = adc.read(&mut vrefint, SampleTime::CYCLES79_5).await;
27 let convert_to_millivolts = |sample| { 26 let convert_to_millivolts = |sample| {
28 // From https://www.st.com/resource/en/datasheet/stm32l051c6.pdf 27 // From https://www.st.com/resource/en/datasheet/stm32l051c6.pdf
29 // 6.3.3 Embedded internal reference voltage 28 // 6.3.3 Embedded internal reference voltage
@@ -33,7 +32,7 @@ async fn main(_spawner: Spawner) {
33 }; 32 };
34 33
35 loop { 34 loop {
36 let v = adc.read(&mut pin).await; 35 let v = adc.read(&mut pin, SampleTime::CYCLES79_5).await;
37 info!("--> {} - {} mV", v, convert_to_millivolts(v)); 36 info!("--> {} - {} mV", v, convert_to_millivolts(v));
38 Timer::after_millis(100).await; 37 Timer::after_millis(100).await;
39 } 38 }
diff --git a/examples/stm32l4/src/bin/adc.rs b/examples/stm32l4/src/bin/adc.rs
index 40e907940..835bf5411 100644
--- a/examples/stm32l4/src/bin/adc.rs
+++ b/examples/stm32l4/src/bin/adc.rs
@@ -3,7 +3,7 @@
3 3
4use defmt::*; 4use defmt::*;
5use embassy_stm32::Config; 5use embassy_stm32::Config;
6use embassy_stm32::adc::{Adc, Resolution}; 6use embassy_stm32::adc::{Adc, Resolution, SampleTime};
7use {defmt_rtt as _, panic_probe as _}; 7use {defmt_rtt as _, panic_probe as _};
8 8
9#[cortex_m_rt::entry] 9#[cortex_m_rt::entry]
@@ -23,7 +23,7 @@ fn main() -> ! {
23 let mut channel = p.PC0; 23 let mut channel = p.PC0;
24 24
25 loop { 25 loop {
26 let v = adc.blocking_read(&mut channel); 26 let v = adc.blocking_read(&mut channel, SampleTime::from_bits(0));
27 info!("--> {}", v); 27 info!("--> {}", v);
28 } 28 }
29} 29}
diff --git a/examples/stm32l4/src/bin/adc_dma.rs b/examples/stm32l4/src/bin/adc_dma.rs
index 7a9200edd..ab1e9d2e9 100644
--- a/examples/stm32l4/src/bin/adc_dma.rs
+++ b/examples/stm32l4/src/bin/adc_dma.rs
@@ -21,18 +21,14 @@ async fn main(_spawner: Spawner) {
21 let p = embassy_stm32::init(config); 21 let p = embassy_stm32::init(config);
22 22
23 let mut adc = Adc::new(p.ADC1); 23 let mut adc = Adc::new(p.ADC1);
24 let mut adc_pin0 = p.PA0.degrade_adc(); 24 let adc_pin0 = p.PA0.degrade_adc();
25 let mut adc_pin1 = p.PA1.degrade_adc(); 25 let adc_pin1 = p.PA1.degrade_adc();
26 let mut adc_dma_buf = [0u16; DMA_BUF_LEN]; 26 let mut adc_dma_buf = [0u16; DMA_BUF_LEN];
27 let mut measurements = [0u16; DMA_BUF_LEN / 2]; 27 let mut measurements = [0u16; DMA_BUF_LEN / 2];
28 let mut ring_buffered_adc = adc.into_ring_buffered( 28 let mut ring_buffered_adc = adc.into_ring_buffered(
29 p.DMA1_CH1, 29 p.DMA1_CH1,
30 &mut adc_dma_buf, 30 &mut adc_dma_buf,
31 [ 31 [(adc_pin0, SampleTime::CYCLES640_5), (adc_pin1, SampleTime::CYCLES640_5)].into_iter(),
32 (&mut adc_pin0, SampleTime::CYCLES640_5),
33 (&mut adc_pin1, SampleTime::CYCLES640_5),
34 ]
35 .into_iter(),
36 ); 32 );
37 33
38 info!("starting measurement loop"); 34 info!("starting measurement loop");
diff --git a/examples/stm32u0/src/bin/adc.rs b/examples/stm32u0/src/bin/adc.rs
index 32a54299d..4fbc6f17f 100644
--- a/examples/stm32u0/src/bin/adc.rs
+++ b/examples/stm32u0/src/bin/adc.rs
@@ -3,7 +3,7 @@
3 3
4use defmt::*; 4use defmt::*;
5use embassy_stm32::Config; 5use embassy_stm32::Config;
6use embassy_stm32::adc::{Adc, Resolution}; 6use embassy_stm32::adc::{Adc, Resolution, SampleTime};
7use embassy_time::Duration; 7use embassy_time::Duration;
8use {defmt_rtt as _, panic_probe as _}; 8use {defmt_rtt as _, panic_probe as _};
9 9
@@ -23,7 +23,7 @@ fn main() -> ! {
23 let mut channel = p.PC0; 23 let mut channel = p.PC0;
24 24
25 loop { 25 loop {
26 let v = adc.blocking_read(&mut channel); 26 let v = adc.blocking_read(&mut channel, SampleTime::CYCLES12_5);
27 info!("--> {}", v); 27 info!("--> {}", v);
28 embassy_time::block_for(Duration::from_millis(200)); 28 embassy_time::block_for(Duration::from_millis(200));
29 } 29 }
diff --git a/examples/stm32u5/src/bin/adc.rs b/examples/stm32u5/src/bin/adc.rs
index 91e33053e..99944f7c7 100644
--- a/examples/stm32u5/src/bin/adc.rs
+++ b/examples/stm32u5/src/bin/adc.rs
@@ -2,8 +2,7 @@
2#![no_main] 2#![no_main]
3 3
4use defmt::*; 4use defmt::*;
5use embassy_stm32::adc; 5use embassy_stm32::adc::{self, AdcChannel, SampleTime, adc4};
6use embassy_stm32::adc::{AdcChannel, adc4};
7use {defmt_rtt as _, panic_probe as _}; 6use {defmt_rtt as _, panic_probe as _};
8 7
9#[embassy_executor::main] 8#[embassy_executor::main]
@@ -18,7 +17,6 @@ async fn main(_spawner: embassy_executor::Spawner) {
18 let mut adc1_pin2 = p.PA2; // A1 17 let mut adc1_pin2 = p.PA2; // A1
19 adc1.set_resolution(adc::Resolution::BITS14); 18 adc1.set_resolution(adc::Resolution::BITS14);
20 adc1.set_averaging(adc::Averaging::Samples1024); 19 adc1.set_averaging(adc::Averaging::Samples1024);
21 adc1.set_sample_time(adc::SampleTime::CYCLES160_5);
22 let max1 = adc::resolution_to_max_count(adc::Resolution::BITS14); 20 let max1 = adc::resolution_to_max_count(adc::Resolution::BITS14);
23 21
24 // **** ADC2 init **** 22 // **** ADC2 init ****
@@ -27,7 +25,6 @@ async fn main(_spawner: embassy_executor::Spawner) {
27 let mut adc2_pin2 = p.PB0; // A3 25 let mut adc2_pin2 = p.PB0; // A3
28 adc2.set_resolution(adc::Resolution::BITS14); 26 adc2.set_resolution(adc::Resolution::BITS14);
29 adc2.set_averaging(adc::Averaging::Samples1024); 27 adc2.set_averaging(adc::Averaging::Samples1024);
30 adc2.set_sample_time(adc::SampleTime::CYCLES160_5);
31 let max2 = adc::resolution_to_max_count(adc::Resolution::BITS14); 28 let max2 = adc::resolution_to_max_count(adc::Resolution::BITS14);
32 29
33 // **** ADC4 init **** 30 // **** ADC4 init ****
@@ -36,33 +33,32 @@ async fn main(_spawner: embassy_executor::Spawner) {
36 let mut adc4_pin2 = p.PC0; // A5 33 let mut adc4_pin2 = p.PC0; // A5
37 adc4.set_resolution(adc4::Resolution::BITS12); 34 adc4.set_resolution(adc4::Resolution::BITS12);
38 adc4.set_averaging(adc4::Averaging::Samples256); 35 adc4.set_averaging(adc4::Averaging::Samples256);
39 adc4.set_sample_time(adc4::SampleTime::CYCLES1_5);
40 let max4 = adc4::resolution_to_max_count(adc4::Resolution::BITS12); 36 let max4 = adc4::resolution_to_max_count(adc4::Resolution::BITS12);
41 37
42 // **** ADC1 blocking read **** 38 // **** ADC1 blocking read ****
43 let raw: u16 = adc1.blocking_read(&mut adc1_pin1); 39 let raw: u16 = adc1.blocking_read(&mut adc1_pin1, SampleTime::CYCLES160_5);
44 let volt: f32 = 3.3 * raw as f32 / max1 as f32; 40 let volt: f32 = 3.3 * raw as f32 / max1 as f32;
45 info!("Read adc1 pin 1 {}", volt); 41 info!("Read adc1 pin 1 {}", volt);
46 42
47 let raw: u16 = adc1.blocking_read(&mut adc1_pin2); 43 let raw: u16 = adc1.blocking_read(&mut adc1_pin2, SampleTime::CYCLES160_5);
48 let volt: f32 = 3.3 * raw as f32 / max1 as f32; 44 let volt: f32 = 3.3 * raw as f32 / max1 as f32;
49 info!("Read adc1 pin 2 {}", volt); 45 info!("Read adc1 pin 2 {}", volt);
50 46
51 // **** ADC2 blocking read **** 47 // **** ADC2 blocking read ****
52 let raw: u16 = adc2.blocking_read(&mut adc2_pin1); 48 let raw: u16 = adc2.blocking_read(&mut adc2_pin1, SampleTime::CYCLES160_5);
53 let volt: f32 = 3.3 * raw as f32 / max2 as f32; 49 let volt: f32 = 3.3 * raw as f32 / max2 as f32;
54 info!("Read adc2 pin 1 {}", volt); 50 info!("Read adc2 pin 1 {}", volt);
55 51
56 let raw: u16 = adc2.blocking_read(&mut adc2_pin2); 52 let raw: u16 = adc2.blocking_read(&mut adc2_pin2, SampleTime::CYCLES160_5);
57 let volt: f32 = 3.3 * raw as f32 / max2 as f32; 53 let volt: f32 = 3.3 * raw as f32 / max2 as f32;
58 info!("Read adc2 pin 2 {}", volt); 54 info!("Read adc2 pin 2 {}", volt);
59 55
60 // **** ADC4 blocking read **** 56 // **** ADC4 blocking read ****
61 let raw: u16 = adc4.blocking_read(&mut adc4_pin1); 57 let raw: u16 = adc4.blocking_read(&mut adc4_pin1, adc4::SampleTime::CYCLES1_5);
62 let volt: f32 = 3.3 * raw as f32 / max4 as f32; 58 let volt: f32 = 3.3 * raw as f32 / max4 as f32;
63 info!("Read adc4 pin 1 {}", volt); 59 info!("Read adc4 pin 1 {}", volt);
64 60
65 let raw: u16 = adc4.blocking_read(&mut adc4_pin2); 61 let raw: u16 = adc4.blocking_read(&mut adc4_pin2, adc4::SampleTime::CYCLES1_5);
66 let volt: f32 = 3.3 * raw as f32 / max4 as f32; 62 let volt: f32 = 3.3 * raw as f32 / max4 as f32;
67 info!("Read adc4 pin 2 {}", volt); 63 info!("Read adc4 pin 2 {}", volt);
68 64
diff --git a/examples/stm32wba/src/bin/adc.rs b/examples/stm32wba/src/bin/adc.rs
index 8c80470b8..177aab3f3 100644
--- a/examples/stm32wba/src/bin/adc.rs
+++ b/examples/stm32wba/src/bin/adc.rs
@@ -17,15 +17,15 @@ async fn main(_spawner: embassy_executor::Spawner) {
17 let mut adc4_pin2 = p.PA1; // A5 17 let mut adc4_pin2 = p.PA1; // A5
18 adc4.set_resolution(adc4::Resolution::BITS12); 18 adc4.set_resolution(adc4::Resolution::BITS12);
19 adc4.set_averaging(adc4::Averaging::Samples256); 19 adc4.set_averaging(adc4::Averaging::Samples256);
20 adc4.set_sample_time(adc4::SampleTime::CYCLES1_5); 20
21 let max4 = adc4::resolution_to_max_count(adc4::Resolution::BITS12); 21 let max4 = adc4::resolution_to_max_count(adc4::Resolution::BITS12);
22 22
23 // **** ADC4 blocking read **** 23 // **** ADC4 blocking read ****
24 let raw: u16 = adc4.blocking_read(&mut adc4_pin1); 24 let raw: u16 = adc4.blocking_read(&mut adc4_pin1, adc4::SampleTime::CYCLES1_5);
25 let volt: f32 = 3.0 * raw as f32 / max4 as f32; 25 let volt: f32 = 3.0 * raw as f32 / max4 as f32;
26 info!("Read adc4 pin 1 {}", volt); 26 info!("Read adc4 pin 1 {}", volt);
27 27
28 let raw: u16 = adc4.blocking_read(&mut adc4_pin2); 28 let raw: u16 = adc4.blocking_read(&mut adc4_pin2, adc4::SampleTime::CYCLES1_5);
29 let volt: f32 = 3.3 * raw as f32 / max4 as f32; 29 let volt: f32 = 3.3 * raw as f32 / max4 as f32;
30 info!("Read adc4 pin 2 {}", volt); 30 info!("Read adc4 pin 2 {}", volt);
31 31
diff --git a/examples/stm32wba6/src/bin/adc.rs b/examples/stm32wba6/src/bin/adc.rs
index 8c80470b8..0887e124c 100644
--- a/examples/stm32wba6/src/bin/adc.rs
+++ b/examples/stm32wba6/src/bin/adc.rs
@@ -17,15 +17,14 @@ async fn main(_spawner: embassy_executor::Spawner) {
17 let mut adc4_pin2 = p.PA1; // A5 17 let mut adc4_pin2 = p.PA1; // A5
18 adc4.set_resolution(adc4::Resolution::BITS12); 18 adc4.set_resolution(adc4::Resolution::BITS12);
19 adc4.set_averaging(adc4::Averaging::Samples256); 19 adc4.set_averaging(adc4::Averaging::Samples256);
20 adc4.set_sample_time(adc4::SampleTime::CYCLES1_5);
21 let max4 = adc4::resolution_to_max_count(adc4::Resolution::BITS12); 20 let max4 = adc4::resolution_to_max_count(adc4::Resolution::BITS12);
22 21
23 // **** ADC4 blocking read **** 22 // **** ADC4 blocking read ****
24 let raw: u16 = adc4.blocking_read(&mut adc4_pin1); 23 let raw: u16 = adc4.blocking_read(&mut adc4_pin1, adc4::SampleTime::CYCLES1_5);
25 let volt: f32 = 3.0 * raw as f32 / max4 as f32; 24 let volt: f32 = 3.0 * raw as f32 / max4 as f32;
26 info!("Read adc4 pin 1 {}", volt); 25 info!("Read adc4 pin 1 {}", volt);
27 26
28 let raw: u16 = adc4.blocking_read(&mut adc4_pin2); 27 let raw: u16 = adc4.blocking_read(&mut adc4_pin2, adc4::SampleTime::CYCLES1_5);
29 let volt: f32 = 3.3 * raw as f32 / max4 as f32; 28 let volt: f32 = 3.3 * raw as f32 / max4 as f32;
30 info!("Read adc4 pin 2 {}", volt); 29 info!("Read adc4 pin 2 {}", volt);
31 30
diff --git a/examples/stm32wl/src/bin/adc.rs b/examples/stm32wl/src/bin/adc.rs
index 6b21b086b..adabe0df8 100644
--- a/examples/stm32wl/src/bin/adc.rs
+++ b/examples/stm32wl/src/bin/adc.rs
@@ -18,11 +18,11 @@ async fn main(_spawner: Spawner) {
18 info!("Hello World!"); 18 info!("Hello World!");
19 19
20 let mut adc = Adc::new_with_clock(p.ADC1, Clock::Sync { div: CkModePclk::DIV1 }); 20 let mut adc = Adc::new_with_clock(p.ADC1, Clock::Sync { div: CkModePclk::DIV1 });
21 adc.set_sample_time(SampleTime::CYCLES79_5); 21
22 let mut pin = p.PB2; 22 let mut pin = p.PB2;
23 23
24 let mut vrefint = adc.enable_vrefint(); 24 let mut vrefint = adc.enable_vrefint();
25 let vrefint_sample = adc.blocking_read(&mut vrefint); 25 let vrefint_sample = adc.blocking_read(&mut vrefint, SampleTime::CYCLES79_5);
26 let convert_to_millivolts = |sample| { 26 let convert_to_millivolts = |sample| {
27 // From https://www.st.com/resource/en/datasheet/stm32g031g8.pdf 27 // From https://www.st.com/resource/en/datasheet/stm32g031g8.pdf
28 // 6.3.3 Embedded internal reference voltage 28 // 6.3.3 Embedded internal reference voltage
@@ -32,7 +32,7 @@ async fn main(_spawner: Spawner) {
32 }; 32 };
33 33
34 loop { 34 loop {
35 let v = adc.blocking_read(&mut pin); 35 let v = adc.blocking_read(&mut pin, SampleTime::CYCLES79_5);
36 info!("--> {} - {} mV", v, convert_to_millivolts(v)); 36 info!("--> {} - {} mV", v, convert_to_millivolts(v));
37 Timer::after_millis(100).await; 37 Timer::after_millis(100).await;
38 } 38 }
diff --git a/examples/stm32wle5/src/bin/adc.rs b/examples/stm32wle5/src/bin/adc.rs
index 8b830a1e6..4e0574d97 100644
--- a/examples/stm32wle5/src/bin/adc.rs
+++ b/examples/stm32wle5/src/bin/adc.rs
@@ -73,11 +73,10 @@ async fn async_main(_spawner: Spawner) {
73 info!("Hello World!"); 73 info!("Hello World!");
74 74
75 let mut adc = Adc::new(p.ADC1); 75 let mut adc = Adc::new(p.ADC1);
76 adc.set_sample_time(SampleTime::CYCLES79_5);
77 let mut pin = p.PA10; 76 let mut pin = p.PA10;
78 77
79 let mut vrefint = adc.enable_vrefint(); 78 let mut vrefint = adc.enable_vrefint();
80 let vrefint_sample = adc.blocking_read(&mut vrefint); 79 let vrefint_sample = adc.blocking_read(&mut vrefint, SampleTime::CYCLES79_5);
81 let convert_to_millivolts = |sample| { 80 let convert_to_millivolts = |sample| {
82 // From https://www.st.com/resource/en/datasheet/stm32g031g8.pdf 81 // From https://www.st.com/resource/en/datasheet/stm32g031g8.pdf
83 // 6.3.3 Embedded internal reference voltage 82 // 6.3.3 Embedded internal reference voltage
@@ -87,7 +86,7 @@ async fn async_main(_spawner: Spawner) {
87 }; 86 };
88 87
89 loop { 88 loop {
90 let v = adc.blocking_read(&mut pin); 89 let v = adc.blocking_read(&mut pin, SampleTime::CYCLES79_5);
91 info!("--> {} - {} mV", v, convert_to_millivolts(v)); 90 info!("--> {} - {} mV", v, convert_to_millivolts(v));
92 Timer::after_secs(1).await; 91 Timer::after_secs(1).await;
93 } 92 }
diff --git a/tests/stm32/src/bin/dac.rs b/tests/stm32/src/bin/dac.rs
index d34bbb255..747b11e7f 100644
--- a/tests/stm32/src/bin/dac.rs
+++ b/tests/stm32/src/bin/dac.rs
@@ -10,7 +10,7 @@ use core::f32::consts::PI;
10use common::*; 10use common::*;
11use defmt::assert; 11use defmt::assert;
12use embassy_executor::Spawner; 12use embassy_executor::Spawner;
13use embassy_stm32::adc::Adc; 13use embassy_stm32::adc::{Adc, SampleTime};
14use embassy_stm32::dac::{DacCh1, Value}; 14use embassy_stm32::dac::{DacCh1, Value};
15use embassy_time::Timer; 15use embassy_time::Timer;
16use micromath::F32Ext; 16use micromath::F32Ext;
@@ -37,7 +37,7 @@ async fn main(_spawner: Spawner) {
37 dac.set(Value::Bit8(0)); 37 dac.set(Value::Bit8(0));
38 // Now wait a little to obtain a stable value 38 // Now wait a little to obtain a stable value
39 Timer::after_millis(30).await; 39 Timer::after_millis(30).await;
40 let offset = adc.blocking_read(&mut adc_pin); 40 let offset = adc.blocking_read(&mut adc_pin, SampleTime::from_bits(0));
41 41
42 for v in 0..=255 { 42 for v in 0..=255 {
43 // First set the DAC output value 43 // First set the DAC output value
@@ -48,7 +48,10 @@ async fn main(_spawner: Spawner) {
48 Timer::after_millis(30).await; 48 Timer::after_millis(30).await;
49 49
50 // Need to steal the peripherals here because PA4 is obviously in use already 50 // Need to steal the peripherals here because PA4 is obviously in use already
51 let measured = adc.blocking_read(&mut unsafe { embassy_stm32::Peripherals::steal() }.PA4); 51 let measured = adc.blocking_read(
52 &mut unsafe { embassy_stm32::Peripherals::steal() }.PA4,
53 SampleTime::from_bits(0),
54 );
52 // Calibrate and normalize the measurement to get close to the dac_output_val 55 // Calibrate and normalize the measurement to get close to the dac_output_val
53 let measured_normalized = ((measured as i32 - offset as i32) / normalization_factor) as i16; 56 let measured_normalized = ((measured as i32 - offset as i32) / normalization_factor) as i16;
54 57
diff --git a/tests/stm32/src/bin/dac_l1.rs b/tests/stm32/src/bin/dac_l1.rs
index e6400f28e..2fe0cf1f1 100644
--- a/tests/stm32/src/bin/dac_l1.rs
+++ b/tests/stm32/src/bin/dac_l1.rs
@@ -10,7 +10,7 @@ use core::f32::consts::PI;
10use common::*; 10use common::*;
11use defmt::assert; 11use defmt::assert;
12use embassy_executor::Spawner; 12use embassy_executor::Spawner;
13use embassy_stm32::adc::Adc; 13use embassy_stm32::adc::{Adc, SampleTime};
14use embassy_stm32::dac::{DacCh1, Value}; 14use embassy_stm32::dac::{DacCh1, Value};
15use embassy_stm32::{bind_interrupts, peripherals}; 15use embassy_stm32::{bind_interrupts, peripherals};
16use embassy_time::Timer; 16use embassy_time::Timer;
@@ -47,7 +47,7 @@ async fn main(_spawner: Spawner) {
47 dac.set(Value::Bit8(0)); 47 dac.set(Value::Bit8(0));
48 // Now wait a little to obtain a stable value 48 // Now wait a little to obtain a stable value
49 Timer::after_millis(30).await; 49 Timer::after_millis(30).await;
50 let offset = adc.read(&mut adc_pin).await; 50 let offset = adc.read(&mut adc_pin, SampleTime::from_bits(0)).await;
51 51
52 for v in 0..=255 { 52 for v in 0..=255 {
53 // First set the DAC output value 53 // First set the DAC output value
@@ -58,7 +58,12 @@ async fn main(_spawner: Spawner) {
58 Timer::after_millis(30).await; 58 Timer::after_millis(30).await;
59 59
60 // Need to steal the peripherals here because PA4 is obviously in use already 60 // Need to steal the peripherals here because PA4 is obviously in use already
61 let measured = adc.read(&mut unsafe { embassy_stm32::Peripherals::steal() }.PA4).await; 61 let measured = adc
62 .read(
63 &mut unsafe { embassy_stm32::Peripherals::steal() }.PA4,
64 SampleTime::from_bits(0),
65 )
66 .await;
62 // Calibrate and normalize the measurement to get close to the dac_output_val 67 // Calibrate and normalize the measurement to get close to the dac_output_val
63 let measured_normalized = ((measured as i32 - offset as i32) / normalization_factor) as i16; 68 let measured_normalized = ((measured as i32 - offset as i32) / normalization_factor) as i16;
64 69