From e042b3056d64564f7ed738883253372914847fbc Mon Sep 17 00:00:00 2001 From: xoviat Date: Mon, 2 Oct 2023 18:11:03 -0500 Subject: [PATCH 1/3] stm32: fix stop --- ci.sh | 2 -- embassy-stm32/src/low_power.rs | 26 +++++++++++--------------- embassy-stm32/src/rcc/mod.rs | 3 +-- embassy-stm32/src/rtc/v2.rs | 31 ++++++++++++++++--------------- embassy-stm32/src/time_driver.rs | 6 +++++- 5 files changed, 33 insertions(+), 35 deletions(-) diff --git a/ci.sh b/ci.sh index 7e688a51..de46d898 100755 --- a/ci.sh +++ b/ci.sh @@ -196,8 +196,6 @@ cargo batch \ --- build --release --manifest-path tests/riscv32/Cargo.toml --target riscv32imac-unknown-none-elf \ $BUILD_EXTRA -# temporarily disabled: broken by nightly update and/or clock settings update. -rm out/tests/stm32f429zi/stop if [[ -z "${TELEPROBE_TOKEN-}" ]]; then echo No teleprobe token found, skipping running HIL tests diff --git a/embassy-stm32/src/low_power.rs b/embassy-stm32/src/low_power.rs index ce8afb57..bb714b8c 100644 --- a/embassy-stm32/src/low_power.rs +++ b/embassy-stm32/src/low_power.rs @@ -1,6 +1,7 @@ use core::arch::asm; use core::marker::PhantomData; +use atomic_polyfill::{compiler_fence, Ordering}; use cortex_m::peripheral::SCB; use embassy_executor::*; @@ -67,10 +68,8 @@ impl Executor { } unsafe fn on_wakeup_irq(&mut self) { - trace!("low power: on wakeup irq"); - self.time_driver.resume_time(); - trace!("low power: resume time"); + trace!("low power: resume"); } pub(self) fn stop_with_rtc(&mut self, rtc: &'static Rtc) { @@ -82,21 +81,18 @@ impl Executor { } fn configure_pwr(&mut self) { - trace!("low power: configure_pwr"); - self.scb.clear_sleepdeep(); + + compiler_fence(Ordering::SeqCst); + if !low_power_ready() { - trace!("low power: configure_pwr: low power not ready"); - return; + trace!("low power: not ready to stop"); + } else if self.time_driver.pause_time().is_err() { + trace!("low power: failed to pause time"); + } else { + trace!("low power: stop"); + self.scb.set_sleepdeep(); } - - if self.time_driver.pause_time().is_err() { - trace!("low power: configure_pwr: time driver failed to pause"); - return; - } - - trace!("low power: enter stop..."); - self.scb.set_sleepdeep(); } /// Run the executor. diff --git a/embassy-stm32/src/rcc/mod.rs b/embassy-stm32/src/rcc/mod.rs index 9ccf2ac4..ac967383 100644 --- a/embassy-stm32/src/rcc/mod.rs +++ b/embassy-stm32/src/rcc/mod.rs @@ -111,8 +111,7 @@ static CLOCK_REFCOUNT: AtomicU32 = AtomicU32::new(0); #[cfg(feature = "low-power")] pub fn low_power_ready() -> bool { - trace!("clock refcount: {}", CLOCK_REFCOUNT.load(Ordering::SeqCst)); - + // trace!("clock refcount: {}", CLOCK_REFCOUNT.load(Ordering::SeqCst)); CLOCK_REFCOUNT.load(Ordering::SeqCst) == 0 } diff --git a/embassy-stm32/src/rtc/v2.rs b/embassy-stm32/src/rtc/v2.rs index 4608d311..4974f6ee 100644 --- a/embassy-stm32/src/rtc/v2.rs +++ b/embassy-stm32/src/rtc/v2.rs @@ -112,25 +112,26 @@ impl super::Rtc { pub(crate) fn stop_wakeup_alarm(&self, cs: critical_section::CriticalSection) -> Option { use crate::interrupt::typelevel::Interrupt; - trace!("rtc: stop wakeup alarm at {}", self.instant()); + if RTC::regs().cr().read().wute() { + trace!("rtc: stop wakeup alarm at {}", self.instant()); - self.write(false, |regs| { - regs.cr().modify(|w| w.set_wutie(false)); - regs.cr().modify(|w| w.set_wute(false)); - regs.isr().modify(|w| w.set_wutf(false)); + self.write(false, |regs| { + regs.cr().modify(|w| w.set_wutie(false)); + regs.cr().modify(|w| w.set_wute(false)); + regs.isr().modify(|w| w.set_wutf(false)); - crate::pac::EXTI - .pr(0) - .modify(|w| w.set_line(RTC::EXTI_WAKEUP_LINE, true)); + crate::pac::EXTI + .pr(0) + .modify(|w| w.set_line(RTC::EXTI_WAKEUP_LINE, true)); - ::WakeupInterrupt::unpend(); - }); - - if let Some(stop_time) = self.stop_time.borrow(cs).take() { - Some(self.instant() - stop_time) - } else { - None + ::WakeupInterrupt::unpend(); + }); } + + self.stop_time + .borrow(cs) + .take() + .map(|stop_time| self.instant() - stop_time) } #[cfg(feature = "low-power")] diff --git a/embassy-stm32/src/time_driver.rs b/embassy-stm32/src/time_driver.rs index 5b01937f..91750241 100644 --- a/embassy-stm32/src/time_driver.rs +++ b/embassy-stm32/src/time_driver.rs @@ -340,7 +340,11 @@ impl RtcDriver { #[cfg(feature = "low-power")] /// Set the rtc but panic if it's already been set pub(crate) fn set_rtc(&self, rtc: &'static Rtc) { - critical_section::with(|cs| assert!(self.rtc.borrow(cs).replace(Some(rtc)).is_none())); + critical_section::with(|cs| { + rtc.stop_wakeup_alarm(cs); + + assert!(self.rtc.borrow(cs).replace(Some(rtc)).is_none()) + }); } #[cfg(feature = "low-power")] From adf9ffb1095a65a375b7426086e6b99ccda3abc1 Mon Sep 17 00:00:00 2001 From: xoviat Date: Mon, 2 Oct 2023 18:51:59 -0500 Subject: [PATCH 2/3] tests/stm32: use default clock config --- tests/stm32/src/bin/stop.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/stm32/src/bin/stop.rs b/tests/stm32/src/bin/stop.rs index 48d59b79..55c4aa90 100644 --- a/tests/stm32/src/bin/stop.rs +++ b/tests/stm32/src/bin/stop.rs @@ -14,6 +14,7 @@ use embassy_stm32::low_power::{stop_with_rtc, Executor}; use embassy_stm32::rcc::RtcClockSource; use embassy_stm32::rtc::{Rtc, RtcConfig}; use embassy_stm32::time::Hertz; +use embassy_stm32::Config; use embassy_time::{Duration, Timer}; use static_cell::make_static; @@ -45,7 +46,9 @@ async fn task_2() { #[embassy_executor::task] async fn async_main(spawner: Spawner) { - let mut config = config(); + let _ = config(); + + let mut config = Config::default(); config.rcc.lse = Some(Hertz(32_768)); config.rcc.rtc = Some(RtcClockSource::LSE); From 00824af82ba8bfa5cd8226ee057719595d8d10af Mon Sep 17 00:00:00 2001 From: xoviat Date: Mon, 2 Oct 2023 18:55:31 -0500 Subject: [PATCH 3/3] ci: remove wpan tests --- ci.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci.sh b/ci.sh index de46d898..318c6cc0 100755 --- a/ci.sh +++ b/ci.sh @@ -197,6 +197,9 @@ cargo batch \ $BUILD_EXTRA +rm out/tests/stm32wb55rg/wpan_mac +rm out/tests/stm32wb55rg/wpan_ble + if [[ -z "${TELEPROBE_TOKEN-}" ]]; then echo No teleprobe token found, skipping running HIL tests exit