diff options
| author | xoviat <[email protected]> | 2025-11-10 09:56:42 -0600 |
|---|---|---|
| committer | xoviat <[email protected]> | 2025-11-10 09:56:42 -0600 |
| commit | 12b59dc610fb659a4d51ccc364865a7e154379d6 (patch) | |
| tree | 4d91375fb1ba72c65a5a50ab213181a03828c280 | |
| parent | 1da05747c416c989a128aabbbde4b46df7bba9b9 (diff) | |
adc: remove sample_time from struct
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 | ||
| 157 | impl<'d, T: Instance> Adc<'d, T> { | 157 | impl<'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); | |||
| 47 | pub struct Adc<'d, T: Instance> { | 47 | pub 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 @@ | |||
| 1 | use core::future::poll_fn; | 1 | use core::future::poll_fn; |
| 2 | use core::task::Poll; | 2 | use core::task::Poll; |
| 3 | 3 | ||
| 4 | use stm32_metapac::adc::vals::{Align, Awdsgl, Res}; | 4 | use stm32_metapac::adc::vals::{Align, Awdsgl, Res, SampleTime}; |
| 5 | 5 | ||
| 6 | use crate::adc::{Adc, AdcChannel, Instance}; | 6 | use 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 | ||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_stm32::adc::{self, Adc, WatchdogChannels}; | 6 | use embassy_stm32::adc::{self, Adc, SampleTime, WatchdogChannels}; |
| 7 | use embassy_stm32::bind_interrupts; | 7 | use embassy_stm32::bind_interrupts; |
| 8 | use embassy_stm32::peripherals::ADC1; | 8 | use embassy_stm32::peripherals::ADC1; |
| 9 | use {defmt_rtt as _, panic_probe as _}; | 9 | use {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 | ||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_stm32::adc::Adc; | 6 | use embassy_stm32::adc::{Adc, SampleTime}; |
| 7 | use embassy_stm32::peripherals::ADC1; | 7 | use embassy_stm32::peripherals::ADC1; |
| 8 | use embassy_stm32::{adc, bind_interrupts}; | 8 | use embassy_stm32::{adc, bind_interrupts}; |
| 9 | use embassy_time::Timer; | 9 | use 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 @@ | |||
| 4 | use cortex_m::prelude::_embedded_hal_blocking_delay_DelayUs; | 4 | use cortex_m::prelude::_embedded_hal_blocking_delay_DelayUs; |
| 5 | use defmt::*; | 5 | use defmt::*; |
| 6 | use embassy_executor::Spawner; | 6 | use embassy_executor::Spawner; |
| 7 | use embassy_stm32::adc::{Adc, Temperature, VrefInt}; | 7 | use embassy_stm32::adc::{Adc, SampleTime, Temperature, VrefInt}; |
| 8 | use embassy_time::{Delay, Timer}; | 8 | use embassy_time::{Delay, Timer}; |
| 9 | use {defmt_rtt as _, panic_probe as _}; | 9 | use {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 | ||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_stm32::adc::Adc; | 6 | use embassy_stm32::adc::{Adc, SampleTime}; |
| 7 | use embassy_time::Timer; | 7 | use embassy_time::Timer; |
| 8 | use {defmt_rtt as _, panic_probe as _}; | 8 | use {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 | ||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_stm32::Config; | 5 | use embassy_stm32::Config; |
| 6 | use embassy_stm32::adc::{Adc, Resolution}; | 6 | use embassy_stm32::adc::{Adc, Resolution, SampleTime}; |
| 7 | use {defmt_rtt as _, panic_probe as _}; | 7 | use {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 | ||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_stm32::Config; | 5 | use embassy_stm32::Config; |
| 6 | use embassy_stm32::adc::{Adc, Resolution}; | 6 | use embassy_stm32::adc::{Adc, Resolution, SampleTime}; |
| 7 | use embassy_time::Duration; | 7 | use embassy_time::Duration; |
| 8 | use {defmt_rtt as _, panic_probe as _}; | 8 | use {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 | ||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_stm32::adc; | 5 | use embassy_stm32::adc::{self, AdcChannel, SampleTime, adc4}; |
| 6 | use embassy_stm32::adc::{AdcChannel, adc4}; | ||
| 7 | use {defmt_rtt as _, panic_probe as _}; | 6 | use {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; | |||
| 10 | use common::*; | 10 | use common::*; |
| 11 | use defmt::assert; | 11 | use defmt::assert; |
| 12 | use embassy_executor::Spawner; | 12 | use embassy_executor::Spawner; |
| 13 | use embassy_stm32::adc::Adc; | 13 | use embassy_stm32::adc::{Adc, SampleTime}; |
| 14 | use embassy_stm32::dac::{DacCh1, Value}; | 14 | use embassy_stm32::dac::{DacCh1, Value}; |
| 15 | use embassy_time::Timer; | 15 | use embassy_time::Timer; |
| 16 | use micromath::F32Ext; | 16 | use 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; | |||
| 10 | use common::*; | 10 | use common::*; |
| 11 | use defmt::assert; | 11 | use defmt::assert; |
| 12 | use embassy_executor::Spawner; | 12 | use embassy_executor::Spawner; |
| 13 | use embassy_stm32::adc::Adc; | 13 | use embassy_stm32::adc::{Adc, SampleTime}; |
| 14 | use embassy_stm32::dac::{DacCh1, Value}; | 14 | use embassy_stm32::dac::{DacCh1, Value}; |
| 15 | use embassy_stm32::{bind_interrupts, peripherals}; | 15 | use embassy_stm32::{bind_interrupts, peripherals}; |
| 16 | use embassy_time::Timer; | 16 | use 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 | ||
