#![no_std] #![no_main] use panic_halt as _; #[rtic::app(device = rp_pico::hal::pac, peripherals = true)] mod app { use embedded_hal::digital::OutputPin; use fugit::MicrosDurationU32; use rp_pico::{ hal::{self, clocks::init_clocks_and_plls, timer::Alarm, watchdog::Watchdog, Sio}, XOSC_CRYSTAL_FREQ, }; const SCAN_TIME_US: MicrosDurationU32 = MicrosDurationU32::secs(1); #[shared] struct Shared { timer: hal::Timer, alarm: hal::timer::Alarm0, led: hal::gpio::Pin< hal::gpio::bank0::Gpio25, hal::gpio::FunctionSioOutput, hal::gpio::PullNone, >, } #[local] struct Local {} #[init] fn init(c: init::Context) -> (Shared, Local, init::Monotonics) { // Soft-reset does not release the hardware spinlocks // Release them now to avoid a deadlock after debug or watchdog reset unsafe { hal::sio::spinlock_reset(); } let mut resets = c.device.RESETS; let mut watchdog = Watchdog::new(c.device.WATCHDOG); let clocks = init_clocks_and_plls( XOSC_CRYSTAL_FREQ, c.device.XOSC, c.device.CLOCKS, c.device.PLL_SYS, c.device.PLL_USB, &mut resets, &mut watchdog, ) .ok() .unwrap(); let sio = Sio::new(c.device.SIO); let pins = rp_pico::Pins::new( c.device.IO_BANK0, c.device.PADS_BANK0, sio.gpio_bank0, &mut resets, ); let mut led = pins.led.reconfigure(); led.set_low().unwrap(); let mut timer = hal::Timer::new(c.device.TIMER, &mut resets, &clocks); let mut alarm = timer.alarm_0().unwrap(); let _ = alarm.schedule(SCAN_TIME_US); alarm.enable_interrupt(); (Shared { timer, alarm, led }, Local {}, init::Monotonics()) } #[task( binds = TIMER_IRQ_0, priority = 1, shared = [timer, alarm, led], local = [tog: bool = true], )] fn timer_irq(mut c: timer_irq::Context) { if *c.local.tog { c.shared.led.lock(|l| l.set_high().unwrap()); } else { c.shared.led.lock(|l| l.set_low().unwrap()); } *c.local.tog = !*c.local.tog; let mut alarm = c.shared.alarm; (alarm).lock(|a| { a.clear_interrupt(); let _ = a.schedule(SCAN_TIME_US); }); } }