123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- //! Time units
- use cortex_m::peripheral::DWT;
- use crate::rcc::Clocks;
- /// Bits per second
- #[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 that adds convenience methods to the `u32` type
- 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 {
- /// Creates a new `Monotonic` timer
- pub fn new(mut dwt: DWT, clocks: Clocks) -> Self {
- dwt.enable_cycle_counter();
- // now the CYCCNT counter can't be stopped or resetted
- drop(dwt);
- MonoTimer {
- frequency: clocks.sysclk(),
- }
- }
- /// Returns the frequency at which the monotonic timer is operating at
- 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 of 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)
- }
- }
|