diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-09-10 21:30:22 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-09-10 21:30:22 +0000 |
| commit | d5e77f69c153afad22a02ef08b17c0f8306b7b7a (patch) | |
| tree | aa6bf27f12dff427cf03558572eec87d9b1bbb2f | |
| parent | 3534ee1bd5a15982d92c1034eabb283d56c5f3c9 (diff) | |
| parent | 94f109aec117699f86aa9915e72c0b275cf3cc4a (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.rs | 1 | ||||
| -rw-r--r-- | embassy-stm32/src/usart/ringbuffered.rs | 34 |
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 | } |
