Skip to content
Snippets Groups Projects
Select Git revision
  • 4a3808b1ce03b21fc2da1a2cbe9d5d94d035d687
  • master default protected
  • upstream
  • Programming_of_nuttali
4 results

rtt_rtic_blinky.rs

Blame
  • Forked from Per Lindgren / e7020e_2021
    Source project has a limited visibility.
    lib.rs 1.00 KiB
    #![no_std]
    
    pub mod pmw3389;
    pub mod pmw3389e;
    
    use stm32f4xx_hal::{prelude::*, rcc::Clocks, stm32};
    
    pub struct DwtDelay {
        clocks: Clocks,
    }
    
    impl DwtDelay {
        pub fn new(dwt: &mut stm32::DWT, clocks: Clocks) -> DwtDelay {
            // required on Cortex-M7 devices that software lock the DWT (e.g. STM32F7)
            stm32::DWT::unlock();
            dwt.enable_cycle_counter();
            Self { clocks }
        }
    }
    
    impl _embedded_hal_blocking_delay_DelayUs<u32> for DwtDelay {
        fn delay_us(&mut self, us: u32) {
            let freq_m_hertz = self.clocks.hclk().0 / 1_000_000;
    
            let start = stm32::DWT::get_cycle_count() as i32;
            let end = start.wrapping_add((us * freq_m_hertz) as i32);
    
            while (stm32::DWT::get_cycle_count() as i32).wrapping_sub(end) < 0 {
                // this nop should be ok as the `DWT::get_cycle_count() provides side effects
            }
        }
    }
    
    impl _embedded_hal_blocking_delay_DelayMs<u32> for DwtDelay {
        fn delay_ms(&mut self, ms: u32) {
            self.delay_us(ms * 1000)
        }
    }