lpc55_hal/peripherals/
ctimer.rs

1use 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()); // no clock
42                $c_hal {
43                    raw: self.raw,
44                    _state: init_state::Disabled,
45                }
46            }
47        }
48    };
49}
50
51ctimer!(Ctimer0, CTIMER0, ctimerclksel0, enum_0x4); // 4 is 1MHz FRO
52ctimer!(Ctimer1, CTIMER1, ctimerclksel1, enum_0x4);
53ctimer!(Ctimer2, CTIMER2, ctimerclksel2, enum_0x4);
54ctimer!(Ctimer3, CTIMER3, ctimerclksel3, enum_0x4);
55ctimer!(Ctimer4, CTIMER4, ctimerclksel4, enum_0x4);