Skip to content
Snippets Groups Projects
Select Git revision
  • bca462aaa46bb2de5d156978a11bc9c09ea6f579
  • master default protected
  • home_exam
3 results

main_span_expr.rs

Blame
  • Forked from Per Lindgren / D7050E
    Source project has a limited visibility.
    bare5.rs 10.62 KiB
    //! bare5.rs
    //!
    //! C Like Peripheral API
    //!
    //! What it covers:
    //! - abstractions in Rust
    //!
    
    #![feature(uniform_paths)] // requires nightly
    #![no_std]
    #![no_main]
    
    extern crate panic_halt;
    
    extern crate cortex_m;
    use cortex_m_rt::entry;
    
    // 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::*;
    
        pub struct VolatileCell<T> {
            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) }
            }
        }
    
        // impl VolatileCell<u32> {
        //     #[inline(always)]
        //     pub fn modify(&self, offset: u8, width: u8, value: u32) {
        //         // your code here
        //     }
        // }
    
        #[repr(C)]
        #[allow(non_snake_case)]
        #[rustfmt::skip]
        pub struct RCC {
            pub CR:         VolatileCell<u32>,      // < RCC clock control register,                                    Address offset: 0x00 
            pub PLLCFGR:    VolatileCell<u32>,      // < RCC PLL configuration register,                                Address offset: 0x04 
            pub CFGR:       VolatileCell<u32>,      // < RCC clock configuration register,                              Address offset: 0x08 
            pub CIR:        VolatileCell<u32>,      // < RCC clock interrupt register,                                  Address offset: 0x0C 
            pub AHB1RSTR:   VolatileCell<u32>,      // < RCC AHB1 peripheral reset register,                            Address offset: 0x10 
            pub AHB2RSTR:   VolatileCell<u32>,      // < RCC AHB2 peripheral reset register,                            Address offset: 0x14