GlobalTimer: add timer start with interrupt
This commit is contained in:
parent
0c29a20d36
commit
535c162034
|
@ -24,6 +24,43 @@ impl GlobalTimer {
|
||||||
pub fn start() -> GlobalTimer {
|
pub fn start() -> GlobalTimer {
|
||||||
let mut regs = mpcore::RegisterBlock::mpcore();
|
let mut regs = mpcore::RegisterBlock::mpcore();
|
||||||
Self::reset(&mut regs);
|
Self::reset(&mut regs);
|
||||||
|
|
||||||
|
// Start
|
||||||
|
regs.global_timer_control.write(
|
||||||
|
mpcore::GlobalTimerControl::zeroed()
|
||||||
|
.prescaler((Self::get_prescalar() - 1) as u8)
|
||||||
|
.auto_increment_mode(true)
|
||||||
|
.timer_enable(true)
|
||||||
|
);
|
||||||
|
GlobalTimer { regs }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the timer with a reset and interrupt
|
||||||
|
pub fn start_with_interrupt(interrupt_period_us: u64) -> GlobalTimer {
|
||||||
|
let mut regs = mpcore::RegisterBlock::mpcore();
|
||||||
|
Self::reset(&mut regs);
|
||||||
|
|
||||||
|
let prescaler = Self::get_prescalar() as u64;
|
||||||
|
let clocks = Clocks::get();
|
||||||
|
let increment_val:u32 = (interrupt_period_us * clocks.cpu_3x2x() as u64 / (1_000_000 * (prescaler + 1))) as u32;
|
||||||
|
|
||||||
|
// When auto-increment and comp enable bits are set, an IRQ is generated periodically
|
||||||
|
unsafe{
|
||||||
|
regs.auto_increment.write(increment_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear event flag
|
||||||
|
Self::clear_isr();
|
||||||
|
|
||||||
|
// Start
|
||||||
|
regs.global_timer_control.write(
|
||||||
|
mpcore::GlobalTimerControl::zeroed()
|
||||||
|
.prescaler((prescaler - 1) as u8)
|
||||||
|
.auto_increment_mode(true)
|
||||||
|
.comp_enable(true)
|
||||||
|
.irq_enable(true)
|
||||||
|
.timer_enable(true)
|
||||||
|
);
|
||||||
GlobalTimer { regs }
|
GlobalTimer { regs }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,21 +77,24 @@ impl GlobalTimer {
|
||||||
regs.global_timer_counter1.write(
|
regs.global_timer_counter1.write(
|
||||||
mpcore::ValueRegister::zeroed()
|
mpcore::ValueRegister::zeroed()
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clear_isr(){
|
||||||
|
let regs = mpcore::RegisterBlock::mpcore();
|
||||||
|
regs.global_timer_interrupt_status.write(
|
||||||
|
mpcore::GlobalTimerInterruptStatusRegister::zeroed()
|
||||||
|
.event_flag(true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_prescalar() -> u32 {
|
||||||
// find a prescaler value that matches CPU speed / 2 to us
|
// find a prescaler value that matches CPU speed / 2 to us
|
||||||
let clocks = Clocks::get();
|
let clocks = Clocks::get();
|
||||||
let mut prescaler = clocks.cpu_3x2x() / 1_000_000;
|
let mut prescaler = clocks.cpu_3x2x() / 1_000_000;
|
||||||
while prescaler > 256 {
|
while prescaler > 256 {
|
||||||
prescaler /= 2;
|
prescaler /= 2;
|
||||||
}
|
}
|
||||||
|
prescaler
|
||||||
// Start
|
|
||||||
regs.global_timer_control.write(
|
|
||||||
mpcore::GlobalTimerControl::zeroed()
|
|
||||||
.prescaler((prescaler - 1) as u8)
|
|
||||||
.auto_increment_mode(true)
|
|
||||||
.timer_enable(true)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// read the raw counter value
|
/// read the raw counter value
|
||||||
|
|
Loading…
Reference in New Issue