aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/usart
diff options
context:
space:
mode:
authorBadr Bouslikhin <[email protected]>2025-03-07 18:00:52 +0100
committerDario Nieuwenhuis <[email protected]>2025-04-06 23:52:39 +0200
commitb0ba604ba5ab1ba866df71b7e11099a3b1ceee3f (patch)
tree1db3c53c7d580d9d83872f0106234b7ecb3cb765 /embassy-stm32/src/usart
parent668f5d42c3b444dfd5921cadb9245be65a14bb40 (diff)
fix(stm32): handle half-duplex in ringbuffered read
Diffstat (limited to 'embassy-stm32/src/usart')
-rw-r--r--embassy-stm32/src/usart/mod.rs1
-rw-r--r--embassy-stm32/src/usart/ringbuffered.rs10
2 files changed, 10 insertions, 1 deletions
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, _)) => {}