#![no_main]
#![no_std]
extern crate cortex_m;
extern crate cortex_m_rt;
extern crate panic_halt;
extern crate stm32f0xx_hal as hal;
use hal::gpio::*;
use hal::prelude::*;
use hal::stm32;
use cortex_m::interrupt::Mutex;
use cortex_m::peripheral::syst::SystClkSource::Core;
use cortex_m::peripheral::Peripherals;
use cortex_m_rt::{entry, exception};
use core::cell::RefCell;
use core::ops::DerefMut;
static GPIO: Mutex<RefCell<Option<gpioa::PA1<Output<PushPull>>>>> = Mutex::new(RefCell::new(None));
#[entry]
fn main() -> ! {
if let (Some(p), Some(cp)) = (stm32::Peripherals::take(), Peripherals::take()) {
let gpioa = p.GPIOA.split();
let mut rcc = p.RCC.constrain();
let _ = rcc.cfgr.sysclk(48.mhz()).freeze();
let mut syst = cp.SYST;
let mut led = gpioa.pa1.into_push_pull_output();
cortex_m::interrupt::free(move |cs| {
*GPIO.borrow(cs).borrow_mut() = Some(led);
});
unsafe { syst.cvr.write(1) };
syst.set_clock_source(Core);
syst.set_reload(4_000_000 - 1);
syst.enable_counter();
syst.enable_interrupt();
}
loop {
continue;
}
}
#[exception]
fn SysTick() -> ! {
static mut state: u8 = 1;
cortex_m::interrupt::free(|cs| {
if let Some(ref mut led) = *GPIO.borrow(cs).borrow_mut().deref_mut() {
if *state < 10 {
led.set_low();
*state += 1;
} else {
led.set_high();
*state = 0;
}
}
});
}