#![deny(unsafe_code)]
#![deny(warnings)]
#![no_std]
#![no_main]
use panic_halt as _;
#[rtic::app(device = stm32f4xx_hal::pac)]
mod app {
use stm32f4xx_hal::{
gpio::{Edge, Input, Output, PushPull, PA0, PC13},
prelude::*,
};
#[shared]
struct Shared {}
#[local]
struct Local {
button: PA0<Input>,
led: PC13<Output<PushPull>>,
}
#[init]
fn init(mut ctx: init::Context) -> (Shared, Local, init::Monotonics) {
let mut syscfg = ctx.device.SYSCFG.constrain();
let gpioc = ctx.device.GPIOC.split();
let led = gpioc.pc13.into_push_pull_output();
let gpioa = ctx.device.GPIOA.split();
let mut button = gpioa.pa0.into_pull_up_input();
button.make_interrupt_source(&mut syscfg);
button.enable_interrupt(&mut ctx.device.EXTI);
button.trigger_on_edge(&mut ctx.device.EXTI, Edge::Falling);
(Shared {}, Local { button, led }, init::Monotonics())
}
#[task(binds = EXTI0, local = [button, led])]
fn button_click(ctx: button_click::Context) {
ctx.local.button.clear_interrupt_pending_bit();
ctx.local.led.toggle();
}
}