2019-03-15 01:13:25 +08:00
|
|
|
use core::cell::RefCell;
|
2020-03-21 07:07:18 +08:00
|
|
|
use core::ops::Deref;
|
2019-03-15 01:13:25 +08:00
|
|
|
use cortex_m::interrupt::Mutex;
|
|
|
|
use cortex_m_rt::exception;
|
|
|
|
use stm32f4xx_hal::{
|
|
|
|
rcc::Clocks,
|
|
|
|
stm32::SYST,
|
2024-10-14 11:52:15 +08:00
|
|
|
time::U32Ext,
|
|
|
|
timer::{Event as TimerEvent, Timer},
|
2019-03-15 01:13:25 +08:00
|
|
|
};
|
|
|
|
|
2019-03-19 04:41:51 +08:00
|
|
|
/// Rate in Hz
|
2020-03-21 07:07:18 +08:00
|
|
|
const TIMER_RATE: u32 = 500;
|
2019-03-19 04:41:51 +08:00
|
|
|
/// Interval duration in milliseconds
|
2019-03-15 01:13:25 +08:00
|
|
|
const TIMER_DELTA: u32 = 1000 / TIMER_RATE;
|
|
|
|
/// Elapsed time in milliseconds
|
|
|
|
static TIMER_MS: Mutex<RefCell<u32>> = Mutex::new(RefCell::new(0));
|
|
|
|
|
2019-03-19 04:41:51 +08:00
|
|
|
/// Setup SysTick exception
|
2019-03-15 01:13:25 +08:00
|
|
|
pub fn setup(syst: SYST, clocks: Clocks) {
|
2022-01-25 12:47:31 +08:00
|
|
|
let timer = Timer::syst(syst, &clocks);
|
|
|
|
let mut countdown = timer.start_count_down(TIMER_RATE.hz());
|
|
|
|
countdown.listen(TimerEvent::TimeOut);
|
2019-03-15 01:13:25 +08:00
|
|
|
}
|
|
|
|
|
2019-03-19 04:41:51 +08:00
|
|
|
/// SysTick exception (Timer)
|
2019-03-15 01:13:25 +08:00
|
|
|
#[exception]
|
|
|
|
fn SysTick() {
|
|
|
|
cortex_m::interrupt::free(|cs| {
|
2024-10-14 11:52:15 +08:00
|
|
|
*TIMER_MS.borrow(cs).borrow_mut() += TIMER_DELTA;
|
2019-03-15 01:13:25 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-03-19 04:41:51 +08:00
|
|
|
/// Obtain current time in milliseconds
|
2020-03-21 07:07:18 +08:00
|
|
|
pub fn now() -> u32 {
|
2024-10-14 11:52:15 +08:00
|
|
|
cortex_m::interrupt::free(|cs| *TIMER_MS.borrow(cs).borrow().deref())
|
2019-03-15 01:13:25 +08:00
|
|
|
}
|
2020-05-29 02:45:42 +08:00
|
|
|
|
|
|
|
/// block for at least `amount` milliseconds
|
2020-06-01 01:54:18 +08:00
|
|
|
pub fn sleep(amount: u32) {
|
2020-05-29 02:45:42 +08:00
|
|
|
let start = now();
|
|
|
|
while now() - start <= amount {}
|
|
|
|
}
|