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")]