//! Flash memory use stm32::{flash, FLASH}; /// Extension trait to constrain the FLASH peripheral pub trait FlashExt { /// Constrains the FLASH peripheral to play nicely with the other abstractions fn constrain(self) -> Parts; } impl FlashExt for FLASH { fn constrain(self) -> Parts { Parts { acr: ACR { _0: () }, } } } /// Constrained FLASH peripheral pub struct Parts { /// Opaque ACR register pub acr: ACR, } /// Opaque ACR register pub struct ACR { _0: (), } impl ACR { pub(crate) fn acr(&mut self) -> &flash::ACR { // NOTE(unsafe) this proxy grants exclusive access to this register unsafe { &(*FLASH::ptr()).acr } } }