From 4e808345883ae64099135a8384f774c44feccc5c Mon Sep 17 00:00:00 2001 From: xoviat Date: Tue, 18 Nov 2025 16:27:10 -0600 Subject: fix: fix incorrect logic for buffered usart transmission complete. --- embassy-stm32/CHANGELOG.md | 1 + embassy-stm32/src/usart/buffered.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/embassy-stm32/CHANGELOG.md b/embassy-stm32/CHANGELOG.md index b6caf8f65..5fd43744e 100644 --- a/embassy-stm32/CHANGELOG.md +++ b/embassy-stm32/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased - ReleaseDate +- fix: fix incorrect logic for buffered usart transmission complete. - change: stm32/eth: ethernet no longer has a hard dependency on station management, and station management can be used independently ([#4871](https://github.com/embassy-rs/embassy/pull/4871)) - feat: allow embassy_executor::main for low power - feat: Add waveform methods to ComplementaryPwm diff --git a/embassy-stm32/src/usart/buffered.rs b/embassy-stm32/src/usart/buffered.rs index 69c3a740f..26d2b8991 100644 --- a/embassy-stm32/src/usart/buffered.rs +++ b/embassy-stm32/src/usart/buffered.rs @@ -87,7 +87,7 @@ unsafe fn on_interrupt(r: Regs, state: &'static State) { // With `usart_v4` hardware FIFO is enabled and Transmission complete (TC) // indicates that all bytes are pushed out from the FIFO. // For other usart variants it shows that last byte from the buffer was just sent. - if sr_val.tc() { + if sr_val.tc() && r.cr1().read().tcie() { // For others it is cleared above with `clear_interrupt_flags`. #[cfg(any(usart_v1, usart_v2))] sr(r).modify(|w| w.set_tc(false)); -- cgit From 331901135c9537e726e08390eacdcd6c965d2406 Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 20 Nov 2025 07:49:04 -0600 Subject: low power: don't enter stop without rcc config --- embassy-stm32/src/low_power.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/embassy-stm32/src/low_power.rs b/embassy-stm32/src/low_power.rs index f35eb71e4..9de49c867 100644 --- a/embassy-stm32/src/low_power.rs +++ b/embassy-stm32/src/low_power.rs @@ -50,7 +50,7 @@ use critical_section::CriticalSection; use embassy_executor::*; use crate::interrupt; -use crate::rcc::{REFCOUNT_STOP1, REFCOUNT_STOP2}; +use crate::rcc::{RCC_CONFIG, REFCOUNT_STOP1, REFCOUNT_STOP2}; use crate::time_driver::get_driver; const THREAD_PENDER: usize = usize::MAX; @@ -201,7 +201,7 @@ impl Executor { { use crate::pac::rcc::vals::Sw; use crate::pac::{PWR, RCC}; - use crate::rcc::{RCC_CONFIG, init as init_rcc}; + use crate::rcc::init as init_rcc; let extscr = PWR.extscr().read(); if extscr.c1stop2f() || extscr.c1stopf() { @@ -245,7 +245,7 @@ impl Executor { } #[cfg(all(stm32wb, feature = "low-power"))] - fn configure_stop_stm32wb(&self) -> Result<(), ()> { + fn configure_stop_stm32wb(&self, _cs: CriticalSection) -> Result<(), ()> { use core::task::Poll; use embassy_futures::poll_once; @@ -303,9 +303,9 @@ impl Executor { } #[allow(unused_variables)] - fn configure_stop(&self, stop_mode: StopMode) -> Result<(), ()> { + fn configure_stop(&self, _cs: CriticalSection, stop_mode: StopMode) -> Result<(), ()> { #[cfg(all(stm32wb, feature = "low-power"))] - self.configure_stop_stm32wb()?; + self.configure_stop_stm32wb(_cs)?; #[cfg(any(stm32l4, stm32l5, stm32u5, stm32u0, stm32wb, stm32wba, stm32wlex))] crate::pac::PWR.cr1().modify(|m| m.set_lpms(stop_mode.into())); @@ -330,9 +330,10 @@ impl Executor { compiler_fence(Ordering::SeqCst); critical_section::with(|cs| { + let _ = unsafe { RCC_CONFIG }?; let stop_mode = Self::stop_mode(cs)?; - let _ = get_driver().pause_time(cs).ok()?; - self.configure_stop(stop_mode).ok()?; + get_driver().pause_time(cs).ok()?; + self.configure_stop(cs, stop_mode).ok()?; Some(()) }) -- cgit From 8d1b4fde897af2c943b5b1abe1503a49a5b8560a Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 20 Nov 2025 07:49:14 -0600 Subject: adc: fix ringbuf stop --- embassy-stm32/src/adc/ringbuffered.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/embassy-stm32/src/adc/ringbuffered.rs b/embassy-stm32/src/adc/ringbuffered.rs index a56f8ca0b..5437866d3 100644 --- a/embassy-stm32/src/adc/ringbuffered.rs +++ b/embassy-stm32/src/adc/ringbuffered.rs @@ -49,8 +49,6 @@ impl<'d, T: Instance + AnyInstance> RingBufferedAdc<'d, T> { } pub fn stop(&mut self) { - T::stop(); - self.ring_buf.request_pause(); compiler_fence(Ordering::SeqCst); @@ -161,7 +159,7 @@ impl<'d, T: Instance + AnyInstance> RingBufferedAdc<'d, T> { return Ok(len); } Err(_) => { - self.stop(); + self.ring_buf.request_pause(); return Err(OverrunError); } -- cgit From 3abc2e592f66c16ada6c475e48cde282b79d3c1f Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 20 Nov 2025 14:27:31 -0600 Subject: adc: allow usage of anyadcchannel for adc4 --- embassy-stm32/CHANGELOG.md | 1 + embassy-stm32/src/adc/mod.rs | 6 +++--- examples/stm32u5/src/bin/adc.rs | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/embassy-stm32/CHANGELOG.md b/embassy-stm32/CHANGELOG.md index 597cbb192..c547fa443 100644 --- a/embassy-stm32/CHANGELOG.md +++ b/embassy-stm32/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased - ReleaseDate +- feat: allow use of anyadcchannel for adc4 - change: rework hsem and add HIL test for some chips. - change: stm32/eth: ethernet no longer has a hard dependency on station management, and station management can be used independently ([#4871](https://github.com/embassy-rs/embassy/pull/4871)) - feat: allow embassy_executor::main for low power diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs index 74648cc21..755cb78c2 100644 --- a/embassy-stm32/src/adc/mod.rs +++ b/embassy-stm32/src/adc/mod.rs @@ -436,9 +436,9 @@ pub struct AnyAdcChannel { is_differential: bool, _phantom: PhantomData, } -impl_peripheral!(AnyAdcChannel); -impl AdcChannel for AnyAdcChannel {} -impl SealedAdcChannel for AnyAdcChannel { +impl_peripheral!(AnyAdcChannel); +impl AdcChannel for AnyAdcChannel {} +impl SealedAdcChannel for AnyAdcChannel { fn channel(&self) -> u8 { self.channel } diff --git a/examples/stm32u5/src/bin/adc.rs b/examples/stm32u5/src/bin/adc.rs index ad59c0bea..4d2d93aa2 100644 --- a/examples/stm32u5/src/bin/adc.rs +++ b/examples/stm32u5/src/bin/adc.rs @@ -31,7 +31,7 @@ async fn main(_spawner: embassy_executor::Spawner) { // **** ADC4 init **** let mut adc4 = Adc::new_adc4(p.ADC4); - let mut adc4_pin1 = p.PC1; // A4 + let mut adc4_pin1 = p.PC1.degrade_adc(); // A4 let mut adc4_pin2 = p.PC0; // A5 adc4.set_resolution_adc4(adc4::Resolution::BITS12); adc4.set_averaging_adc4(adc4::Averaging::Samples256); -- cgit