#![no_std] #![no_main] use panic_halt as _; #[rtic::app(device = rp_pico::hal::pac, peripherals = true)] mod app { use embedded_hal::digital::v2::OutputPin; use fugit::SecsDurationU32; use rp_pico::{ hal::{self, clocks::init_clocks_and_plls, timer::Alarm, watchdog::Watchdog, Sio}, XOSC_CRYSTAL_FREQ, }; const SCAN_TIME_US: SecsDurationU32 = SecsDurationU32::secs(1); #[shared] struct Shared { timer: hal::Timer, alarm: hal::timer::Alarm0, led: hal::gpio::Pin, } #[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.into_push_pull_output(); led.set_low().unwrap(); let mut timer = hal::Timer::new(c.device.TIMER, &mut resets); 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); }); } }