aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Vahter <[email protected]>2024-04-10 16:47:58 +0300
committerAndres Vahter <[email protected]>2024-04-10 22:23:49 +0300
commit6e24dc58c6395cc5d733d676986d3b336ce7a220 (patch)
tree1c56fd7753323ad603f77c4a7121ae82cc170964
parentfd901fc7e052cdf1b48327140d78712b1e076220 (diff)
stm32 adc: use fn blocking_delay_us(us: u32)
-rw-r--r--embassy-stm32/src/adc/f1.rs13
-rw-r--r--embassy-stm32/src/adc/f3.rs12
-rw-r--r--embassy-stm32/src/adc/mod.rs9
-rw-r--r--embassy-stm32/src/adc/v1.rs16
-rw-r--r--embassy-stm32/src/adc/v2.rs6
-rw-r--r--embassy-stm32/src/adc/v3.rs16
-rw-r--r--embassy-stm32/src/adc/v4.rs12
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
5use embassy_hal_internal::into_ref; 5use embassy_hal_internal::into_ref;
6 6
7use super::blocking_delay_us;
7use crate::adc::{Adc, AdcPin, Instance, SampleTime}; 8use crate::adc::{Adc, AdcPin, Instance, SampleTime};
8use crate::time::Hertz; 9use crate::time::Hertz;
9use crate::{interrupt, Peripheral}; 10use 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
5use embassy_hal_internal::into_ref; 5use embassy_hal_internal::into_ref;
6 6
7use super::blocking_delay_us;
7use crate::adc::{Adc, AdcPin, Instance, SampleTime}; 8use crate::adc::{Adc, AdcPin, Instance, SampleTime};
8use crate::interrupt::typelevel::Interrupt; 9use crate::interrupt::typelevel::Interrupt;
9use crate::time::Hertz; 10use 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)]
74pub(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)]
7use stm32_metapac::adc::vals::Ckmode; 7use stm32_metapac::adc::vals::Ckmode;
8 8
9use super::blocking_delay_us;
9use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; 10use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime};
10use crate::interrupt::typelevel::Interrupt; 11use crate::interrupt::typelevel::Interrupt;
11use crate::peripherals::ADC; 12use 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 @@
1use embassy_hal_internal::into_ref; 1use embassy_hal_internal::into_ref;
2 2
3use super::blocking_delay_us;
3use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; 4use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime};
4use crate::peripherals::ADC1; 5use crate::peripherals::ADC1;
5use crate::time::Hertz; 6use 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 @@
1use cfg_if::cfg_if; 1use cfg_if::cfg_if;
2use embassy_hal_internal::into_ref; 2use embassy_hal_internal::into_ref;
3 3
4use super::blocking_delay_us;
4use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime}; 5use crate::adc::{Adc, AdcPin, Instance, Resolution, SampleTime};
5use crate::Peripheral; 6use 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 @@
2use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel}; 2use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel};
3use pac::adccommon::vals::Presc; 3use pac::adccommon::vals::Presc;
4 4
5use super::{Adc, AdcPin, Instance, InternalChannel, Resolution, SampleTime}; 5use super::{blocking_delay_us, Adc, AdcPin, Instance, InternalChannel, Resolution, SampleTime};
6use crate::time::Hertz; 6use crate::time::Hertz;
7use crate::{pac, Peripheral}; 7use 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) {