#![deny(unsafe_code)] #![deny(warnings)] #![no_main] #![no_std] use panic_rtt_target as _; use rtic::app; use rtic_monotonics::systick::prelude::*; use rtt_target::{rprintln, rtt_init_print}; use stm32f1xx_hal::gpio::{Output, PinState, PushPull, PC13}; use stm32f1xx_hal::prelude::*; systick_monotonic!(Mono, 1000); #[app(device = stm32f1xx_hal::pac, peripherals = true, dispatchers = [SPI1])] mod app { use super::*; #[shared] struct Shared {} #[local] struct Local { led: PC13>, state: bool, } #[init] fn init(cx: init::Context) -> (Shared, Local) { // Setup clocks let mut flash = cx.device.FLASH.constrain(); let rcc = cx.device.RCC.constrain(); // Initialize the systick interrupt & obtain the token to prove that we did Mono::start(cx.core.SYST, 36_000_000); rtt_init_print!(); rprintln!("init"); let _clocks = rcc .cfgr .use_hse(8.MHz()) .sysclk(36.MHz()) .pclk1(36.MHz()) .freeze(&mut flash.acr); // Setup LED let mut gpioc = cx.device.GPIOC.split(); let led = gpioc .pc13 .into_push_pull_output_with_state(&mut gpioc.crh, PinState::Low); // Schedule the blinking task blink::spawn().ok(); (Shared {}, Local { led, state: false }) } #[task(local = [led, state])] async fn blink(cx: blink::Context) { loop { rprintln!("blink"); if *cx.local.state { cx.local.led.set_high(); *cx.local.state = false; } else { cx.local.led.set_low(); *cx.local.state = true; } Mono::delay(1000.millis()).await; } } }