aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2025-04-06 22:01:34 +0000
committerGitHub <[email protected]>2025-04-06 22:01:34 +0000
commit5bd610b0de35cc95009f790141885fe80fc84a27 (patch)
tree1ecb07371e22ed72b3bf755ad7fc04d89f4b008b
parent068b3c90d4c50fa8b2b68c242e7bcfe56b292ca4 (diff)
parentf7ddac3e0d5ed7b43f75223a8f662a4bf872d687 (diff)
Merge pull request #4054 from embassy-rs/ringbuffer2
fix(stm32): handle half-duplex in ringbuffered read
-rwxr-xr-xci.sh3
-rw-r--r--embassy-stm32/src/usart/mod.rs1
-rw-r--r--embassy-stm32/src/usart/ringbuffered.rs10
3 files changed, 12 insertions, 2 deletions
diff --git a/ci.sh b/ci.sh
index 5b63c507b..e2d3db546 100755
--- a/ci.sh
+++ b/ci.sh
@@ -328,8 +328,9 @@ rm out/tests/stm32wb55rg/wpan_ble
328# unstable, I think it's running out of RAM? 328# unstable, I think it's running out of RAM?
329rm out/tests/stm32f207zg/eth 329rm out/tests/stm32f207zg/eth
330 330
331# temporarily disabled, hard faults for unknown reasons 331# temporarily disabled, flaky.
332rm out/tests/stm32f207zg/usart_rx_ringbuffered 332rm out/tests/stm32f207zg/usart_rx_ringbuffered
333rm out/tests/stm32l152re/usart_rx_ringbuffered
333 334
334# doesn't work, gives "noise error", no idea why. usart_dma does pass. 335# doesn't work, gives "noise error", no idea why. usart_dma does pass.
335rm out/tests/stm32u5a5zj/usart 336rm out/tests/stm32u5a5zj/usart
diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs
index 5b7f8dc26..10e3ea88b 100644
--- a/embassy-stm32/src/usart/mod.rs
+++ b/embassy-stm32/src/usart/mod.rs
@@ -711,7 +711,6 @@ impl<'d> UartRx<'d, Async> {
711 711
712 // make sure USART state is restored to neutral state when this future is dropped 712 // make sure USART state is restored to neutral state when this future is dropped
713 let on_drop = OnDrop::new(move || { 713 let on_drop = OnDrop::new(move || {
714 // defmt::trace!("Clear all USART interrupts and DMA Read Request");
715 // clear all interrupts and DMA Rx Request 714 // clear all interrupts and DMA Rx Request
716 r.cr1().modify(|w| { 715 r.cr1().modify(|w| {
717 // disable RXNE interrupt 716 // disable RXNE interrupt
diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs
index 8e42d5917..eaa9424c5 100644
--- a/embassy-stm32/src/usart/ringbuffered.rs
+++ b/embassy-stm32/src/usart/ringbuffered.rs
@@ -150,6 +150,16 @@ impl<'d> RingBufferedUartRx<'d> {
150 pub async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> { 150 pub async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> {
151 self.start_dma_or_check_errors()?; 151 self.start_dma_or_check_errors()?;
152 152
153 // In half-duplex mode, we need to disable the Transmitter and enable the Receiver
154 // since they can't operate simultaneously on the shared line
155 let r = self.info.regs;
156 if r.cr3().read().hdsel() && r.cr1().read().te() {
157 r.cr1().modify(|reg| {
158 reg.set_re(true);
159 reg.set_te(false);
160 });
161 }
162
153 loop { 163 loop {
154 match self.ring_buf.read(buf) { 164 match self.ring_buf.read(buf) {
155 Ok((0, _)) => {} 165 Ok((0, _)) => {}