aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-09-10 21:30:22 +0000
committerGitHub <[email protected]>2024-09-10 21:30:22 +0000
commitd5e77f69c153afad22a02ef08b17c0f8306b7b7a (patch)
treeaa6bf27f12dff427cf03558572eec87d9b1bbb2f
parent3534ee1bd5a15982d92c1034eabb283d56c5f3c9 (diff)
parent94f109aec117699f86aa9915e72c0b275cf3cc4a (diff)
Merge pull request #3319 from badrbouslikhin/buffered-uart-rx-fix
fix(stm32): fix dma and idle line detection in ringbuffereduartrx
-rw-r--r--embassy-stm32/src/dma/dma_bdma.rs1
-rw-r--r--embassy-stm32/src/usart/ringbuffered.rs34
2 files changed, 18 insertions, 17 deletions
diff --git a/embassy-stm32/src/dma/dma_bdma.rs b/embassy-stm32/src/dma/dma_bdma.rs
index 8e2964f94..df041c4e9 100644
--- a/embassy-stm32/src/dma/dma_bdma.rs
+++ b/embassy-stm32/src/dma/dma_bdma.rs
@@ -777,6 +777,7 @@ impl<'a, W: Word> ReadableRingBuffer<'a, W> {
777 let dir = Dir::PeripheralToMemory; 777 let dir = Dir::PeripheralToMemory;
778 let data_size = W::size(); 778 let data_size = W::size();
779 779
780 options.half_transfer_ir = true;
780 options.complete_transfer_ir = true; 781 options.complete_transfer_ir = true;
781 options.circular = true; 782 options.circular = true;
782 783
diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs
index 8cf75933a..b0652046c 100644
--- a/embassy-stm32/src/usart/ringbuffered.rs
+++ b/embassy-stm32/src/usart/ringbuffered.rs
@@ -184,20 +184,6 @@ impl<'d> RingBufferedUartRx<'d> {
184 async fn wait_for_data_or_idle(&mut self) -> Result<(), Error> { 184 async fn wait_for_data_or_idle(&mut self) -> Result<(), Error> {
185 compiler_fence(Ordering::SeqCst); 185 compiler_fence(Ordering::SeqCst);
186 186
187 let mut dma_init = false;
188 // Future which completes when there is dma is half full or full
189 let dma = poll_fn(|cx| {
190 self.ring_buf.set_waker(cx.waker());
191
192 let status = match dma_init {
193 false => Poll::Pending,
194 true => Poll::Ready(()),
195 };
196
197 dma_init = true;
198 status
199 });
200
201 // Future which completes when idle line is detected 187 // Future which completes when idle line is detected
202 let s = self.state; 188 let s = self.state;
203 let uart = poll_fn(|cx| { 189 let uart = poll_fn(|cx| {
@@ -219,9 +205,23 @@ impl<'d> RingBufferedUartRx<'d> {
219 } 205 }
220 }); 206 });
221 207
222 match select(dma, uart).await { 208 let mut dma_init = false;
223 Either::Left(((), _)) => Ok(()), 209 // Future which completes when there is dma is half full or full
224 Either::Right((result, _)) => result, 210 let dma = poll_fn(|cx| {
211 self.ring_buf.set_waker(cx.waker());
212
213 let status = match dma_init {
214 false => Poll::Pending,
215 true => Poll::Ready(()),
216 };
217
218 dma_init = true;
219 status
220 });
221
222 match select(uart, dma).await {
223 Either::Left((result, _)) => result,
224 Either::Right(((), _)) => Ok(()),
225 } 225 }
226 } 226 }
227} 227}