#![feature(used)]
#![feature(const_fn)]
#![no_std]
use core::cell::RefCell;
extern crate cortex_m;
use cortex_m::interrupt::Mutex;
use cortex_m::peripheral::syst::*;
#[macro_use(exception)]
extern crate stm32f042;
static GPIOA: Mutex<RefCell<Option<stm32f042::GPIOA>>> = Mutex::new(RefCell::new(None));
fn main() {
if let (Some(cp), Some(p)) = (
cortex_m::Peripherals::take(),
stm32f042::Peripherals::take(),
) {
let rcc = p.RCC;
let gpioa = p.GPIOA;
let mut syst = cp.SYST;
let flash = p.FLASH;
rcc.apb2enr.modify(|_, w| w.syscfgen().set_bit());
rcc.cr2.write(|w| w.hsi48on().set_bit());
loop {
if rcc.cr2.read().hsi48rdy().bit() {
break;
}
}
flash.acr.write(|w| w.prftbe().set_bit());
loop {
if flash.acr.read().prftbs().bit() {
break;
}
}
flash.acr.write(|w| unsafe { w.latency().bits(1) });
unsafe { rcc.cfgr.write(|w| w.sw().bits(3)) };
loop {
if rcc.cfgr.read().sw().bits() == 3 {
break;
}
}
rcc.ahbenr.modify(|_, w| w.iopaen().set_bit());
gpioa.moder.modify(|_, w| unsafe { w.moder1().bits(1) });
cortex_m::interrupt::free(|cs| {
*GPIOA.borrow(cs).borrow_mut() = Some(gpioa);
});
unsafe { syst.cvr.write(1) };
syst.set_clock_source(SystClkSource::Core);
syst.set_reload(4_000_000 - 1);
syst.enable_counter();
syst.enable_interrupt();
}
}
exception!(SYS_TICK, flash, locals: {
state: u8 = 1;
});
fn flash(l: &mut SYS_TICK::Locals) {
cortex_m::interrupt::free(|cs| {
if let Some(gpioa) = GPIOA.borrow(cs).borrow().as_ref() {
if l.state < 10 {
gpioa.brr.write(|w| w.br1().set_bit());
l.state += 1;
} else {
gpioa.bsrr.write(|w| w.bs1().set_bit());
l.state = 1;
}
}
});
}