Skip to content
Snippets Groups Projects
Select Git revision
  • 6196b9f10fdc3d10853980ed18af0baf173b6719
  • master default protected
2 results

rtic_bare7.rs

Blame
  • Forked from Per Lindgren / e7020e_2021
    Source project has a limited visibility.
    rtic_bare7.rs 8.55 KiB
    //! rtic_bare7.rs
    //!
    //! HAL OutputPin abstractions
    //!
    //! What it covers:
    //! - using embedded hal, and the OutputPin abstraction
    
    #![no_main]
    #![no_std]
    
    use panic_rtt_target as _;
    use rtic::cyccnt::{Instant, U32Ext as _};
    use rtt_target::{rprintln, rtt_init_print};
    use stm32f4xx_hal::stm32;
    
    use stm32f4xx_hal::{
        gpio::{gpioa::PA5, Output, PushPull},
        prelude::*,
    };
    ;
    use embedded_hal::digital::v2::{OutputPin, ToggleableOutputPin};
    
    const OFFSET: u32 = 8_000_000;
    
    #[rtic::app(device = stm32f4xx_hal::stm32, monotonic = rtic::cyccnt::CYCCNT, peripherals = true)]
    const APP: () = {
        struct Resources {
            // late resources
            GPIOA: stm32::GPIOA,
            // led: PA5<Output<PushPull>>,
        }
        #[init(schedule = [toggle])]
        fn init(cx: init::Context) -> init::LateResources {
            rtt_init_print!();
            rprintln!("init");
    
            let mut core = cx.core;
            let device = cx.device;
    
            // Initialize (enable) the monotonic timer (CYCCNT)
            core.DCB.enable_trace();
            core.DWT.enable_cycle_counter();
    
            // semantically, the monotonic timer is frozen at time "zero" during `init`
            // NOTE do *not* call `Instant::now` in this context; it will return a nonsense value
            let now = cx.start; // the start time of the system
    
            // Schedule `toggle` to run 8e6 cycles (clock cycles) in the future
            cx.schedule.toggle(now + OFFSET.cycles()).unwrap();
    
            // power on GPIOA, RM0368 6.3.11
            device.RCC.ahb1enr.modify(|_, w| w.gpioaen().set_bit());
            // configure PA5 as output, RM0368 8.4.1
            device.GPIOA.moder.modify(|_, w| w.moder5().bits(1));
    
            // pass on late resources
            init::LateResources {
                GPIOA: device.GPIOA,
            }
        }
    
        #[idle]
        fn idle(_cx: idle::Context) -> ! {
            rprintln!("idle");
            loop {
                continue;
            }
        }
    
        #[task(resources = [GPIOA], schedule = [toggle])]