Struct embassy_stm32::dma::bdma::ReadableRingBuffer
source · pub struct ReadableRingBuffer<'a, C: Channel, W: Word> { /* private fields */ }
Expand description
Ringbuffer for reading data using DMA circular mode.
Implementations§
source§impl<'a, C: Channel, W: Word> ReadableRingBuffer<'a, C, W>
impl<'a, C: Channel, W: Word> ReadableRingBuffer<'a, C, W>
sourcepub unsafe fn new(
channel: impl Peripheral<P = C> + 'a,
_request: Request,
peri_addr: *mut W,
buffer: &'a mut [W],
_options: TransferOptions
) -> Self
pub unsafe fn new( channel: impl Peripheral<P = C> + 'a, _request: Request, peri_addr: *mut W, buffer: &'a mut [W], _options: TransferOptions ) -> Self
Create a new ring buffer.
sourcepub fn start(&mut self)
pub fn start(&mut self)
Start the ring buffer operation.
You must call this after creating it for it to work.
sourcepub fn read(&mut self, buf: &mut [W]) -> Result<(usize, usize), OverrunError>
pub fn read(&mut self, buf: &mut [W]) -> Result<(usize, usize), OverrunError>
Read elements from the ring buffer Return a tuple of the length read and the length remaining in the buffer If not all of the elements were read, then there will be some elements in the buffer remaining The length remaining is the capacity, ring_buf.len(), less the elements remaining after the read OverrunError is returned if the portion to be read was overwritten by the DMA controller.
sourcepub async fn read_exact(
&mut self,
buffer: &mut [W]
) -> Result<usize, OverrunError>
pub async fn read_exact( &mut self, buffer: &mut [W] ) -> Result<usize, OverrunError>
Read an exact number of elements from the ringbuffer.
Returns the remaining number of elements available for immediate reading. OverrunError is returned if the portion to be read was overwritten by the DMA controller.
Async/Wake Behavior: The underlying DMA peripheral only can wake us when its buffer pointer has reached the halfway point, and when it wraps around. This means that when called with a buffer of length ‘M’, when this ring buffer was created with a buffer of size ‘N’:
- If M equals N/2 or N/2 divides evenly into M, this function will return every N/2 elements read on the DMA source.
- Otherwise, this function may need up to N/2 extra elements to arrive before returning.
sourcepub fn set_waker(&mut self, waker: &Waker)
pub fn set_waker(&mut self, waker: &Waker)
Set a waker to be woken when at least one byte is received.
sourcepub fn request_stop(&mut self)
pub fn request_stop(&mut self)
Request DMA to stop.
This doesn’t immediately stop the transfer, you have to wait until is_running
returns false.
sourcepub fn is_running(&mut self) -> bool
pub fn is_running(&mut self) -> bool
Return whether DMA is still running.
If this returns false
, it can be because either the transfer finished, or
it was requested to stop early with request_stop
.