Systick runs at 1 kHz

This commit is contained in:
Emil Fresk 2023-01-24 12:34:11 +01:00 committed by Henrik Tjäder
parent 143cd136ee
commit bdf577c308

View file

@ -10,11 +10,12 @@ use cortex_m::peripheral::SYST;
use embedded_hal_async::delay::DelayUs; use embedded_hal_async::delay::DelayUs;
use fugit::ExtU32; use fugit::ExtU32;
/// Systick implementing `rtic_monotonic::Monotonic` which runs at a const TIMER_HZ: u32 = 1_000;
/// settable rate using the `TIMER_HZ` parameter.
pub struct Systick<const TIMER_HZ: u32>;
impl<const TIMER_HZ: u32> Systick<TIMER_HZ> { /// Systick implementing `rtic_monotonic::Monotonic` which runs at 1 kHz.
pub struct Systick;
impl Systick {
/// Start a `Monotonic` based on SysTick. /// Start a `Monotonic` based on SysTick.
/// ///
/// The `sysclk` parameter is the speed at which SysTick runs at. This value should come from /// The `sysclk` parameter is the speed at which SysTick runs at. This value should come from
@ -49,7 +50,7 @@ impl<const TIMER_HZ: u32> Systick<TIMER_HZ> {
static SYSTICK_CNT: AtomicU32 = AtomicU32::new(0); static SYSTICK_CNT: AtomicU32 = AtomicU32::new(0);
impl<const TIMER_HZ: u32> Monotonic for Systick<TIMER_HZ> { impl Monotonic for Systick {
type Instant = fugit::TimerInstantU32<TIMER_HZ>; type Instant = fugit::TimerInstantU32<TIMER_HZ>;
type Duration = fugit::TimerDurationU32<TIMER_HZ>; type Duration = fugit::TimerDurationU32<TIMER_HZ>;
@ -87,17 +88,17 @@ impl<const TIMER_HZ: u32> Monotonic for Systick<TIMER_HZ> {
} }
/// Timer queue wrapper to implement traits on /// Timer queue wrapper to implement traits on
pub struct SystickTimerQueue<const TIMER_HZ: u32>(TimerQueue<Systick<TIMER_HZ>>); pub struct SystickTimerQueue(TimerQueue<Systick>);
impl<const TIMER_HZ: u32> SystickTimerQueue<TIMER_HZ> { impl SystickTimerQueue {
/// Create a new timer queue. /// Create a new timer queue.
pub const fn new() -> Self { pub const fn new() -> Self {
Self(TimerQueue::new()) Self(TimerQueue::new())
} }
} }
impl<const TIMER_HZ: u32> Deref for SystickTimerQueue<TIMER_HZ> { impl Deref for SystickTimerQueue {
type Target = TimerQueue<Systick<TIMER_HZ>>; type Target = TimerQueue<Systick>;
#[inline(always)] #[inline(always)]
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
@ -105,7 +106,7 @@ impl<const TIMER_HZ: u32> Deref for SystickTimerQueue<TIMER_HZ> {
} }
} }
impl<const TIMER_HZ: u32> DelayUs for SystickTimerQueue<TIMER_HZ> { impl DelayUs for SystickTimerQueue {
type Error = core::convert::Infallible; type Error = core::convert::Infallible;
async fn delay_us(&mut self, us: u32) -> Result<(), Self::Error> { async fn delay_us(&mut self, us: u32) -> Result<(), Self::Error> {
@ -122,8 +123,8 @@ impl<const TIMER_HZ: u32> DelayUs for SystickTimerQueue<TIMER_HZ> {
/// Register the Systick interrupt and crate a timer queue with a specific name and speed. /// Register the Systick interrupt and crate a timer queue with a specific name and speed.
#[macro_export] #[macro_export]
macro_rules! make_systick_timer_queue { macro_rules! make_systick_timer_queue {
($timer_queue_name:ident, $systick_speed:expr) => { ($timer_queue_name:ident) => {
static $timer_queue_name: SystickTimerQueue<$systick_speed> = SystickTimerQueue::new(); static $timer_queue_name: SystickTimerQueue = SystickTimerQueue::new();
#[no_mangle] #[no_mangle]
#[allow(non_snake_case)] #[allow(non_snake_case)]