lpc55_hal/peripherals/
ctimer.rs1use crate::{
2 peripherals::syscon::Syscon,
3 raw,
4 typestates::{init_state, ClocksSupport1MhzFroToken},
5};
6use core::ops::Deref;
7
8pub type Ctimers = (Ctimer0, Ctimer1, Ctimer2, Ctimer3, Ctimer4);
9
10pub trait Ctimer<State>: Deref<Target = raw::ctimer0::RegisterBlock> {}
11
12macro_rules! ctimer {
13 ($c_hal:ident, $c_pac:ident, $register:ident, $clock_input:ident) => {
14 crate::wrap_stateful_peripheral!($c_hal, $c_pac);
15
16 impl Deref for $c_hal<init_state::Enabled> {
17 type Target = raw::ctimer0::RegisterBlock;
18 fn deref(&self) -> &Self::Target {
19 &self.raw
20 }
21 }
22 impl Ctimer<init_state::Enabled> for $c_hal<init_state::Enabled> {}
23
24 impl<State> $c_hal<State> {
25 pub fn enabled(
26 mut self,
27 syscon: &mut Syscon,
28 _token: ClocksSupport1MhzFroToken,
29 ) -> $c_hal<init_state::Enabled> {
30 syscon.enable_clock(&mut self.raw);
31 syscon.raw.$register().write(|w| w.sel().$clock_input());
32 syscon.reset(&mut self.raw);
33 $c_hal {
34 raw: self.raw,
35 _state: init_state::Enabled(()),
36 }
37 }
38
39 pub fn disabled(mut self, syscon: &mut Syscon) -> $c_hal<init_state::Disabled> {
40 syscon.disable_clock(&mut self.raw);
41 syscon.raw.$register().write(|w| w.sel().enum_0x7()); $c_hal {
43 raw: self.raw,
44 _state: init_state::Disabled,
45 }
46 }
47 }
48 };
49}
50
51ctimer!(Ctimer0, CTIMER0, ctimerclksel0, enum_0x4); ctimer!(Ctimer1, CTIMER1, ctimerclksel1, enum_0x4);
53ctimer!(Ctimer2, CTIMER2, ctimerclksel2, enum_0x4);
54ctimer!(Ctimer3, CTIMER3, ctimerclksel3, enum_0x4);
55ctimer!(Ctimer4, CTIMER4, ctimerclksel4, enum_0x4);