//! Time units use cortex_m::peripheral::DWT; use crate::cs::Clocks; /// Bits per seconds #[derive(Clone, Copy)] pub struct Bps(pub u32); /// Hertz #[derive(Clone, Copy)] pub struct Hertz(pub u32); /// KiloHertz #[derive(Clone, Copy)] pub struct KiloHertz(pub u32); /// MegaHertz #[derive(Clone, Copy)] pub struct MegaHertz(pub u32); /// Extension trait to add convenience methods to `u32` pub trait U32Ext { /// Wrap in `Bps` fn bps(self) -> Bps; /// Wrap in `Hertz` fn hz(self) -> Hertz; /// Wrap in `KiloHertz` fn khz(self) -> KiloHertz; /// Wrap in `MegaHertz` fn mhz(self) -> MegaHertz; } impl U32Ext for u32 { fn bps(self) -> Bps { Bps(self) } fn hz(self) -> Hertz { Hertz(self) } fn khz(self) -> KiloHertz { KiloHertz(self) } fn mhz(self) -> MegaHertz { MegaHertz(self) } } impl Into for KiloHertz { fn into(self) -> Hertz { Hertz(self.0 * 1_000) } } impl Into for MegaHertz { fn into(self) -> Hertz { Hertz(self.0 * 1_000_000) } } impl Into for MegaHertz { fn into(self) -> KiloHertz { KiloHertz(self.0 * 1_000) } } /// A monotonic nondecreasing timer #[derive(Clone, Copy)] pub struct MonoTimer { frequency: Hertz, } impl MonoTimer { /// Create a new monotonic timer pub fn new(mut dwt: DWT, clocks: Clocks) -> Self { dwt.enable_cycle_counter(); // can't stop or reset CYCCNT drop(dwt); MonoTimer { frequency: clocks.sysclk(), } } /// Return the frequency at which the timer is operating pub fn frequency(&self) -> Hertz { self.frequency } /// Returns an `Instant` corresponding to "now" pub fn now(&self) -> Instant { Instant { now: DWT::get_cycle_count(), } } } /// A measurement from a monotonically nondecreasing clock #[derive(Clone, Copy)] pub struct Instant { now: u32, } impl Instant { /// Ticks elapsed since the `Instant` was created pub fn elapsed(&self) -> u32 { DWT::get_cycle_count().wrapping_sub(self.now) } }