1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
/// Control register.
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct Cr {
val: u32,
}
impl Cr {
/// Reset value of the register.
///
/// # Example
///
/// ```
/// use stm32wlxx_hal::lptim::Cr;
/// assert_eq!(Cr::RESET.raw(), 0);
/// ```
pub const RESET: Cr = Cr::new(0);
/// Reset value + timer disabled.
///
/// This is equivalent to the reset value, it is provided to make the code
/// more expressive.
///
/// # Example
///
/// ```
/// use stm32wlxx_hal::lptim::Cr;
/// assert_eq!(Cr::DISABLE.enabled(), false);
/// assert_eq!(Cr::DISABLE, Cr::RESET);
/// ```
pub const DISABLE: Cr = Cr::RESET.set_enable(false);
/// Create a new Cr register from a raw value.
///
/// # Example
///
/// ```
/// use stm32wlxx_hal::lptim::Cr;
/// const CR: Cr = Cr::new(0b1);
/// ```
pub const fn new(val: u32) -> Cr {
Cr { val }
}
/// Get the raw value of the register.
///
/// # Example
///
/// ```
/// use stm32wlxx_hal::lptim::Cr;
/// const CR: Cr = Cr::new(0x1234_5678);
/// assert_eq!(CR.raw(), 0x1234_5678);
/// ```
pub const fn raw(self) -> u32 {
self.val
}
/// Set the counter reset.
///
/// This bit is cleared by hardware.
#[must_use = "set_cnt_rst returns a modified Cr"]
pub const fn set_cnt_rst(mut self) -> Cr {
self.val |= 1 << 3;
self
}
/// Returns `true` if the counter reset bit is set.
pub const fn cnt_rst(&self) -> bool {
self.val & (1 << 3) != 0
}
/// Start the timer in continuous mode.
#[must_use = "set_continuous returns a modified Cr"]
pub const fn set_continuous(mut self) -> Cr {
self.val |= 1 << 2;
self
}
/// Start the timer in single-shot mode.
#[must_use = "set_single returns a modified Cr"]
pub const fn set_single(mut self) -> Cr {
self.val |= 1 << 1;
self
}
/// Set the enable bit for the timer.
///
/// # Example
///
/// ```
/// use stm32wlxx_hal::lptim::Cr;
///
/// let cr = Cr::RESET;
/// assert_eq!(cr.enabled(), false);
///
/// let cr = cr.set_enable(true);
/// assert_eq!(cr.enabled(), true);
///
/// let cr = cr.set_enable(false);
/// assert_eq!(cr.enabled(), false);
/// ```
#[must_use = "set_enable returns a modified Cr"]
pub const fn set_enable(self, en: bool) -> Cr {
if en {
self.enable()
} else {
self.disable()
}
}
/// Enable the LPTIM peripheral.
///
/// # Example
///
/// ```
/// use stm32wlxx_hal::lptim::Cr;
///
/// let cr = Cr::RESET;
/// assert_eq!(cr.enabled(), false);
///
/// let cr = cr.enable();
/// assert_eq!(cr.enabled(), true);
///
/// let cr = cr.disable();
/// assert_eq!(cr.enabled(), false);
/// ```
#[must_use = "enable returns a modified Cr"]
pub const fn enable(mut self) -> Cr {
self.val |= 0b1;
self
}
/// Disable the LPTIM peripheral.
///
/// # Example
///
/// ```
/// use stm32wlxx_hal::lptim::Cr;
///
/// let cr = Cr::RESET;
/// assert_eq!(cr.enabled(), false);
///
/// let cr = cr.enable();
/// assert_eq!(cr.enabled(), true);
///
/// let cr = cr.disable();
/// assert_eq!(cr.enabled(), false);
/// ```
#[must_use = "disable returns a modified Cr"]
pub const fn disable(mut self) -> Cr {
self.val &= !0b1;
self
}
/// Returns `true` if the timer is enabled.
pub const fn enabled(&self) -> bool {
self.val & 0b1 != 0
}
}
impl From<u32> for Cr {
fn from(val: u32) -> Self {
Self { val }
}
}
impl From<Cr> for u32 {
fn from(cr: Cr) -> Self {
cr.val
}
}
impl Default for Cr {
fn default() -> Self {
Cr::RESET
}
}