ionpak-thermostat/firmware/src/board/systick.rs

34 lines
945 B
Rust
Raw Normal View History

2019-09-08 08:13:02 +08:00
use core::cell::RefCell;
use cortex_m::interrupt::Mutex;
2019-09-08 07:54:51 +08:00
use cortex_m::peripheral::{SYST, syst::SystClkSource};
2019-09-08 08:13:02 +08:00
use cortex_m_rt::exception;
use bare_metal::CriticalSection;
2019-09-08 07:54:51 +08:00
2019-09-08 08:13:02 +08:00
const SYSTICK_RATE: u32 = 250;
2019-09-08 07:54:51 +08:00
2019-09-08 08:13:02 +08:00
static mut TIME: Mutex<RefCell<u64>> = Mutex::new(RefCell::new(0));
2019-09-08 07:54:51 +08:00
2019-09-08 08:13:02 +08:00
pub fn init(cs: &CriticalSection) {
2019-09-08 07:54:51 +08:00
#[allow(mutable_transmutes)]
let syst: &mut SYST = unsafe { core::mem::transmute(&*SYST::ptr()) };
2019-09-08 08:13:02 +08:00
syst.set_clock_source(SystClkSource::External);
2019-09-08 07:54:51 +08:00
syst.set_reload(100 * SYST::get_ticks_per_10ms() / SYSTICK_RATE);
syst.clear_current();
syst.enable_interrupt();
syst.enable_counter();
}
#[exception]
unsafe fn SysTick() {
2019-09-08 08:13:02 +08:00
let interval = u64::from(1000 / SYSTICK_RATE);
cortex_m::interrupt::free(|cs| {
TIME.borrow(cs).replace_with(|time| *time + interval);
});
2019-09-08 07:54:51 +08:00
}
pub fn get_time() -> u64 {
2019-09-08 08:13:02 +08:00
cortex_m::interrupt::free(|cs| {
*unsafe { &mut TIME }.borrow(cs).borrow()
})
2019-09-08 07:54:51 +08:00
}