You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.0 KiB
Rust
71 lines
2.0 KiB
Rust
pub struct Timer {
|
|
|
|
/// Address of the timer
|
|
base: *mut u8,
|
|
|
|
/// Number of clock cycles before the timer fires
|
|
period: u32,
|
|
|
|
/// Current count of the timer, in milliseconds
|
|
time_ms: u32,
|
|
}
|
|
|
|
impl Timer {
|
|
pub fn new() -> Timer {
|
|
Timer {
|
|
base: 0xE0002800 as *mut u8,
|
|
period: 12_000_000 / 1000, // 12 MHz, 1 ms timer
|
|
time_ms: 0,
|
|
}
|
|
}
|
|
|
|
pub fn enable(&self) {
|
|
unsafe {
|
|
// Disable, so we can update it
|
|
self.base.add(0x20).write_volatile(0);
|
|
|
|
// Update "reload" register
|
|
self.base.add(0x10).write_volatile((self.period >> 24) as u8);
|
|
self.base.add(0x14).write_volatile((self.period >> 16) as u8);
|
|
self.base.add(0x18).write_volatile((self.period >> 8) as u8);
|
|
self.base.add(0x1c).write_volatile((self.period >> 0) as u8);
|
|
|
|
// Update "load" register
|
|
self.base.add(0x00).write_volatile((self.period >> 24) as u8);
|
|
self.base.add(0x04).write_volatile((self.period >> 16) as u8);
|
|
self.base.add(0x08).write_volatile((self.period >> 8) as u8);
|
|
self.base.add(0x0c).write_volatile((self.period >> 0) as u8);
|
|
|
|
// Enable ISR
|
|
self.base.add(0x40).write_volatile(1);
|
|
|
|
// Set "pending" as well to clear it
|
|
self.base.add(0x38).write_volatile(1);
|
|
|
|
// Finally, enable it
|
|
self.base.add(0x20).write_volatile(1);
|
|
}
|
|
}
|
|
|
|
pub fn elapsed_ms(&self) -> u32 {
|
|
return self.time_ms;
|
|
}
|
|
}
|
|
|
|
// pub fn irq(_irq_number: usize) {
|
|
// let timer_base = 0xE0002800 as *mut u8;
|
|
// unsafe {
|
|
// TIME_MS = TIME_MS + 1;
|
|
// timer_base.add(0x3c).write_volatile(1);
|
|
// };
|
|
// }
|
|
|
|
// pub fn get_time() -> u32 {
|
|
// unsafe { TIME_MS }
|
|
// }
|
|
|
|
// pub fn time_init() {
|
|
// let timer_base = 0xE0002800 as *mut u8;
|
|
// let period = 12_000_000 / 1000; // 12 MHz, 1 ms timer
|
|
// }
|