1//! Low-level timer driver.
2
3use crate::pac::lptim::vals;
4
5pub enum Prescaler {
6 Div1,
7 Div2,
8 Div4,
9 Div8,
10 Div16,
11 Div32,
12 Div64,
13 Div128,
14}
15
16impl From<&Prescaler> for vals::Presc {
17 fn from(prescaler: &Prescaler) -> Self {
18 match prescaler {
19 Prescaler::Div1 => vals::Presc::DIV1,
20 Prescaler::Div2 => vals::Presc::DIV2,
21 Prescaler::Div4 => vals::Presc::DIV4,
22 Prescaler::Div8 => vals::Presc::DIV8,
23 Prescaler::Div16 => vals::Presc::DIV16,
24 Prescaler::Div32 => vals::Presc::DIV32,
25 Prescaler::Div64 => vals::Presc::DIV64,
26 Prescaler::Div128 => vals::Presc::DIV128,
27 }
28 }
29}
30
31impl From<vals::Presc> for Prescaler {
32 fn from(prescaler: vals::Presc) -> Self {
33 match prescaler {
34 vals::Presc::DIV1 => Prescaler::Div1,
35 vals::Presc::DIV2 => Prescaler::Div2,
36 vals::Presc::DIV4 => Prescaler::Div4,
37 vals::Presc::DIV8 => Prescaler::Div8,
38 vals::Presc::DIV16 => Prescaler::Div16,
39 vals::Presc::DIV32 => Prescaler::Div32,
40 vals::Presc::DIV64 => Prescaler::Div64,
41 vals::Presc::DIV128 => Prescaler::Div128,
42 }
43 }
44}
45
46impl From<&Prescaler> for u32 {
47 fn from(prescaler: &Prescaler) -> Self {
48 match prescaler {
49 Prescaler::Div1 => 1,
50 Prescaler::Div2 => 2,
51 Prescaler::Div4 => 4,
52 Prescaler::Div8 => 8,
53 Prescaler::Div16 => 16,
54 Prescaler::Div32 => 32,
55 Prescaler::Div64 => 64,
56 Prescaler::Div128 => 128,
57 }
58 }
59}
60
61impl From<u32> for Prescaler {
62 fn from(prescaler: u32) -> Self {
63 match prescaler {
64 1 => Prescaler::Div1,
65 2 => Prescaler::Div2,
66 4 => Prescaler::Div4,
67 8 => Prescaler::Div8,
68 16 => Prescaler::Div16,
69 32 => Prescaler::Div32,
70 64 => Prescaler::Div64,
71 128 => Prescaler::Div128,
72 _ => unreachable!(),
73 }
74 }
75}
76
77impl Prescaler {
78 pub fn from_ticks(ticks: u32) -> Self {
79 // We need to scale down to a 16-bit range
80 (ticks >> 16).next_power_of_two().into()
81 }
82
83 pub fn scale_down(&self, ticks: u32) -> u16 {
84 (ticks / u32::from(self)).try_into().unwrap()
85 }
86
87 pub fn scale_up(&self, ticks: u16) -> u32 {
88 u32::from(self) * ticks as u32
89 }
90}
91