Skip to content

Commit 1ad84e7

Browse files
committed
Add support for setting ADC sample time
1 parent c03b4a5 commit 1ad84e7

File tree

1 file changed

+83
-20
lines changed

1 file changed

+83
-20
lines changed

src/adc.rs

Lines changed: 83 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use crate::{
1616
pub struct ADC {
1717
inner: pac::ADC,
1818
resolution: Resolution,
19+
sample_time: SampleTime,
1920
}
2021

2122
impl ADC {
@@ -69,6 +70,7 @@ impl ADC {
6970
Self {
7071
inner,
7172
resolution: Resolution::default(),
73+
sample_time: SampleTime::default(),
7274
}
7375
}
7476

@@ -77,6 +79,11 @@ impl ADC {
7779
self.resolution = resolution;
7880
}
7981

82+
/// Set the sample time
83+
pub fn set_sample_time(&mut self, sample_time: SampleTime) {
84+
self.sample_time = sample_time;
85+
}
86+
8087
/// Release the ADC peripheral
8188
///
8289
/// Drops `ADC` and returns the `pac::ADC` that is was wrapping, giving the
@@ -92,7 +99,7 @@ where
9299
{
93100
type Error = Infallible;
94101

95-
fn read(&mut self, _: &mut C) -> nb::Result<u16, Self::Error> {
102+
fn read(&mut self, channel: &mut C) -> nb::Result<u16, Self::Error> {
96103
// Enable ADC
97104
self.inner.isr.write(|w| w.adrdy().set_bit());
98105
self.inner.cr.modify(|_, w| w.aden().set_bit());
@@ -105,6 +112,9 @@ where
105112
unsafe { w.res().bits(self.resolution as u8) }
106113
});
107114

115+
// Configure channel
116+
channel.set_sample_time(&self.inner, self.sample_time);
117+
108118
// Select channel
109119
self.inner.sqr1.write(|w| {
110120
// This is sound, as all `Channel` implementations set valid values.
@@ -154,14 +164,54 @@ impl Default for Resolution {
154164
}
155165
}
156166

167+
/// ADC sample time
168+
///
169+
/// The default setting is 2.5 ADC clock cycles.
170+
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
171+
pub enum SampleTime {
172+
/// 2.5 ADC clock cycles
173+
Cycles2_5 = 0b000,
174+
175+
/// 6.5 ADC clock cycles
176+
Cycles6_5 = 0b001,
177+
178+
/// 12.5 ADC clock cycles
179+
Cycles12_5 = 0b010,
180+
181+
/// 24.5 ADC clock cycles
182+
Cycles24_5 = 0b011,
183+
184+
/// 47.5 ADC clock cycles
185+
Cycles47_5 = 0b100,
186+
187+
/// 92.5 ADC clock cycles
188+
Cycles92_5 = 0b101,
189+
190+
/// 247.5 ADC clock cycles
191+
Cycles247_5 = 0b110,
192+
193+
/// 640.5 ADC clock cycles
194+
Cycles640_5 = 0b111,
195+
}
196+
197+
impl Default for SampleTime {
198+
fn default() -> Self {
199+
Self::Cycles2_5
200+
}
201+
}
202+
157203
/// Implemented for all types that represent ADC channels
158-
pub trait Channel: EmbeddedHalChannel<ADC, ID = u8> {}
204+
pub trait Channel: EmbeddedHalChannel<ADC, ID = u8> {
205+
fn set_sample_time(&mut self, adc: &pac::ADC, sample_time: SampleTime);
206+
}
159207

160208
macro_rules! external_channels {
161209
(
162210
$(
163211
$id:expr,
164-
$pin:ident;
212+
$pin:ident,
213+
$smpr:ident,
214+
$smp:ident;
165215
)*
166216
) => {
167217
$(
@@ -173,26 +223,39 @@ macro_rules! external_channels {
173223
}
174224
}
175225

176-
impl Channel for crate::gpio::$pin<Analog> {}
226+
impl Channel for crate::gpio::$pin<Analog> {
227+
fn set_sample_time(&mut self,
228+
adc: &pac::ADC,
229+
sample_time: SampleTime,
230+
) {
231+
adc.$smpr.modify(|_, w| {
232+
// This is sound, as all `SampleTime` values are valid
233+
// for this field.
234+
unsafe {
235+
w.$smp().bits(sample_time as u8)
236+
}
237+
})
238+
}
239+
}
177240
)*
178241
};
179242
}
180243

181244
external_channels!(
182-
1, PC0;
183-
2, PC1;
184-
3, PC2;
185-
4, PC3;
186-
5, PA0;
187-
6, PA1;
188-
7, PA2;
189-
8, PA3;
190-
9, PA4;
191-
10, PA5;
192-
11, PA6;
193-
12, PA7;
194-
13, PC4;
195-
14, PC5;
196-
15, PB0;
197-
16, PB1;
245+
1, PC0, smpr1, smp1;
246+
2, PC1, smpr1, smp2;
247+
3, PC2, smpr1, smp3;
248+
4, PC3, smpr1, smp4;
249+
5, PA0, smpr1, smp5;
250+
6, PA1, smpr1, smp6;
251+
7, PA2, smpr1, smp7;
252+
8, PA3, smpr1, smp8;
253+
9, PA4, smpr1, smp9;
254+
10, PA5, smpr2, smp10;
255+
11, PA6, smpr2, smp11;
256+
12, PA7, smpr2, smp12;
257+
13, PC4, smpr2, smp13;
258+
14, PC5, smpr2, smp14;
259+
15, PB0, smpr2, smp15;
260+
16, PB1, smpr2, smp16;
198261
);

0 commit comments

Comments
 (0)