From 4ad1f3efff8b97e071b7b06144fc07c6c00531dd Mon Sep 17 00:00:00 2001 From: Priec Date: Tue, 25 Nov 2025 21:46:17 +0100 Subject: [PATCH 1/2] if dma transfer fails, retry --- embassy-stm32/src/dma/gpdma/ringbuffered.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/embassy-stm32/src/dma/gpdma/ringbuffered.rs b/embassy-stm32/src/dma/gpdma/ringbuffered.rs index 54e4d5f71e..16887fc3cf 100644 --- a/embassy-stm32/src/dma/gpdma/ringbuffered.rs +++ b/embassy-stm32/src/dma/gpdma/ringbuffered.rs @@ -245,9 +245,14 @@ impl<'a, W: Word> WritableRingBuffer<'a, W> { /// Write an exact number of elements to the ringbuffer. pub async fn write_exact(&mut self, buffer: &[W]) -> Result { - self.ringbuf + match self.ringbuf .write_exact(&mut DmaCtrlImpl(self.channel.reborrow()), buffer) - .await + .await { + Ok(n) => Ok(n), + Err(_) => self.ringbuf + .write_exact(&mut DmaCtrlImpl(self.channel.reborrow()), buffer) + .await + } } /// Wait for any ring buffer write error. From b582854db6c0440ad1c2b253a3817dc708d02a30 Mon Sep 17 00:00:00 2001 From: Priec Date: Tue, 25 Nov 2025 22:01:27 +0100 Subject: [PATCH 2/2] changelog updated --- embassy-stm32/CHANGELOG.md | 1 + embassy-stm32/src/dma/gpdma/ringbuffered.rs | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/embassy-stm32/CHANGELOG.md b/embassy-stm32/CHANGELOG.md index d3e5ba48d8..fedca33e88 100644 --- a/embassy-stm32/CHANGELOG.md +++ b/embassy-stm32/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased - ReleaseDate +- fix: ringuffered DMA does retry in write_exact if failed - feat: Add continuous waveform method to SimplePWM - change: remove waveform timer method - change: low power: store stop mode for dma channels diff --git a/embassy-stm32/src/dma/gpdma/ringbuffered.rs b/embassy-stm32/src/dma/gpdma/ringbuffered.rs index 16887fc3cf..956fbfe239 100644 --- a/embassy-stm32/src/dma/gpdma/ringbuffered.rs +++ b/embassy-stm32/src/dma/gpdma/ringbuffered.rs @@ -245,14 +245,18 @@ impl<'a, W: Word> WritableRingBuffer<'a, W> { /// Write an exact number of elements to the ringbuffer. pub async fn write_exact(&mut self, buffer: &[W]) -> Result { - match self.ringbuf + match self + .ringbuf .write_exact(&mut DmaCtrlImpl(self.channel.reborrow()), buffer) - .await { - Ok(n) => Ok(n), - Err(_) => self.ringbuf - .write_exact(&mut DmaCtrlImpl(self.channel.reborrow()), buffer) - .await + .await + { + Ok(n) => Ok(n), + Err(_) => { + self.ringbuf + .write_exact(&mut DmaCtrlImpl(self.channel.reborrow()), buffer) + .await } + } } /// Wait for any ring buffer write error.