From 3b37c79331c191a5153bbe4ac7e464150c714f13 Mon Sep 17 00:00:00 2001 From: Rogan Morrow Date: Fri, 28 Feb 2025 12:28:57 +1100 Subject: [PATCH 1/6] only clear idle flag --- embassy-stm32/src/usart/ringbuffered.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs index 560ce4e8f..2a59cdcb4 100644 --- a/embassy-stm32/src/usart/ringbuffered.rs +++ b/embassy-stm32/src/usart/ringbuffered.rs @@ -254,7 +254,9 @@ fn clear_idle_flag(r: Regs) -> Sr { // This read also clears the error and idle interrupt flags on v1. unsafe { rdr(r).read_volatile() }; - clear_interrupt_flags(r, sr); + let mut clear_idle = regs::Icr(0); + clear_idle.set_idle(true); + r.icr().write_value(clear_idle); r.cr1().modify(|w| w.set_idleie(true)); From 065071b4672e1223be22c5c746b5d97856ba8079 Mon Sep 17 00:00:00 2001 From: Rogan Morrow Date: Fri, 28 Feb 2025 12:30:23 +1100 Subject: [PATCH 2/6] add separate tx waker --- embassy-stm32/src/usart/mod.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs index de7b3c8df..568067360 100644 --- a/embassy-stm32/src/usart/mod.rs +++ b/embassy-stm32/src/usart/mod.rs @@ -85,6 +85,7 @@ unsafe fn on_interrupt(r: Regs, s: &'static State) { compiler_fence(Ordering::SeqCst); s.rx_waker.wake(); + s.tx_waker.wake(); } #[derive(Clone, Copy, PartialEq, Eq, Debug)] @@ -592,7 +593,7 @@ async fn flush(info: &Info, state: &State) -> Result<(), Error> { // future which completes when Transmission complete is detected let abort = poll_fn(move |cx| { - state.rx_waker.register(cx.waker()); + state.tx_waker.register(cx.waker()); let sr = sr(r).read(); if sr.tc() { @@ -2019,6 +2020,7 @@ enum Kind { struct State { rx_waker: AtomicWaker, + tx_waker: AtomicWaker, tx_rx_refcount: AtomicU8, } @@ -2026,6 +2028,7 @@ impl State { const fn new() -> Self { Self { rx_waker: AtomicWaker::new(), + tx_waker: AtomicWaker::new(), tx_rx_refcount: AtomicU8::new(0), } } From 2cc21d488343228aea3294dc9cd223ac2e145898 Mon Sep 17 00:00:00 2001 From: Rogan Morrow Date: Fri, 28 Feb 2025 12:40:01 +1100 Subject: [PATCH 3/6] feature flag --- embassy-stm32/src/usart/ringbuffered.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs index 2a59cdcb4..85aeb515f 100644 --- a/embassy-stm32/src/usart/ringbuffered.rs +++ b/embassy-stm32/src/usart/ringbuffered.rs @@ -254,9 +254,12 @@ fn clear_idle_flag(r: Regs) -> Sr { // This read also clears the error and idle interrupt flags on v1. unsafe { rdr(r).read_volatile() }; - let mut clear_idle = regs::Icr(0); - clear_idle.set_idle(true); - r.icr().write_value(clear_idle); + #[cfg(any(usart_v3, usart_v4))] + { + let mut clear_idle = regs::Icr(0); + clear_idle.set_idle(true); + r.icr().write_value(clear_idle); + } r.cr1().modify(|w| w.set_idleie(true)); From 32f6f1513d8e5b98f02a0833f9e5211c7bab2f51 Mon Sep 17 00:00:00 2001 From: Rogan Morrow Date: Fri, 28 Feb 2025 12:41:44 +1100 Subject: [PATCH 4/6] add missing module --- embassy-stm32/src/usart/ringbuffered.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs index 85aeb515f..e2cd11b1b 100644 --- a/embassy-stm32/src/usart/ringbuffered.rs +++ b/embassy-stm32/src/usart/ringbuffered.rs @@ -16,6 +16,7 @@ use crate::gpio::{AnyPin, SealedPin as _}; use crate::mode::Async; use crate::time::Hertz; use crate::usart::{Regs, Sr}; +use crate::pac::usart::regs; /// Rx-only Ring-buffered UART Driver /// From 5512e3a5402b8ca5712914b3f53b78ed22db5fe3 Mon Sep 17 00:00:00 2001 From: Rogan Morrow Date: Fri, 28 Feb 2025 12:49:28 +1100 Subject: [PATCH 5/6] fix --- embassy-stm32/src/usart/ringbuffered.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs index e2cd11b1b..3e14cf3cb 100644 --- a/embassy-stm32/src/usart/ringbuffered.rs +++ b/embassy-stm32/src/usart/ringbuffered.rs @@ -9,14 +9,15 @@ use embedded_io_async::ReadReady; use futures_util::future::{select, Either}; use super::{ - clear_interrupt_flags, rdr, reconfigure, set_baudrate, sr, Config, ConfigError, Error, Info, State, UartRx, + rdr, reconfigure, set_baudrate, sr, Config, ConfigError, Error, Info, State, UartRx, }; use crate::dma::ReadableRingBuffer; use crate::gpio::{AnyPin, SealedPin as _}; use crate::mode::Async; +#[cfg(any(usart_v3, usart_v4))] +use crate::pac::usart::regs; use crate::time::Hertz; use crate::usart::{Regs, Sr}; -use crate::pac::usart::regs; /// Rx-only Ring-buffered UART Driver /// From db44679e7541e67360d92a5e576d97a75c93ea67 Mon Sep 17 00:00:00 2001 From: Rogan Morrow Date: Fri, 28 Feb 2025 12:50:15 +1100 Subject: [PATCH 6/6] fix --- embassy-stm32/src/usart/ringbuffered.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs index 3e14cf3cb..3631888e4 100644 --- a/embassy-stm32/src/usart/ringbuffered.rs +++ b/embassy-stm32/src/usart/ringbuffered.rs @@ -8,9 +8,7 @@ use embassy_hal_internal::PeripheralRef; use embedded_io_async::ReadReady; use futures_util::future::{select, Either}; -use super::{ - rdr, reconfigure, set_baudrate, sr, Config, ConfigError, Error, Info, State, UartRx, -}; +use super::{rdr, reconfigure, set_baudrate, sr, Config, ConfigError, Error, Info, State, UartRx}; use crate::dma::ReadableRingBuffer; use crate::gpio::{AnyPin, SealedPin as _}; use crate::mode::Async;