diff options
| author | Andres Vahter <[email protected]> | 2024-04-10 16:47:58 +0300 |
|---|---|---|
| committer | Andres Vahter <[email protected]> | 2024-04-10 22:23:49 +0300 |
| commit | 6e24dc58c6395cc5d733d676986d3b336ce7a220 (patch) | |
| tree | 1c56fd7753323ad603f77c4a7121ae82cc170964 | |
| parent | fd901fc7e052cdf1b48327140d78712b1e076220 (diff) | |
stm32 adc: use fn blocking_delay_us(us: u32)
| -rw-r--r-- | embassy-stm32/src/adc/f1.rs | 13 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/f3.rs | 12 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/mod.rs | 9 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v1.rs | 16 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v2.rs | 6 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v3.rs | 16 | ||||
| -rw-r--r-- | embassy-stm32/src/adc/v4.rs | 12 |
7 files changed, 28 insertions, 56 deletions
diff --git a/embassy-stm32/src/adc/f1.rs b/embassy-stm32/src/adc/f1.rs index dd4b3489b..80eaecc14 100644 --- a/embassy-stm32/src/adc/f1.rs +++ b/embassy-stm32/src/adc/f1.rs | |||
| @@ -4,6 +4,7 @@ use core::task::Poll; | |||
| 4 | 4 | ||
| 5 | use embassy_hal_internal::into_ref; | 5 | use embassy_hal_internal::into_ref; |
| 6 | 6 | ||
| 7 | use super::blocking_delay_us; | ||
| 7 | use crate::adc::{Adc, AdcPin, Instance, SampleTime}; | 8 | use crate::adc::{Adc, AdcPin, Instance, SampleTime}; |
| 8 | use crate::time::Hertz; | 9 | use crate::time::Hertz; |
| 9 | use crate::{interrupt, Peripheral}; | 10 | use crate::{interrupt, Peripheral}; |
| @@ -54,11 +55,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 54 | 55 | ||
| 55 | // 11.4: Before starting a calibration, the ADC must have been in power-on state (ADON bit = ‘1’) | 56 | // 11.4: Before starting a calibration, the ADC must have been in power-on state (ADON bit = ‘1’) |
| 56 | // for at least two ADC clock cycles. | 57 | // for at least two ADC clock cycles. |
| 57 | let us = (1_000_000 * 2) / Self::freq().0 + 1; | 58 | blocking_delay_us((1_000_000 * 2) / Self::freq().0 + 1); |
| 58 | #[cfg(time)] | ||
| 59 | embassy_time::block_for(embassy_time::Duration::from_micros(us)); | ||
| 60 | #[cfg(not(time))] | ||
| 61 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / (1000_000 / us)); | ||
| 62 | 59 | ||
| 63 | // Reset calibration | 60 | // Reset calibration |
| 64 | T::regs().cr2().modify(|reg| reg.set_rstcal(true)); | 61 | T::regs().cr2().modify(|reg| reg.set_rstcal(true)); |
| @@ -73,11 +70,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 73 | } | 70 | } |
| 74 | 71 | ||
| 75 | // One cycle after calibration | 72 | // One cycle after calibration |
| 76 | let us = (1_000_000 * 1) / Self::freq().0 + 1; | 73 | blocking_delay_us((1_000_000 * 1) / Self::freq().0 + 1); |
| 77 | #[cfg(time)] | ||
| 78 | embassy_time::block_for(embassy_time::Duration::from_micros(us)); | ||
| 79 | #[cfg(not(time))] | ||
| 80 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / (1000_000 / us)); | ||
| 81 | 74 | ||
| 82 | Self { | 75 | Self { |
| 83 | adc, | 76 | adc, |
diff --git a/embassy-stm32/src/adc/f3.rs b/embassy-stm32/src/adc/f3.rs index 1a62b7707..c22a3fe4a 100644 --- a/embassy-stm32/src/adc/f3.rs +++ b/embassy-stm32/src/adc/f3.rs | |||
| @@ -4,6 +4,7 @@ use core::task::Poll; | |||
| 4 | 4 | ||
| 5 | use embassy_hal_internal::into_ref; | 5 | use embassy_hal_internal::into_ref; |
| 6 | 6 | ||
| 7 | use super::blocking_delay_us; | ||
| 7 | use crate::adc::{Adc, AdcPin, Instance, SampleTime}; | 8 | use crate::adc::{Adc, AdcPin, Instance, SampleTime}; |
| 8 | use crate::interrupt::typelevel::Interrupt; | 9 | use crate::interrupt::typelevel::Interrupt; |
| 9 | use crate::time::Hertz; | 10 | use crate::time::Hertz; |
| @@ -69,10 +70,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 69 | T::regs().cr().modify(|w| w.set_advregen(vals::Advregen::ENABLED)); | 70 | T::regs().cr().modify(|w| w.set_advregen(vals::Advregen::ENABLED)); |
| 70 | 71 | ||
| 71 | // Wait for the regulator to stabilize | 72 | // Wait for the regulator to stabilize |
| 72 | #[cfg(time)] | 73 | blocking_delay_us(10); |
| 73 | embassy_time::block_for(embassy_time::Duration::from_micros(10)); | ||
| 74 | #[cfg(not(time))] | ||
| 75 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / 100_000); | ||
| 76 | 74 | ||
| 77 | assert!(!T::regs().cr().read().aden()); | 75 | assert!(!T::regs().cr().read().aden()); |
| 78 | 76 | ||
| @@ -83,11 +81,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 83 | while T::regs().cr().read().adcal() {} | 81 | while T::regs().cr().read().adcal() {} |
| 84 | 82 | ||
| 85 | // Wait more than 4 clock cycles after adcal is cleared (RM0364 p. 223). | 83 | // Wait more than 4 clock cycles after adcal is cleared (RM0364 p. 223). |
| 86 | let us = (1_000_000 * 4) / Self::freq().0 + 1; | 84 | blocking_delay_us((1_000_000 * 4) / Self::freq().0 + 1); |
| 87 | #[cfg(time)] | ||
| 88 | embassy_time::block_for(embassy_time::Duration::from_micros(us)); | ||
| 89 | #[cfg(not(time))] | ||
| 90 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / (1000_000 / us)); | ||
| 91 | 85 | ||
| 92 | // Enable the adc | 86 | // Enable the adc |
| 93 | T::regs().cr().modify(|w| w.set_aden(true)); | 87 | T::regs().cr().modify(|w| w.set_aden(true)); |
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs index ead2357ce..24dd7cc3c 100644 --- a/embassy-stm32/src/adc/mod.rs +++ b/embassy-stm32/src/adc/mod.rs | |||
| @@ -69,6 +69,15 @@ trait SealedInternalChannel<T> { | |||
| 69 | fn channel(&self) -> u8; | 69 | fn channel(&self) -> u8; |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | /// Performs a busy-wait delay for a specified number of microseconds. | ||
| 73 | #[allow(unused)] | ||
| 74 | pub(crate) fn blocking_delay_us(us: u32) { | ||
| 75 | #[cfg(time)] | ||
| 76 | embassy_time::block_for(embassy_time::Duration::from_micros(us)); | ||
| 77 | #[cfg(not(time))] | ||
| 78 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 * us / 1_000_000); | ||
| 79 | } | ||
| 80 | |||
| 72 | /// ADC instance. | 81 | /// ADC instance. |
| 73 | #[cfg(not(any(adc_f1, adc_v1, adc_l0, adc_v2, adc_v3, adc_v4, adc_f3, adc_f3_v1_1, adc_g0, adc_h5)))] | 82 | #[cfg(not(any(adc_f1, adc_v1, adc_l0, adc_v2, adc_v3, adc_v4, adc_f3, adc_f3_v1_1, adc_g0, adc_h5)))] |
| 74 | #[allow(private_bounds)] | 83 | #[allow(private_bounds)] |
diff --git a/embassy-stm32/src/adc/v1.rs b/embassy-stm32/src/adc/v1.rs index 960990c39..1dda28cf2 100644 --- a/embassy-stm32/src/adc/v1.rs +++ b/embassy-stm32/src/adc/v1.rs | |||
| @@ -6,6 +6,7 @@ use embassy_hal_internal::into_ref; | |||
| 6 | #[cfg(adc_l0)] | 6 | #[cfg(adc_l0)] |
| 7 | use stm32_metapac::adc::vals::Ckmode; | 7 | use stm32_metapac::adc::vals::Ckmode; |
| 8 | 8 | ||
| 9 | use super::blocking_delay_us; | ||
| 9 | use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; | 10 | use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; |
| 10 | use crate::interrupt::typelevel::Interrupt; | 11 | use crate::interrupt::typelevel::Interrupt; |
| 11 | use crate::peripherals::ADC; | 12 | use crate::peripherals::ADC; |
| @@ -72,10 +73,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 72 | // | 73 | // |
| 73 | // Table 57. ADC characteristics | 74 | // Table 57. ADC characteristics |
| 74 | // tstab = 14 * 1/fadc | 75 | // tstab = 14 * 1/fadc |
| 75 | #[cfg(time)] | 76 | blocking_delay_us(1); |
| 76 | embassy_time::block_for(embassy_time::Duration::from_micros(1)); | ||
| 77 | #[cfg(not(time))] | ||
| 78 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / 1000_000); | ||
| 79 | 77 | ||
| 80 | // set default PCKL/2 on L0s because HSI is disabled in the default clock config | 78 | // set default PCKL/2 on L0s because HSI is disabled in the default clock config |
| 81 | #[cfg(adc_l0)] | 79 | #[cfg(adc_l0)] |
| @@ -128,10 +126,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 128 | // Table 28. Embedded internal reference voltage | 126 | // Table 28. Embedded internal reference voltage |
| 129 | // tstart = 10μs | 127 | // tstart = 10μs |
| 130 | T::regs().ccr().modify(|reg| reg.set_vrefen(true)); | 128 | T::regs().ccr().modify(|reg| reg.set_vrefen(true)); |
| 131 | #[cfg(time)] | 129 | blocking_delay_us(10); |
| 132 | embassy_time::block_for(embassy_time::Duration::from_micros(10)); | ||
| 133 | #[cfg(not(time))] | ||
| 134 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / 100_000); | ||
| 135 | Vref | 130 | Vref |
| 136 | } | 131 | } |
| 137 | 132 | ||
| @@ -142,10 +137,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 142 | // tstart ≤ 10μs | 137 | // tstart ≤ 10μs |
| 143 | // ts_temp ≥ 4μs | 138 | // ts_temp ≥ 4μs |
| 144 | T::regs().ccr().modify(|reg| reg.set_tsen(true)); | 139 | T::regs().ccr().modify(|reg| reg.set_tsen(true)); |
| 145 | #[cfg(time)] | 140 | blocking_delay_us(10); |
| 146 | embassy_time::block_for(embassy_time::Duration::from_micros(10)); | ||
| 147 | #[cfg(not(time))] | ||
| 148 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / 100_000); | ||
| 149 | Temperature | 141 | Temperature |
| 150 | } | 142 | } |
| 151 | 143 | ||
diff --git a/embassy-stm32/src/adc/v2.rs b/embassy-stm32/src/adc/v2.rs index 1ac119508..7771cf768 100644 --- a/embassy-stm32/src/adc/v2.rs +++ b/embassy-stm32/src/adc/v2.rs | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | use embassy_hal_internal::into_ref; | 1 | use embassy_hal_internal::into_ref; |
| 2 | 2 | ||
| 3 | use super::blocking_delay_us; | ||
| 3 | use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; | 4 | use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; |
| 4 | use crate::peripherals::ADC1; | 5 | use crate::peripherals::ADC1; |
| 5 | use crate::time::Hertz; | 6 | use crate::time::Hertz; |
| @@ -103,10 +104,7 @@ where | |||
| 103 | reg.set_adon(true); | 104 | reg.set_adon(true); |
| 104 | }); | 105 | }); |
| 105 | 106 | ||
| 106 | #[cfg(time)] | 107 | blocking_delay_us(3); |
| 107 | embassy_time::block_for(embassy_time::Duration::from_micros(5)); | ||
| 108 | #[cfg(not(time))] | ||
| 109 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / 200_000); | ||
| 110 | 108 | ||
| 111 | Self { | 109 | Self { |
| 112 | adc, | 110 | adc, |
diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs index a5e09646a..4fd8558ba 100644 --- a/embassy-stm32/src/adc/v3.rs +++ b/embassy-stm32/src/adc/v3.rs | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | use cfg_if::cfg_if; | 1 | use cfg_if::cfg_if; |
| 2 | use embassy_hal_internal::into_ref; | 2 | use embassy_hal_internal::into_ref; |
| 3 | 3 | ||
| 4 | use super::blocking_delay_us; | ||
| 4 | use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; | 5 | use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; |
| 5 | use crate::Peripheral; | 6 | use crate::Peripheral; |
| 6 | 7 | ||
| @@ -87,10 +88,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 87 | reg.set_chselrmod(false); | 88 | reg.set_chselrmod(false); |
| 88 | }); | 89 | }); |
| 89 | 90 | ||
| 90 | #[cfg(time)] | 91 | blocking_delay_us(20); |
| 91 | embassy_time::block_for(embassy_time::Duration::from_micros(20)); | ||
| 92 | #[cfg(not(time))] | ||
| 93 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / 50_000); | ||
| 94 | 92 | ||
| 95 | T::regs().cr().modify(|reg| { | 93 | T::regs().cr().modify(|reg| { |
| 96 | reg.set_adcal(true); | 94 | reg.set_adcal(true); |
| @@ -100,10 +98,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 100 | // spin | 98 | // spin |
| 101 | } | 99 | } |
| 102 | 100 | ||
| 103 | #[cfg(time)] | 101 | blocking_delay_us(1); |
| 104 | embassy_time::block_for(embassy_time::Duration::from_micros(1)); | ||
| 105 | #[cfg(not(time))] | ||
| 106 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / 1000_000); | ||
| 107 | 102 | ||
| 108 | Self { | 103 | Self { |
| 109 | adc, | 104 | adc, |
| @@ -123,10 +118,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 123 | 118 | ||
| 124 | // "Table 24. Embedded internal voltage reference" states that it takes a maximum of 12 us | 119 | // "Table 24. Embedded internal voltage reference" states that it takes a maximum of 12 us |
| 125 | // to stabilize the internal voltage reference. | 120 | // to stabilize the internal voltage reference. |
| 126 | #[cfg(time)] | 121 | blocking_delay_us(15); |
| 127 | embassy_time::block_for(embassy_time::Duration::from_micros(20)); | ||
| 128 | #[cfg(not(time))] | ||
| 129 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / 50_000); | ||
| 130 | 122 | ||
| 131 | VrefInt {} | 123 | VrefInt {} |
| 132 | } | 124 | } |
diff --git a/embassy-stm32/src/adc/v4.rs b/embassy-stm32/src/adc/v4.rs index 018104dd6..ca87b41ee 100644 --- a/embassy-stm32/src/adc/v4.rs +++ b/embassy-stm32/src/adc/v4.rs | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel}; | 2 | use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel}; |
| 3 | use pac::adccommon::vals::Presc; | 3 | use pac::adccommon::vals::Presc; |
| 4 | 4 | ||
| 5 | use super::{Adc, AdcPin, Instance, InternalChannel, Resolution, SampleTime}; | 5 | use super::{blocking_delay_us, Adc, AdcPin, Instance, InternalChannel, Resolution, SampleTime}; |
| 6 | use crate::time::Hertz; | 6 | use crate::time::Hertz; |
| 7 | use crate::{pac, Peripheral}; | 7 | use crate::{pac, Peripheral}; |
| 8 | 8 | ||
| @@ -164,10 +164,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 164 | s.configure_differential_inputs(); | 164 | s.configure_differential_inputs(); |
| 165 | 165 | ||
| 166 | s.calibrate(); | 166 | s.calibrate(); |
| 167 | #[cfg(time)] | 167 | blocking_delay_us(1); |
| 168 | embassy_time::block_for(embassy_time::Duration::from_micros(1)); | ||
| 169 | #[cfg(not(time))] | ||
| 170 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / 1000_000); | ||
| 171 | 168 | ||
| 172 | s.enable(); | 169 | s.enable(); |
| 173 | s.configure(); | 170 | s.configure(); |
| @@ -181,10 +178,7 @@ impl<'d, T: Instance> Adc<'d, T> { | |||
| 181 | reg.set_advregen(true); | 178 | reg.set_advregen(true); |
| 182 | }); | 179 | }); |
| 183 | 180 | ||
| 184 | #[cfg(time)] | 181 | blocking_delay_us(10); |
| 185 | embassy_time::block_for(embassy_time::Duration::from_micros(10)); | ||
| 186 | #[cfg(not(time))] | ||
| 187 | cortex_m::asm::delay(unsafe { crate::rcc::get_freqs() }.sys.unwrap().0 / 100_000); | ||
| 188 | } | 182 | } |
| 189 | 183 | ||
| 190 | fn configure_differential_inputs(&mut self) { | 184 | fn configure_differential_inputs(&mut self) { |
