use super::Clocking;
use crate::pac::TMR1;
use core::marker::PhantomData;
#[derive(Clone, Copy, Debug)]
#[repr(u8)]
pub enum ClockPrescale {
Prescale1 = 0,
Prescale8 = 1,
Prescale64 = 2,
Prescale256 = 3,
}
pub struct TimerSynchronous;
pub struct TimerAsynchronous;
pub struct Timer<MODE> {
timer: TMR1,
_marker: PhantomData<MODE>,
}
impl<MODE> Timer<MODE> {
pub fn timer1_synchronous(
timer: TMR1,
clocking: Clocking,
prescale: ClockPrescale,
period: u16,
stop_in_idle_mode: bool,
) -> Timer<TimerSynchronous> {
timer.cont.write(|w| unsafe { w
.sidl().bit(stop_in_idle_mode)
.tgate().bit(clocking == Clocking::PbclockGated)
.tckps().bits(prescale as u8)
.tsync().set_bit()
.tcs().bit(clocking == Clocking::External)
});
timer.tmr.write(|w| unsafe { w.tmr().bits(0) });
timer.pr.write(|w| unsafe { w.pr().bits(period as u32) });
timer.contset.write(|w| w.on().set_bit());
Timer { timer, _marker: PhantomData }
}
pub fn timer1_asynchronous(
timer: TMR1,
prescale: ClockPrescale,
period: u16,
stop_in_idle_mode: bool,
) -> Timer<TimerAsynchronous> {
timer.tmr.write(|w| unsafe { w.tmr().bits(0) });
timer.pr.write(|w| unsafe { w.pr().bits(period as u32) });
timer.cont.write(|w| unsafe { w
.sidl().bit(stop_in_idle_mode)
.twdis().clear_bit()
.tgate().clear_bit()
.tckps().bits(prescale as u8)
.tsync().clear_bit()
.tcs().set_bit()
});
timer.contset.write(|w| w.on().set_bit());
Timer { timer, _marker: PhantomData }
}
pub fn free(self) -> TMR1 {
self.timer.contclr.write(|w| w.on().set_bit());
self.timer
}
pub fn tmr(&self) -> u16 {
self.timer.tmr.read().tmr().bits() as u16
}
pub fn period(&self) -> u16 {
self.timer.pr.read().pr().bits() as u16
}
pub fn set_period(&mut self, period: u16) {
self.timer.pr.write(|w| unsafe { w.pr().bits(period as u32) });
}
}
impl Timer<TimerSynchronous> {
pub fn set_tmr(&mut self, tmr: u16) {
self.timer.tmr.write(|w| unsafe { w.tmr().bits(tmr as u32) });
}
}
impl Timer<TimerAsynchronous> {
pub fn set_tmr(&mut self, tmr: u16) {
while self.timer.cont.read().twip().bit_is_set() {}
self.timer.tmr.write(|w| unsafe { w.tmr().bits(tmr as u32) });
}
}