# [−][src]Module cortex_m::peripheral

Core peripherals

# API

To use (most of) the peripheral API first you must get an instance of the peripheral. All the core peripherals are modeled as singletons (there can only ever be, at most, one instance of any one of them at any given point in time) and the only way to get an instance of them is through the `Peripherals::take` method.

    extern crate cortex_m;

    use cortex_m::peripheral::Peripherals;

    fn main() {
        let mut peripherals = Peripherals::take().unwrap();
        peripherals.DWT.enable_cycle_counter();
    }

This method can only be successfully called once -- this is why the method returns an `Option`. Subsequent calls to the method will result in a `None` value being returned.

    extern crate cortex_m;

    use cortex_m::peripheral::Peripherals;

    fn main() {
        let ok = Peripherals::take().unwrap();
        let panics = Peripherals::take().unwrap();
    }

A part of the peripheral API doesn't require access to a peripheral instance. This part of the API is provided as static methods on the peripheral types. One example is the `DWT::get_cycle_count` method.

    extern crate cortex_m;

    use cortex_m::peripheral::{DWT, Peripherals};

    fn main() {
        {
            let mut peripherals = Peripherals::take().unwrap();
            peripherals.DWT.enable_cycle_counter();
        } // all the peripheral singletons are destroyed here

        // but this method can be called without a DWT instance
        let cyccnt = DWT::get_cycle_count();
    }

The singleton property can be unsafely bypassed using the `ptr` static method which is available on all the peripheral types. This method is a useful building block for implementing safe higher level abstractions.

    extern crate cortex_m;

    use cortex_m::peripheral::{DWT, Peripherals};

    fn main() {
        {
            let mut peripherals = Peripherals::take().unwrap();
            peripherals.DWT.enable_cycle_counter();
        } // all the peripheral singletons are destroyed here

        // actually safe because this is an atomic read with no side effects
        let cyccnt = unsafe { (*DWT::ptr()).cyccnt.read() };
    }

# References

- ARMv7-M Architecture Reference Manual (Issue E.b) - Chapter B3

## Modules

cbp | Cache and branch predictor maintenance operations
cpuid | CPUID
dcb | Debug Control Block
dwt | Data Watchpoint and Trace unit
fpb | Flash Patch and Breakpoint unit
itm | Instrumentation Trace Macrocell
mpu | Memory Protection Unit
nvic | Nested Vector Interrupt Controller
scb | System Control Block
syst | SysTick: System Timer
tpiu | Trace Port Interface Unit;

## Structs

CBP | Cache and branch predictor maintenance operations
CPUID | CPUID
DCB | Debug Control Block
DWT | Data Watchpoint and Trace unit
FPB | Flash Patch and Breakpoint unit
FPU | Floating Point Unit
ITM | Instrumentation Trace Macrocell
MPU | Memory Protection Unit
NVIC | Nested Vector Interrupt Controller
Peripherals | Core peripherals
SCB | System Control Block
SYST | SysTick: System Timer
TPIU | Trace Port Interface Unit

# Help

## Keyboard Shortcuts

`?`
  Show this help dialog
`S`
  Focus the search field
`↑`
  Move up in search results
`↓`
  Move down in search results
`↹`
  Switch tab
`⏎`
  Go to active search result
`+`
  Expand all sections
`-`
  Collapse all sections

## Search Tricks

Prefix searches with a type followed by a colon (e.g., `fn:`) to restrict the search to a given type.

Accepted types are: `fn`, `mod`, `struct`, `enum`, `trait`, `type`, `macro`, and `const`.

Search functions by type signature (e.g., `vec -> usize` or `* -> vec`)

Search multiple things at once by splitting your query with comma (e.g., `str,u8` or `String,struct:Vec,test`)