esp_hal::dma

Struct DmaRxStreamBuf

Source
pub struct DmaRxStreamBuf { /* private fields */ }
Available on crate feature unstable only.
Expand description

DMA Streaming Receive Buffer.

This is a contiguous buffer linked together by DMA descriptors, and the buffer is evenly distributed between each descriptor provided.

It is used for continuously streaming data from a peripheral’s FIFO.

It does so by maintaining sliding window of descriptors that progresses when you call DmaRxStreamBufView::consume.

The list starts out like so A (empty) -> B (empty) -> C (empty) -> D (empty) -> NULL.

As the DMA writes to the buffers the list progresses like so:

  • A (empty) -> B (empty) -> C (empty) -> D (empty) -> NULL
  • A (full) -> B (empty) -> C (empty) -> D (empty) -> NULL
  • A (full) -> B (full) -> C (empty) -> D (empty) -> NULL
  • A (full) -> B (full) -> C (full) -> D (empty) -> NULL

As you call DmaRxStreamBufView::consume the list (approximately) progresses like so:

  • A (full) -> B (full) -> C (full) -> D (empty) -> NULL
  • B (full) -> C (full) -> D (empty) -> A (empty) -> NULL
  • C (full) -> D (empty) -> A (empty) -> B (empty) -> NULL
  • D (empty) -> A (empty) -> B (empty) -> C (empty) -> NULL

If all the descriptors fill up, the DmaRxInterrupt::DescriptorEmpty interrupt will fire and the DMA will stop writing, at which point it is up to you to resume/restart the transfer.

Note: This buffer will not tell you when this condition occurs, you should check with the driver to see if the DMA has stopped.

When constructing this buffer, it is important to tune the ratio between the chunk size and buffer size appropriately. Smaller chunk sizes means you receive data more frequently but this means the DMA interrupts (DmaRxInterrupt::Done) also fire more frequently (if you use them).

See DmaRxStreamBufView for APIs available whilst a transfer is in progress.

Implementations§

Source§

impl DmaRxStreamBuf

Source

pub fn new( descriptors: &'static mut [DmaDescriptor], buffer: &'static mut [u8], ) -> Result<Self, DmaBufError>

Creates a new DmaRxStreamBuf evenly distributing the buffer between the provided descriptors.

Source

pub fn split(self) -> (&'static mut [DmaDescriptor], &'static mut [u8])

Consume the buf, returning the descriptors and buffer.

Trait Implementations§

Source§

impl DmaRxBuffer for DmaRxStreamBuf

Source§

type View = DmaRxStreamBufView

A type providing operations that are safe to perform on the buffer whilst the DMA is actively using it.
Source§

fn prepare(&mut self) -> Preparation

Prepares the buffer for an imminent transfer and returns information required to use this buffer. Read more
Source§

fn into_view(self) -> DmaRxStreamBufView

This is called before the DMA starts using the buffer.
Source§

fn from_view(view: Self::View) -> Self

This is called after the DMA is done using the buffer.

Auto Trait Implementations§

§

impl Freeze for DmaRxStreamBuf

§

impl RefUnwindSafe for DmaRxStreamBuf

§

impl Send for DmaRxStreamBuf

§

impl !Sync for DmaRxStreamBuf

§

impl Unpin for DmaRxStreamBuf

§

impl !UnwindSafe for DmaRxStreamBuf

Blanket Implementations§

§

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

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

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

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

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

§

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

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

§

fn into(self) -> U

Calls U::from(self).

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

§

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

§

type Error = Infallible

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

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

Performs the conversion.
§

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

§

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

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

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

Performs the conversion.