From 225f3754a1127f32a2a60fb277449e8c7d59ad60 Mon Sep 17 00:00:00 2001 From: Astro Date: Sun, 8 Sep 2019 01:54:51 +0200 Subject: [PATCH] move systick under board/ --- firmware/src/board/mod.rs | 3 +++ firmware/src/board/systick.rs | 27 +++++++++++++++++++++++++++ firmware/src/main.rs | 32 +++----------------------------- 3 files changed, 33 insertions(+), 29 deletions(-) create mode 100644 firmware/src/board/systick.rs diff --git a/firmware/src/board/mod.rs b/firmware/src/board/mod.rs index 4a0f8f3..ac2aa80 100644 --- a/firmware/src/board/mod.rs +++ b/firmware/src/board/mod.rs @@ -3,6 +3,7 @@ use tm4c129x; pub mod gpio; pub mod softspi; +pub mod systick; const UART_DIV: u32 = (((/*sysclk*/120_000_000 * 8) / /*baud*/115200) + 1) / 2; @@ -168,6 +169,8 @@ pub fn init() { setup_timer_pwm!(TIMER3); setup_timer_pwm!(TIMER4); setup_timer_pwm!(TIMER5); + + systick::init(); }); } diff --git a/firmware/src/board/systick.rs b/firmware/src/board/systick.rs new file mode 100644 index 0000000..779c2a7 --- /dev/null +++ b/firmware/src/board/systick.rs @@ -0,0 +1,27 @@ +use cortex_m_rt::exception; +use cortex_m::peripheral::{SYST, syst::SystClkSource}; + +const SYSTICK_RATE: u32 = 1000; + +static mut TIME: u64 = 0; + +pub fn init() { + unsafe { TIME = 0 }; + + #[allow(mutable_transmutes)] + let syst: &mut SYST = unsafe { core::mem::transmute(&*SYST::ptr()) }; + syst.set_clock_source(SystClkSource::Core); + syst.set_reload(100 * SYST::get_ticks_per_10ms() / SYSTICK_RATE); + syst.clear_current(); + syst.enable_interrupt(); + syst.enable_counter(); +} + +#[exception] +unsafe fn SysTick() { + TIME += u64::from(1000 / SYSTICK_RATE); +} + +pub fn get_time() -> u64 { + unsafe { TIME } +} diff --git a/firmware/src/main.rs b/firmware/src/main.rs index 16e65c4..eb0f6bb 100644 --- a/firmware/src/main.rs +++ b/firmware/src/main.rs @@ -2,9 +2,8 @@ #![no_std] #![no_main] -use cortex_m_rt::{entry, exception}; +use cortex_m_rt::entry; use core::fmt::{self, Write}; -use cortex_m::peripheral::{SYST, syst::SystClkSource}; use smoltcp::time::Instant; use smoltcp::wire::{IpCidr, IpAddress, EthernetAddress}; use smoltcp::iface::{NeighborCache, EthernetInterfaceBuilder}; @@ -33,7 +32,7 @@ pub fn panic_fmt(info: &core::panic::PanicInfo) -> ! { } mod board; -use self::board::gpio::Gpio; +use self::board::{gpio::Gpio, systick::get_time}; mod ethmac; mod ad7172; @@ -76,7 +75,6 @@ fn main() -> ! { writeln!(stdout, "ionpak boot").unwrap(); board::init(); writeln!(stdout, "board initialized").unwrap(); - init_systick(); println!(r#" _ _ @@ -179,7 +177,6 @@ fn main() -> ! { tcp_handle7, ]; - let mut time = 0i64; let mut data = None; // if a socket has sent the latest data let mut socket_pending = [false; 8]; @@ -226,32 +223,9 @@ fn main() -> ! { *pending = false; } } - match iface.poll(&mut sockets, Instant::from_millis(time)) { + match iface.poll(&mut sockets, Instant::from_millis(get_time() as i64)) { Ok(_) => (), Err(e) => println!("poll error: {}", e) } - time += 1; } } - -const SYSTICK_RATE: u32 = 1000; -static mut TIME: u32 = 0; - -pub fn get_time() -> u32 { - unsafe { TIME } -} - -#[exception] -fn SysTick() { - unsafe { TIME += 1000 / SYSTICK_RATE; } -} - -fn init_systick() { - #[allow(mutable_transmutes)] - let syst: &mut SYST = unsafe { core::mem::transmute(&*SYST::ptr()) }; - syst.set_clock_source(SystClkSource::Core); - syst.set_reload(100 * SYST::get_ticks_per_10ms() / SYSTICK_RATE); - syst.clear_current(); - syst.enable_interrupt(); - syst.enable_counter(); -}