Adding sampling_timer file
This commit is contained in:
parent
3b953e36aa
commit
56bcf1e0aa
|
@ -0,0 +1,107 @@
|
||||||
|
///! The sampling timer is used for managing ADC sampling and external reference timestamping.
|
||||||
|
use super::hal;
|
||||||
|
|
||||||
|
pub use hal::stm32::tim2::ccmr2_input::CC4S_A;
|
||||||
|
|
||||||
|
/// The timer used for managing ADC sampling.
|
||||||
|
pub struct SamplingTimer {
|
||||||
|
timer: hal::timer::Timer<hal::stm32::TIM2>,
|
||||||
|
channels: Option<TimerChannels>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SamplingTimer {
|
||||||
|
/// Construct the sampling timer.
|
||||||
|
pub fn new(mut timer: hal::timer::Timer<hal::stm32::TIM2>) -> Self {
|
||||||
|
timer.pause();
|
||||||
|
|
||||||
|
Self {
|
||||||
|
timer,
|
||||||
|
channels: Some(TimerChannels::new()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the timer capture/compare channels.
|
||||||
|
pub fn channels(&mut self) -> TimerChannels {
|
||||||
|
self.channels.take().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Start the sampling timer.
|
||||||
|
pub fn start(&mut self) {
|
||||||
|
self.timer.reset_counter();
|
||||||
|
self.timer.resume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The capture/compare channels for the sampling timer.
|
||||||
|
///
|
||||||
|
/// # Note
|
||||||
|
/// This should not be instantiated directly.
|
||||||
|
pub struct TimerChannels {
|
||||||
|
pub ch1: Timer2Channel1,
|
||||||
|
pub ch2: Timer2Channel2,
|
||||||
|
pub ch3: Timer2Channel3,
|
||||||
|
pub ch4: Timer2Channel4,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TimerChannels {
|
||||||
|
fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
ch1: Timer2Channel1 {},
|
||||||
|
ch2: Timer2Channel2 {},
|
||||||
|
ch3: Timer2Channel3 {},
|
||||||
|
ch4: Timer2Channel4 {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Representation of CH1 of TIM2.
|
||||||
|
pub struct Timer2Channel1 {}
|
||||||
|
|
||||||
|
impl Timer2Channel1 {
|
||||||
|
/// Allow CH1 to generate DMA requests.
|
||||||
|
pub fn listen_dma(&self) {
|
||||||
|
let regs = unsafe { &*hal::stm32::TIM2::ptr() };
|
||||||
|
regs.dier.modify(|_, w| w.cc1de().set_bit());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Operate CH1 as an output-compare.
|
||||||
|
///
|
||||||
|
/// # Args
|
||||||
|
/// * `value` - The value to compare the sampling timer's counter against.
|
||||||
|
pub fn to_output_compare(&self, value: u32) {
|
||||||
|
let regs = unsafe { &*hal::stm32::TIM2::ptr() };
|
||||||
|
assert!(value <= regs.arr.read().bits());
|
||||||
|
regs.ccr1.write(|w| w.ccr().bits(value));
|
||||||
|
regs.ccmr1_output()
|
||||||
|
.modify(|_, w| unsafe { w.cc1s().bits(0) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Representation of CH2 of TIM2.
|
||||||
|
pub struct Timer2Channel2 {}
|
||||||
|
|
||||||
|
impl Timer2Channel2 {
|
||||||
|
/// Allow CH2 to generate DMA requests.
|
||||||
|
pub fn listen_dma(&self) {
|
||||||
|
let regs = unsafe { &*hal::stm32::TIM2::ptr() };
|
||||||
|
regs.dier.modify(|_, w| w.cc2de().set_bit());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Operate CH2 as an output-compare.
|
||||||
|
///
|
||||||
|
/// # Args
|
||||||
|
/// * `value` - The value to compare the sampling timer's counter against.
|
||||||
|
pub fn to_output_compare(&self, value: u32) {
|
||||||
|
let regs = unsafe { &*hal::stm32::TIM2::ptr() };
|
||||||
|
assert!(value <= regs.arr.read().bits());
|
||||||
|
regs.ccr2.write(|w| w.ccr().bits(value));
|
||||||
|
regs.ccmr1_output()
|
||||||
|
.modify(|_, w| unsafe { w.cc2s().bits(0) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Representation of CH3 of TIM2.
|
||||||
|
pub struct Timer2Channel3 {}
|
||||||
|
|
||||||
|
/// Representation of CH4 of TIM2.
|
||||||
|
pub struct Timer2Channel4 {}
|
Loading…
Reference in New Issue