#![no_main]
#![no_std]
extern crate panic_halt;
use core::cell::{Cell, RefCell};
use cortex_m::interrupt::{free, Mutex};
use cortex_m::peripheral::NVIC;
use cortex_m_rt::entry;
use stm32f7xx_hal::gpio::gpioc::PC13;
use stm32f7xx_hal::gpio::{Edge, ExtiPin, Floating, Input};
use stm32f7xx_hal::{interrupt, pac, prelude::*};
static SEMAPHORE: Mutex<Cell<bool>> = Mutex::new(Cell::new(true));
static BUTTON_PIN: Mutex<RefCell<Option<PC13<Input<Floating>>>>> = Mutex::new(RefCell::new(None));
#[entry]
fn main() -> ! {
let pac_periph = pac::Peripherals::take().unwrap();
let gpiob = pac_periph.GPIOB.split();
let mut led1 = gpiob.pb0.into_push_pull_output();
let mut rcc = pac_periph.RCC.constrain();
let _clocks = rcc.cfgr.sysclk(216_000_000.Hz()).freeze();
let mut syscfg = pac_periph.SYSCFG;
let mut exti = pac_periph.EXTI;
let gpioc = pac_periph.GPIOC.split();
let mut button = gpioc.pc13.into_floating_input();
button.make_interrupt_source(&mut syscfg, &mut rcc.apb2);
button.trigger_on_edge(&mut exti, Edge::Rising);
button.enable_interrupt(&mut exti);
free(|cs| {
BUTTON_PIN.borrow(cs).replace(Some(button));
});
unsafe {
NVIC::unmask::<interrupt>(interrupt::EXTI15_10);
}
loop {
free(|cs| {
if SEMAPHORE.borrow(cs).get() == false {
led1.toggle();
SEMAPHORE.borrow(cs).set(true);
}
});
}
}
#[interrupt]
fn EXTI15_10() {
free(|cs| {
match BUTTON_PIN.borrow(cs).borrow_mut().as_mut() {
Some(b) => b.clear_interrupt_pending_bit(),
None => (),
}
SEMAPHORE.borrow(cs).set(false);
});
}