mirror of
https://github.com/italicsjenga/rp-hal-boards.git
synced 2024-12-23 20:51:31 +11:00
timer: Use a fixed type in Alarm::schedule (#442)
This commit is contained in:
parent
0e2b4cf7be
commit
5ce10ff94e
|
@ -7,13 +7,13 @@ use panic_halt as _;
|
||||||
mod app {
|
mod app {
|
||||||
|
|
||||||
use embedded_hal::digital::v2::OutputPin;
|
use embedded_hal::digital::v2::OutputPin;
|
||||||
use fugit::SecsDurationU32;
|
use fugit::MicrosDurationU32;
|
||||||
use rp_pico::{
|
use rp_pico::{
|
||||||
hal::{self, clocks::init_clocks_and_plls, timer::Alarm, watchdog::Watchdog, Sio},
|
hal::{self, clocks::init_clocks_and_plls, timer::Alarm, watchdog::Watchdog, Sio},
|
||||||
XOSC_CRYSTAL_FREQ,
|
XOSC_CRYSTAL_FREQ,
|
||||||
};
|
};
|
||||||
|
|
||||||
const SCAN_TIME_US: SecsDurationU32 = SecsDurationU32::secs(1);
|
const SCAN_TIME_US: MicrosDurationU32 = MicrosDurationU32::secs(1);
|
||||||
|
|
||||||
#[shared]
|
#[shared]
|
||||||
struct Shared {
|
struct Shared {
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
//!
|
//!
|
||||||
//! See [Chapter 4 Section 6](https://datasheets.raspberrypi.org/rp2040/rp2040_datasheet.pdf) of the datasheet for more details.
|
//! See [Chapter 4 Section 6](https://datasheets.raspberrypi.org/rp2040/rp2040_datasheet.pdf) of the datasheet for more details.
|
||||||
|
|
||||||
use fugit::{Duration, MicrosDurationU64, TimerInstantU64};
|
use fugit::{MicrosDurationU32, MicrosDurationU64, TimerInstantU64};
|
||||||
|
|
||||||
use crate::atomic_register_access::{write_bitmask_clear, write_bitmask_set};
|
use crate::atomic_register_access::{write_bitmask_clear, write_bitmask_set};
|
||||||
use crate::pac::{RESETS, TIMER};
|
use crate::pac::{RESETS, TIMER};
|
||||||
|
@ -200,10 +200,7 @@ pub trait Alarm {
|
||||||
/// this will trigger interrupt whenever this time elapses.
|
/// this will trigger interrupt whenever this time elapses.
|
||||||
///
|
///
|
||||||
/// [enable_interrupt]: #method.enable_interrupt
|
/// [enable_interrupt]: #method.enable_interrupt
|
||||||
fn schedule<const NOM: u32, const DENOM: u32>(
|
fn schedule(&mut self, countdown: MicrosDurationU32) -> Result<(), ScheduleAlarmError>;
|
||||||
&mut self,
|
|
||||||
countdown: Duration<u32, NOM, DENOM>,
|
|
||||||
) -> Result<(), ScheduleAlarmError>;
|
|
||||||
|
|
||||||
/// Schedule the alarm to be finished at the given timestamp. If [enable_interrupt] is
|
/// Schedule the alarm to be finished at the given timestamp. If [enable_interrupt] is
|
||||||
/// called, this will trigger interrupt whenever this timestamp is reached.
|
/// called, this will trigger interrupt whenever this timestamp is reached.
|
||||||
|
@ -307,14 +304,10 @@ macro_rules! impl_alarm {
|
||||||
/// ` whenever this time elapses.
|
/// ` whenever this time elapses.
|
||||||
///
|
///
|
||||||
/// [enable_interrupt]: #method.enable_interrupt
|
/// [enable_interrupt]: #method.enable_interrupt
|
||||||
fn schedule<const NOM: u32, const DENOM: u32>(
|
fn schedule(&mut self, countdown: MicrosDurationU32) -> Result<(), ScheduleAlarmError> {
|
||||||
&mut self,
|
|
||||||
countdown: Duration<u32, NOM, DENOM>,
|
|
||||||
) -> Result<(), ScheduleAlarmError> {
|
|
||||||
// safety: Only read operations are made on the timer and they should not have any UB
|
// safety: Only read operations are made on the timer and they should not have any UB
|
||||||
let timer = unsafe { &*TIMER::ptr() };
|
let timer = unsafe { &*TIMER::ptr() };
|
||||||
let micros = fugit::MicrosDurationU32::micros(countdown.to_micros());
|
let timestamp = get_counter(timer) + countdown;
|
||||||
let timestamp = get_counter(timer) + micros;
|
|
||||||
|
|
||||||
self.schedule_internal(timer, timestamp)
|
self.schedule_internal(timer, timestamp)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue