aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/adc/f1.rs57
-rw-r--r--embassy-stm32/src/adc/mod.rs5
-rw-r--r--embassy-stm32/src/adc/sample_time.rs114
-rw-r--r--embassy-stm32/src/adc/v2.rs38
-rw-r--r--embassy-stm32/src/adc/v3.rs112
-rw-r--r--embassy-stm32/src/adc/v4.rs53
6 files changed, 123 insertions, 256 deletions
diff --git a/embassy-stm32/src/adc/f1.rs b/embassy-stm32/src/adc/f1.rs
index c5b317ce9..56d1a2f33 100644
--- a/embassy-stm32/src/adc/f1.rs
+++ b/embassy-stm32/src/adc/f1.rs
@@ -3,7 +3,7 @@ use core::marker::PhantomData;
3use embassy_hal_common::into_ref; 3use embassy_hal_common::into_ref;
4use embedded_hal_02::blocking::delay::DelayUs; 4use embedded_hal_02::blocking::delay::DelayUs;
5 5
6use crate::adc::{AdcPin, Instance}; 6use crate::adc::{AdcPin, Instance, SampleTime};
7use crate::rcc::get_freqs; 7use crate::rcc::get_freqs;
8use crate::time::Hertz; 8use crate::time::Hertz;
9use crate::Peripheral; 9use crate::Peripheral;
@@ -29,61 +29,6 @@ impl<T: Instance> super::sealed::AdcPin<T> for Temperature {
29 } 29 }
30} 30}
31 31
32mod sample_time {
33 /// ADC sample time
34 ///
35 /// The default setting is 1.5 ADC clock cycles.
36 #[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
37 pub enum SampleTime {
38 /// 1.5 ADC clock cycles
39 Cycles1_5 = 0b000,
40
41 /// 7.5 ADC clock cycles
42 Cycles7_5 = 0b001,
43
44 /// 13.5 ADC clock cycles
45 Cycles13_5 = 0b010,
46
47 /// 28.5 ADC clock cycles
48 Cycles28_5 = 0b011,
49
50 /// 41.5 ADC clock cycles
51 Cycles41_5 = 0b100,
52
53 /// 55.5 ADC clock cycles
54 Cycles55_5 = 0b101,
55
56 /// 71.5 ADC clock cycles
57 Cycles71_5 = 0b110,
58
59 /// 239.5 ADC clock cycles
60 Cycles239_5 = 0b111,
61 }
62
63 impl SampleTime {
64 pub(crate) fn sample_time(&self) -> crate::pac::adc::vals::SampleTime {
65 match self {
66 SampleTime::Cycles1_5 => crate::pac::adc::vals::SampleTime::CYCLES1_5,
67 SampleTime::Cycles7_5 => crate::pac::adc::vals::SampleTime::CYCLES7_5,
68 SampleTime::Cycles13_5 => crate::pac::adc::vals::SampleTime::CYCLES13_5,
69 SampleTime::Cycles28_5 => crate::pac::adc::vals::SampleTime::CYCLES28_5,
70 SampleTime::Cycles41_5 => crate::pac::adc::vals::SampleTime::CYCLES41_5,
71 SampleTime::Cycles55_5 => crate::pac::adc::vals::SampleTime::CYCLES55_5,
72 SampleTime::Cycles71_5 => crate::pac::adc::vals::SampleTime::CYCLES71_5,
73 SampleTime::Cycles239_5 => crate::pac::adc::vals::SampleTime::CYCLES239_5,
74 }
75 }
76 }
77
78 impl Default for SampleTime {
79 fn default() -> Self {
80 Self::Cycles28_5
81 }
82 }
83}
84
85pub use sample_time::SampleTime;
86
87pub struct Adc<'d, T: Instance> { 32pub struct Adc<'d, T: Instance> {
88 sample_time: SampleTime, 33 sample_time: SampleTime,
89 phantom: PhantomData<&'d mut T>, 34 phantom: PhantomData<&'d mut T>,
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs
index 0eb4eba73..6232678f0 100644
--- a/embassy-stm32/src/adc/mod.rs
+++ b/embassy-stm32/src/adc/mod.rs
@@ -8,8 +8,13 @@
8#[cfg_attr(adc_v1, path = "v1.rs")] 8#[cfg_attr(adc_v1, path = "v1.rs")]
9mod _version; 9mod _version;
10 10
11#[cfg(not(adc_v1))]
12mod sample_time;
13
11#[allow(unused)] 14#[allow(unused)]
12pub use _version::*; 15pub use _version::*;
16#[cfg(not(adc_v1))]
17pub use sample_time::SampleTime;
13 18
14use crate::peripherals; 19use crate::peripherals;
15 20
diff --git a/embassy-stm32/src/adc/sample_time.rs b/embassy-stm32/src/adc/sample_time.rs
new file mode 100644
index 000000000..f0eb104f0
--- /dev/null
+++ b/embassy-stm32/src/adc/sample_time.rs
@@ -0,0 +1,114 @@
1macro_rules! impl_sample_time {
2 ($default_doc:expr, $default:ident, $pac:ty, ($(($doc:expr, $variant:ident, $pac_variant:ident)),*)) => {
3 #[doc = concat!("ADC sample time\n\nThe default setting is ", $default_doc, " ADC clock cycles.")]
4 #[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
5 pub enum SampleTime {
6 $(
7 #[doc = concat!($doc, " ADC clock cycles.")]
8 $variant,
9 )*
10 }
11
12 impl SampleTime {
13 pub(crate) fn sample_time(&self) -> $pac {
14 match self {
15 $(Self::$variant => <$pac>::$pac_variant),*
16 }
17 }
18 }
19
20 impl Default for SampleTime {
21 fn default() -> Self {
22 Self::$default
23 }
24 }
25 };
26}
27
28// TODO: Fix default
29#[cfg(adc_f1)]
30impl_sample_time!(
31 "1.5",
32 Cycles28_5,
33 crate::pac::adc::vals::SampleTime,
34 (
35 ("1.5", Cycles1_5, CYCLES1_5),
36 ("7.5", Cycles7_5, CYCLES7_5),
37 ("13.5", Cycles13_5, CYCLES13_5),
38 ("28.5", Cycles28_5, CYCLES28_5),
39 ("41.5", Cycles41_5, CYCLES41_5),
40 ("55.5", Cycles55_5, CYCLES55_5),
41 ("71.5", Cycles71_5, CYCLES71_5),
42 ("239.5", Cycles239_5, CYCLES239_5)
43 )
44);
45
46// TODO: Fix 85 vs 84
47#[cfg(adc_v2)]
48impl_sample_time!(
49 "3",
50 Cycles3,
51 crate::pac::adc::vals::Smp,
52 (
53 ("3", Cycles3, CYCLES3),
54 ("15", Cycles15, CYCLES15),
55 ("28", Cycles28, CYCLES28),
56 ("56", Cycles56, CYCLES56),
57 ("85", Cycles85, CYCLES84),
58 ("112", Cycles112, CYCLES112),
59 ("144", Cycles144, CYCLES144),
60 ("480", Cycles480, CYCLES480)
61 )
62);
63
64#[cfg(adc_v3)]
65impl_sample_time!(
66 "2.5",
67 Cycles2_5,
68 crate::pac::adc::vals::SampleTime,
69 (
70 ("2.5", Cycles2_5, CYCLES2_5),
71 ("6.5", Cycles6_5, CYCLES6_5),
72 ("12.5", Cycles12_5, CYCLES12_5),
73 ("24.5", Cycles24_5, CYCLES24_5),
74 ("47.5", Cycles47_5, CYCLES47_5),
75 ("92.5", Cycles92_5, CYCLES92_5),
76 ("247.5", Cycles247_5, CYCLES247_5),
77 ("640.5", Cycles640_5, CYCLES640_5)
78 )
79);
80
81#[cfg(adc_g0)]
82impl_sample_time!(
83 "1.5",
84 Cycles1_5,
85 crate::pac::adc::vals::SampleTime,
86 (
87 ("1.5", Cycles1_5, CYCLES1_5),
88 ("3.5", Cycles3_5, CYCLES3_5),
89 ("7.5", Cycles7_5, CYCLES7_5),
90 ("12.5", Cycles12_5, CYCLES12_5),
91 ("19.5", Cycles19_5, CYCLES19_5),
92 ("39.5", Cycles39_5, CYCLES39_5),
93 ("79.5", Cycles79_5, CYCLES79_5),
94 ("160.5", Cycles160_5, CYCLES160_5)
95 )
96);
97
98// TODO: Fix default doc
99#[cfg(adc_v4)]
100impl_sample_time!(
101 "2.5",
102 Cycles1_5,
103 crate::pac::adc::vals::Smp,
104 (
105 ("1.5", Cycles1_5, CYCLES1_5),
106 ("2.5", Cycles2_5, CYCLES2_5),
107 ("8.5", Cycles8_5, CYCLES8_5),
108 ("16.5", Cycles16_5, CYCLES16_5),
109 ("32.5", Cycles32_5, CYCLES32_5),
110 ("64.5", Cycles64_5, CYCLES64_5),
111 ("387.5", Cycles387_5, CYCLES387_5),
112 ("810.5", Cycles810_5, CYCLES810_5)
113 )
114);
diff --git a/embassy-stm32/src/adc/v2.rs b/embassy-stm32/src/adc/v2.rs
index 53419c7f2..00d9b3077 100644
--- a/embassy-stm32/src/adc/v2.rs
+++ b/embassy-stm32/src/adc/v2.rs
@@ -4,7 +4,7 @@ use embassy_hal_common::into_ref;
4use embedded_hal_02::blocking::delay::DelayUs; 4use embedded_hal_02::blocking::delay::DelayUs;
5 5
6use super::InternalChannel; 6use super::InternalChannel;
7use crate::adc::{AdcPin, Instance}; 7use crate::adc::{AdcPin, Instance, SampleTime};
8use crate::peripherals::ADC1; 8use crate::peripherals::ADC1;
9use crate::time::Hertz; 9use crate::time::Hertz;
10use crate::Peripheral; 10use crate::Peripheral;
@@ -94,42 +94,6 @@ impl super::sealed::InternalChannel<ADC1> for Vbat {
94 } 94 }
95} 95}
96 96
97/// ADC sample time
98///
99/// The default setting is 3 ADC clock cycles.
100#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
101pub enum SampleTime {
102 Cycles3 = 0b000,
103 Cycles15 = 0b001,
104 Cycles28 = 0b010,
105 Cycles56 = 0b011,
106 Cycles85 = 0b100,
107 Cycles112 = 0b101,
108 Cycles144 = 0b110,
109 Cycles480 = 0b111,
110}
111
112impl SampleTime {
113 pub(crate) fn sample_time(&self) -> crate::pac::adc::vals::Smp {
114 match self {
115 SampleTime::Cycles3 => crate::pac::adc::vals::Smp::CYCLES3,
116 SampleTime::Cycles15 => crate::pac::adc::vals::Smp::CYCLES15,
117 SampleTime::Cycles28 => crate::pac::adc::vals::Smp::CYCLES28,
118 SampleTime::Cycles56 => crate::pac::adc::vals::Smp::CYCLES56,
119 SampleTime::Cycles85 => crate::pac::adc::vals::Smp::CYCLES84,
120 SampleTime::Cycles112 => crate::pac::adc::vals::Smp::CYCLES112,
121 SampleTime::Cycles144 => crate::pac::adc::vals::Smp::CYCLES144,
122 SampleTime::Cycles480 => crate::pac::adc::vals::Smp::CYCLES480,
123 }
124 }
125}
126
127impl Default for SampleTime {
128 fn default() -> Self {
129 Self::Cycles3
130 }
131}
132
133enum Prescaler { 97enum Prescaler {
134 Div2, 98 Div2,
135 Div4, 99 Div4,
diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs
index 816feeac7..b638e8ca5 100644
--- a/embassy-stm32/src/adc/v3.rs
+++ b/embassy-stm32/src/adc/v3.rs
@@ -3,7 +3,7 @@ use core::marker::PhantomData;
3use embassy_hal_common::into_ref; 3use embassy_hal_common::into_ref;
4use embedded_hal_02::blocking::delay::DelayUs; 4use embedded_hal_02::blocking::delay::DelayUs;
5 5
6use crate::adc::{AdcPin, Instance}; 6use crate::adc::{AdcPin, Instance, SampleTime};
7use crate::Peripheral; 7use crate::Peripheral;
8 8
9/// Default VREF voltage used for sample conversion to millivolts. 9/// Default VREF voltage used for sample conversion to millivolts.
@@ -93,116 +93,6 @@ impl<T: Instance> super::sealed::AdcPin<T> for Vbat {
93 } 93 }
94} 94}
95 95
96#[cfg(not(adc_g0))]
97mod sample_time {
98 /// ADC sample time
99 ///
100 /// The default setting is 2.5 ADC clock cycles.
101 #[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
102 pub enum SampleTime {
103 /// 2.5 ADC clock cycles
104 Cycles2_5 = 0b000,
105
106 /// 6.5 ADC clock cycles
107 Cycles6_5 = 0b001,
108
109 /// 12.5 ADC clock cycles
110 Cycles12_5 = 0b010,
111
112 /// 24.5 ADC clock cycles
113 Cycles24_5 = 0b011,
114
115 /// 47.5 ADC clock cycles
116 Cycles47_5 = 0b100,
117
118 /// 92.5 ADC clock cycles
119 Cycles92_5 = 0b101,
120
121 /// 247.5 ADC clock cycles
122 Cycles247_5 = 0b110,
123
124 /// 640.5 ADC clock cycles
125 Cycles640_5 = 0b111,
126 }
127
128 impl SampleTime {
129 pub(crate) fn sample_time(&self) -> crate::pac::adc::vals::SampleTime {
130 match self {
131 SampleTime::Cycles2_5 => crate::pac::adc::vals::SampleTime::CYCLES2_5,
132 SampleTime::Cycles6_5 => crate::pac::adc::vals::SampleTime::CYCLES6_5,
133 SampleTime::Cycles12_5 => crate::pac::adc::vals::SampleTime::CYCLES12_5,
134 SampleTime::Cycles24_5 => crate::pac::adc::vals::SampleTime::CYCLES24_5,
135 SampleTime::Cycles47_5 => crate::pac::adc::vals::SampleTime::CYCLES47_5,
136 SampleTime::Cycles92_5 => crate::pac::adc::vals::SampleTime::CYCLES92_5,
137 SampleTime::Cycles247_5 => crate::pac::adc::vals::SampleTime::CYCLES247_5,
138 SampleTime::Cycles640_5 => crate::pac::adc::vals::SampleTime::CYCLES640_5,
139 }
140 }
141 }
142
143 impl Default for SampleTime {
144 fn default() -> Self {
145 Self::Cycles2_5
146 }
147 }
148}
149
150#[cfg(adc_g0)]
151mod sample_time {
152 /// ADC sample time
153 ///
154 /// The default setting is 1.5 ADC clock cycles.
155 #[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
156 pub enum SampleTime {
157 /// 1.5 ADC clock cycles
158 Cycles1_5 = 0b000,
159
160 /// 3.5 ADC clock cycles
161 Cycles3_5 = 0b001,
162
163 /// 7.5 ADC clock cycles
164 Cycles7_5 = 0b010,
165
166 /// 12.5 ADC clock cycles
167 Cycles12_5 = 0b011,
168
169 /// 19.5 ADC clock cycles
170 Cycles19_5 = 0b100,
171
172 /// 39.5 ADC clock cycles
173 Cycles39_5 = 0b101,
174
175 /// 79.5 ADC clock cycles
176 Cycles79_5 = 0b110,
177
178 /// 160.5 ADC clock cycles
179 Cycles160_5 = 0b111,
180 }
181
182 impl SampleTime {
183 pub(crate) fn sample_time(&self) -> crate::pac::adc::vals::SampleTime {
184 match self {
185 SampleTime::Cycles1_5 => crate::pac::adc::vals::SampleTime::CYCLES1_5,
186 SampleTime::Cycles3_5 => crate::pac::adc::vals::SampleTime::CYCLES3_5,
187 SampleTime::Cycles7_5 => crate::pac::adc::vals::SampleTime::CYCLES7_5,
188 SampleTime::Cycles12_5 => crate::pac::adc::vals::SampleTime::CYCLES12_5,
189 SampleTime::Cycles19_5 => crate::pac::adc::vals::SampleTime::CYCLES19_5,
190 SampleTime::Cycles39_5 => crate::pac::adc::vals::SampleTime::CYCLES39_5,
191 SampleTime::Cycles79_5 => crate::pac::adc::vals::SampleTime::CYCLES79_5,
192 SampleTime::Cycles160_5 => crate::pac::adc::vals::SampleTime::CYCLES160_5,
193 }
194 }
195 }
196
197 impl Default for SampleTime {
198 fn default() -> Self {
199 Self::Cycles1_5
200 }
201 }
202}
203
204pub use sample_time::SampleTime;
205
206pub struct Adc<'d, T: Instance> { 96pub struct Adc<'d, T: Instance> {
207 sample_time: SampleTime, 97 sample_time: SampleTime,
208 resolution: Resolution, 98 resolution: Resolution,
diff --git a/embassy-stm32/src/adc/v4.rs b/embassy-stm32/src/adc/v4.rs
index 2b8f10533..b9222947b 100644
--- a/embassy-stm32/src/adc/v4.rs
+++ b/embassy-stm32/src/adc/v4.rs
@@ -5,7 +5,7 @@ use embedded_hal_02::blocking::delay::DelayUs;
5use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel}; 5use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel};
6use pac::adccommon::vals::Presc; 6use pac::adccommon::vals::Presc;
7 7
8use super::{AdcPin, Instance, InternalChannel}; 8use super::{AdcPin, Instance, InternalChannel, SampleTime};
9use crate::time::Hertz; 9use crate::time::Hertz;
10use crate::{pac, Peripheral}; 10use crate::{pac, Peripheral};
11 11
@@ -193,57 +193,6 @@ foreach_peripheral!(
193 }; 193 };
194); 194);
195 195
196/// ADC sample time
197///
198/// The default setting is 2.5 ADC clock cycles.
199#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
200pub enum SampleTime {
201 /// 1.5 ADC clock cycles
202 Cycles1_5,
203
204 /// 2.5 ADC clock cycles
205 Cycles2_5,
206
207 /// 8.5 ADC clock cycles
208 Cycles8_5,
209
210 /// 16.5 ADC clock cycles
211 Cycles16_5,
212
213 /// 32.5 ADC clock cycles
214 Cycles32_5,
215
216 /// 64.5 ADC clock cycles
217 Cycles64_5,
218
219 /// 387.5 ADC clock cycles
220 Cycles387_5,
221
222 /// 810.5 ADC clock cycles
223 Cycles810_5,
224}
225
226impl SampleTime {
227 pub(crate) fn sample_time(&self) -> pac::adc::vals::Smp {
228 match self {
229 SampleTime::Cycles1_5 => pac::adc::vals::Smp::CYCLES1_5,
230 SampleTime::Cycles2_5 => pac::adc::vals::Smp::CYCLES2_5,
231 SampleTime::Cycles8_5 => pac::adc::vals::Smp::CYCLES8_5,
232 SampleTime::Cycles16_5 => pac::adc::vals::Smp::CYCLES16_5,
233 SampleTime::Cycles32_5 => pac::adc::vals::Smp::CYCLES32_5,
234 SampleTime::Cycles64_5 => pac::adc::vals::Smp::CYCLES64_5,
235 SampleTime::Cycles387_5 => pac::adc::vals::Smp::CYCLES387_5,
236 SampleTime::Cycles810_5 => pac::adc::vals::Smp::CYCLES810_5,
237 }
238 }
239}
240
241impl Default for SampleTime {
242 fn default() -> Self {
243 Self::Cycles1_5
244 }
245}
246
247// NOTE (unused): The prescaler enum closely copies the hardware capabilities, 196// NOTE (unused): The prescaler enum closely copies the hardware capabilities,
248// but high prescaling doesn't make a lot of sense in the current implementation and is ommited. 197// but high prescaling doesn't make a lot of sense in the current implementation and is ommited.
249#[allow(unused)] 198#[allow(unused)]