From 62b9b03325ae94f650439070e9838885b7bcb345 Mon Sep 17 00:00:00 2001 From: chemicstry Date: Wed, 16 Jul 2025 20:48:44 +0300 Subject: [PATCH] Fix stm32 buffered half-duplex uart receive --- embassy-stm32/src/usart/buffered.rs | 2 ++ embassy-stm32/src/usart/mod.rs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/embassy-stm32/src/usart/buffered.rs b/embassy-stm32/src/usart/buffered.rs index 73ab46404..729440c46 100644 --- a/embassy-stm32/src/usart/buffered.rs +++ b/embassy-stm32/src/usart/buffered.rs @@ -87,6 +87,8 @@ unsafe fn on_interrupt(r: Regs, state: &'static State) { r.cr1().modify(|w| { w.set_tcie(false); + // Reenable receiver for half-duplex if it was disabled + w.set_re(true); }); state.tx_done.store(true, Ordering::Release); diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs index 8c9028f08..5bece6d66 100644 --- a/embassy-stm32/src/usart/mod.rs +++ b/embassy-stm32/src/usart/mod.rs @@ -651,7 +651,7 @@ pub fn send_break(regs: &Regs) { /// In case of readback, keep Receiver enabled fn half_duplex_set_rx_tx_before_write(r: &Regs, enable_readback: bool) { let mut cr1 = r.cr1().read(); - if r.cr3().read().hdsel() && !cr1.te() { + if r.cr3().read().hdsel() { cr1.set_te(true); cr1.set_re(enable_readback); r.cr1().write_value(cr1);