asm_delay/
lib.rs

1//! no_std implementation of DelayMs and DelayUs for cortex-m
2
3#![deny(missing_docs)]
4#![no_std]
5
6pub use bitrate;
7use bitrate::*;
8use cortex_m::asm::delay;
9use embedded_hal::delay::DelayNs;
10
11/// asm::delay based Timer
12pub struct AsmDelay {
13    freq_base_ns: u32,
14}
15
16impl AsmDelay {
17    /// Consturct new delay timer of CPU frequency (Hertz)
18    pub fn new<F>(freq: F) -> Self
19    where
20        F: Into<Hertz<u32>>,
21    {
22        let freq_hz = freq.into().0;
23        AsmDelay {
24            freq_base_ns: (freq_hz / 1_000_000_000) / 2,
25        }
26    }
27}
28
29impl DelayNs for AsmDelay
30{
31    fn delay_ns(&mut self, ns: u32) {
32        delay(self.freq_base_ns * ns)
33    }
34}
35
36/// Convert cycles back to time
37pub struct CyclesToTime {
38    freq_base_ms: f32,
39    freq_base_us: f32,
40    freq_base_ns: f32,
41}
42
43impl CyclesToTime {
44    /// Consturct new cycles to time converter of CPU frequency (Hertz)
45    pub fn new<F>(freq: F) -> Self
46    where
47        F: Into<Hertz<u32>>,
48    {
49        let freq_hz = freq.into().0;
50        CyclesToTime {
51            freq_base_ms: (freq_hz / 1_000) as f32,
52            freq_base_us: (freq_hz / 1_000_000) as f32,
53            freq_base_ns: (freq_hz / 1_000_000_00) as f32,
54        }
55    }
56
57    /// Converts cycles to ms
58    pub fn to_ms<U>(&self, cycles: U) -> f32
59    where
60        U: Into<u32>,
61    {
62        (cycles.into() as f32) / self.freq_base_ms
63    }
64
65    /// Converts cycles to us
66    pub fn to_us<U>(&self, cycles: U) -> f32
67    where
68        U: Into<u32>,
69    {
70        (cycles.into() as f32) / self.freq_base_us
71    }
72
73    /// Converts cycles to ns
74    pub fn to_ns<U>(&self, cycles: U) -> f32
75    where
76        U: Into<u32>,
77    {
78        (cycles.into() as f32) / self.freq_base_ns
79    }
80}