embassy-stm32

Crates

git

Versions

stm32h563vg

Flavors

Skip to main content

Edata

Struct Edata 

Source
pub struct Edata<'d, M: Mode> { /* private fields */ }
Expand description

Driver for the EDATA area of a flash bank.

The EDATA area is flash with 16-bit words, each with its own ECC, and a higher endurance than the rest of the flash. It’s written in units of EDATA_WRITE_SIZE bytes, and erased in units of EDATA_ERASE_SIZE bytes. It implements NorFlash, so it can store data with crates like sequential-storage.

The EDATA area must be enabled in the option bytes:

  • C5: EDATA_EN enables 16 pages in each bank.
  • H5: EDATAx_EN enables the last EDATAx_STRT + 1 EDATA sectors of bank x. On the parts with the largest flash of the line, they are the last user flash sectors of the bank, which then can’t be used as user flash: reading them through the user flash is a bus error.

capacity() is the size of the area that is enabled, 0 when it’s disabled. Offsets are relative to the start of the area.

Locations that were not written since they were erased read as 0xFF. A read with an uncorrectable ECC error returns Error::Ecc.

The reads are done with the instruction cache (ICACHE) disabled, as the EDATA area must not be cached.

Programming or erasing the bank the code runs from stalls the CPU until it’s done. Use the EDATA area of the other bank to avoid it.

Implementations§

Source§

impl<'d, M: Mode> Edata<'d, M>

Source

pub fn capacity(&self) -> usize

Size in bytes of the EDATA area of the bank enabled in the option bytes. 0 if it’s disabled.

Source

pub fn blocking_read( &mut self, offset: u32, bytes: &mut [u8], ) -> Result<(), Error>

Blocking read.

NOTE: offset is an offset from the start of the EDATA area of the bank.

An uncorrectable ECC error in the data returns Error::Ecc. The contents of bytes are then unspecified.

Source§

impl<'d> Edata<'d, Blocking>

Source

pub fn blocking_write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Error>

Blocking write.

NOTE: offset is an offset from the start of the EDATA area of the bank.

offset and the length of bytes must be multiples of EDATA_WRITE_SIZE. The 16-bit words written must not have been written since they were erased: writing a word twice would corrupt its ECC. If one was, the write returns Error::NotErased without writing anything.

Source

pub fn blocking_erase(&mut self, from: u32, to: u32) -> Result<(), Error>

Blocking erase.

NOTE: from and to are offsets from the start of the EDATA area of the bank. They must be multiples of EDATA_ERASE_SIZE.

Source§

impl<'d> Edata<'d, Async>

Source

pub async fn read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Error>

Async read.

Note: reading from flash can’t actually block, so this is the same as blocking_read.

Source

pub async fn write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Error>

Async write.

See blocking_write.

Source

pub async fn erase(&mut self, from: u32, to: u32) -> Result<(), Error>

Async erase.

See blocking_erase.

Trait Implementations§

Source§

impl<M: Mode> ErrorType for Edata<'_, M>

Source§

type Error = Error

Errors returned by this NOR flash.
Source§

impl NorFlash for Edata<'_, Blocking>

Source§

const WRITE_SIZE: usize = EDATA_WRITE_SIZE

The minumum number of bytes the storage peripheral can write
Source§

const ERASE_SIZE: usize = EDATA_ERASE_SIZE

The minumum number of bytes the storage peripheral can erase
Source§

fn write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Self::Error>

If power is lost during write, the contents of the written words are undefined, but the rest of the page is guaranteed to be unchanged. It is not allowed to write to the same word twice. Read more
Source§

fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error>

Erase the given storage range, clearing all data within from..to. The given range will contain all 1s afterwards. Read more
Source§

impl NorFlash for Edata<'_, Async>

Source§

const WRITE_SIZE: usize = EDATA_WRITE_SIZE

The minumum number of bytes the storage peripheral can write
Source§

const ERASE_SIZE: usize = EDATA_ERASE_SIZE

The minumum number of bytes the storage peripheral can erase
Source§

async fn write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Self::Error>

If power is lost during write, the contents of the written words are undefined, but the rest of the page is guaranteed to be unchanged. It is not allowed to write to the same word twice. Read more
Source§

async fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error>

Erase the given storage range, clearing all data within from..to. The given range will contain all 1s afterwards. Read more
Source§

impl<M: Mode> ReadNorFlash for Edata<'_, M>

Source§

const READ_SIZE: usize = READ_SIZE

The minumum number of bytes the storage peripheral can read
Source§

fn read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Self::Error>

Read a slice of data from the storage peripheral, starting the read operation at the given address offset, and reading bytes.len() bytes. Read more
Source§

fn capacity(&self) -> usize

The capacity of the peripheral in bytes.
Source§

impl ReadNorFlash for Edata<'_, Async>

Source§

const READ_SIZE: usize = READ_SIZE

The minumum number of bytes the storage peripheral can read
Source§

async fn read( &mut self, offset: u32, bytes: &mut [u8], ) -> Result<(), Self::Error>

Read a slice of data from the storage peripheral, starting the read operation at the given address offset, and reading bytes.len() bytes. Read more
Source§

fn capacity(&self) -> usize

The capacity of the peripheral in bytes.

Auto Trait Implementations§

§

impl<'d, M> !UnwindSafe for Edata<'d, M>

§

impl<'d, M> Freeze for Edata<'d, M>
where PhantomData<M>: Freeze,

§

impl<'d, M> RefUnwindSafe for Edata<'d, M>

§

impl<'d, M> Send for Edata<'d, M>
where PhantomData<M>: Send,

§

impl<'d, M> Sync for Edata<'d, M>
where PhantomData<M>: Sync,

§

impl<'d, M> Unpin for Edata<'d, M>
where PhantomData<M>: Unpin,

§

impl<'d, M> UnsafeUnpin for Edata<'d, M>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.