Skip to content
Snippets Groups Projects
Select Git revision
  • 1416261c03745d94b375442d3fdda5eca9ae6078
  • master default protected
2 results

rtic_bare5.rs

Blame
  • Forked from Per Lindgren / e7020e_2021
    Source project has a limited visibility.
    rtic_bare5.rs 11.46 KiB
    //! rtic_bare5.rs
    //!
    //! C Like Peripheral API
    //!
    //! What it covers:
    //! - abstractions in Rust
    //! - structs and implementations
    
    #![no_std]
    #![no_main]
    
    extern crate cortex_m;
    extern crate panic_semihosting;
    
    // C like API...
    mod stm32f40x {
        #[allow(dead_code)]
        use core::{cell, ptr};
    
        #[rustfmt::skip]
        mod address {
            pub const PERIPH_BASE: u32      = 0x40000000;
            pub const AHB1PERIPH_BASE: u32  = PERIPH_BASE + 0x00020000;
            pub const RCC_BASE: u32         = AHB1PERIPH_BASE + 0x3800;
            pub const GPIOA_BASE: u32       = AHB1PERIPH_BASE + 0x0000;
        }
        use address::*;
        use cortex_m_semihosting::hprint;
    
        pub struct VolatileCell<T> {
            pub value: cell::UnsafeCell<T>,
        }
    
        impl<T> VolatileCell<T> {
            #[inline(always)]
            pub fn read(&self) -> T
            where
                T: Copy,
            {
                unsafe { ptr::read_volatile(self.value.get()) }
            }
    
            #[inline(always)]
            pub fn write(&self, value: T)
            where
                T: Copy,
            {
                unsafe { ptr::write_volatile(self.value.get(), value) }
            }
        }
    
        // modify (reads, modifies a field, and writes the volatile cell)
        //
        // parameters:
        // offset (field offset)
        // width  (field width)
        // value  (new value that the field should take)
        //
        impl VolatileCell<u32> {
            #[inline(always)]
            pub fn modify(&self, offset: u8, width: u8, value: u32) {
    
                let cell_val = VolatileCell::read(&self);
                let mut mask = 0;
    
                for i in 0..width {
                    mask |= 1 << i;
                }
    
                let masked_value = value & mask;