118 lines
2.1 KiB
Rust
118 lines
2.1 KiB
Rust
//! 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<Hertz> for KiloHertz {
|
|
fn into(self) -> Hertz {
|
|
Hertz(self.0 * 1_000)
|
|
}
|
|
}
|
|
|
|
impl Into<Hertz> for MegaHertz {
|
|
fn into(self) -> Hertz {
|
|
Hertz(self.0 * 1_000_000)
|
|
}
|
|
}
|
|
|
|
impl Into<KiloHertz> 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)
|
|
}
|
|
}
|