#![feature(const_fn)]
#![feature(used)]
#![no_std]
extern crate cortex_m_rt;
#[macro_use]
extern crate cortex_m_rtfm as rtfm;
extern crate f3;
use f3::led::{self, LEDS};
use f3::stm32f30x::interrupt::Tim7;
use f3::stm32f30x;
use f3::timer::Timer;
use rtfm::{Local, P0, P1, T0, T1, TMax};
const FREQUENCY: u32 = 1;
peripherals!(stm32f30x, {
GPIOE: Peripheral {
register_block: Gpioe,
ceiling: C0,
},
RCC: Peripheral {
register_block: Rcc,
ceiling: C0,
},
TIM7: Peripheral {
register_block: Tim7,
ceiling: C1,
},
});
fn init(ref priority: P0, threshold: &TMax) {
let gpioe = GPIOE.access(priority, threshold);
let rcc = RCC.access(priority, threshold);
let tim7 = TIM7.access(priority, threshold);
let timer = Timer(&tim7);
led::init(&gpioe, &rcc);
timer.init(&rcc, FREQUENCY);
timer.resume();
}
fn idle(_priority: P0, _threshold: T0) -> ! {
loop {
rtfm::wfi();
}
}
tasks!(stm32f30x, {
periodic: Task {
interrupt: Tim7,
priority: P1,
enabled: true,
},
});
fn periodic(mut task: Tim7, ref priority: P1, ref threshold: T1) {
static STATE: Local<bool, Tim7> = Local::new(false);
let tim7 = TIM7.access(priority, threshold);
let timer = Timer(&tim7);
if timer.clear_update_flag().is_ok() {
let state = STATE.borrow_mut(&mut task);
*state = !*state;
if *state {
LEDS[0].on();
} else {
LEDS[0].off();
}
} else {
#[cfg(debug_assertion)]
unreachable!()
}
}