#![no_main]
#![no_std]
extern crate panic_halt;
use core::cell::RefCell;
use core::ops::DerefMut;
use cortex_m::asm;
use cortex_m::interrupt::Mutex;
use cortex_m::peripheral::NVIC;
use cortex_m_rt::entry;
use stm32l0xx_hal::{
gpio::*,
pac::{self, interrupt, Interrupt},
prelude::*,
rcc::Config,
timer::Timer,
};
static LED: Mutex<RefCell<Option<gpioa::PA1<Output<PushPull>>>>> = Mutex::new(RefCell::new(None));
static TIMER: Mutex<RefCell<Option<Timer<pac::TIM2>>>> = Mutex::new(RefCell::new(None));
#[entry]
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();
let mut rcc = dp.RCC.freeze(Config::hsi16());
let gpioa = dp.GPIOA.split(&mut rcc);
let led = gpioa.pa1.into_push_pull_output();
let mut timer = dp.TIM2.timer(1.hz(), &mut rcc);
timer.listen();
cortex_m::interrupt::free(|cs| {
*LED.borrow(cs).borrow_mut() = Some(led);
*TIMER.borrow(cs).borrow_mut() = Some(timer);
});
unsafe { NVIC::unmask(Interrupt::TIM2); }
loop {
asm::wfi();
}
}
#[interrupt]
fn TIM2() {
static mut STATE: bool = false;
cortex_m::interrupt::free(|cs| {
if let Some(ref mut timer) = TIMER.borrow(cs).borrow_mut().deref_mut() {
timer.clear_irq();
if let Some(ref mut led) = LED.borrow(cs).borrow_mut().deref_mut() {
if *STATE {
led.set_low().unwrap();
*STATE = false;
} else {
led.set_high().unwrap();
*STATE = true;
}
}
}
});
}