Merge pull request #2002 from embassy-rs/fix-stop

stm32: fix stop
This commit is contained in:
xoviat 2023-10-02 23:56:33 +00:00 committed by GitHub
commit 58280048e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 40 additions and 36 deletions

5
ci.sh
View File

@ -196,8 +196,9 @@ cargo batch \
--- build --release --manifest-path tests/riscv32/Cargo.toml --target riscv32imac-unknown-none-elf \ --- build --release --manifest-path tests/riscv32/Cargo.toml --target riscv32imac-unknown-none-elf \
$BUILD_EXTRA $BUILD_EXTRA
# temporarily disabled: broken by nightly update and/or clock settings update.
rm out/tests/stm32f429zi/stop rm out/tests/stm32wb55rg/wpan_mac
rm out/tests/stm32wb55rg/wpan_ble
if [[ -z "${TELEPROBE_TOKEN-}" ]]; then if [[ -z "${TELEPROBE_TOKEN-}" ]]; then
echo No teleprobe token found, skipping running HIL tests echo No teleprobe token found, skipping running HIL tests

View File

@ -1,6 +1,7 @@
use core::arch::asm; use core::arch::asm;
use core::marker::PhantomData; use core::marker::PhantomData;
use atomic_polyfill::{compiler_fence, Ordering};
use cortex_m::peripheral::SCB; use cortex_m::peripheral::SCB;
use embassy_executor::*; use embassy_executor::*;
@ -67,10 +68,8 @@ impl Executor {
} }
unsafe fn on_wakeup_irq(&mut self) { unsafe fn on_wakeup_irq(&mut self) {
trace!("low power: on wakeup irq");
self.time_driver.resume_time(); 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) { pub(self) fn stop_with_rtc(&mut self, rtc: &'static Rtc) {
@ -82,22 +81,19 @@ impl Executor {
} }
fn configure_pwr(&mut self) { fn configure_pwr(&mut self) {
trace!("low power: configure_pwr");
self.scb.clear_sleepdeep(); self.scb.clear_sleepdeep();
compiler_fence(Ordering::SeqCst);
if !low_power_ready() { if !low_power_ready() {
trace!("low power: configure_pwr: low power not ready"); trace!("low power: not ready to stop");
return; } else if self.time_driver.pause_time().is_err() {
} trace!("low power: failed to pause time");
} else {
if self.time_driver.pause_time().is_err() { trace!("low power: stop");
trace!("low power: configure_pwr: time driver failed to pause");
return;
}
trace!("low power: enter stop...");
self.scb.set_sleepdeep(); self.scb.set_sleepdeep();
} }
}
/// Run the executor. /// Run the executor.
/// ///

View File

@ -111,8 +111,7 @@ static CLOCK_REFCOUNT: AtomicU32 = AtomicU32::new(0);
#[cfg(feature = "low-power")] #[cfg(feature = "low-power")]
pub fn low_power_ready() -> bool { 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 CLOCK_REFCOUNT.load(Ordering::SeqCst) == 0
} }

View File

@ -112,6 +112,7 @@ impl super::Rtc {
pub(crate) fn stop_wakeup_alarm(&self, cs: critical_section::CriticalSection) -> Option<embassy_time::Duration> { pub(crate) fn stop_wakeup_alarm(&self, cs: critical_section::CriticalSection) -> Option<embassy_time::Duration> {
use crate::interrupt::typelevel::Interrupt; use crate::interrupt::typelevel::Interrupt;
if RTC::regs().cr().read().wute() {
trace!("rtc: stop wakeup alarm at {}", self.instant()); trace!("rtc: stop wakeup alarm at {}", self.instant());
self.write(false, |regs| { self.write(false, |regs| {
@ -125,12 +126,12 @@ impl super::Rtc {
<RTC as crate::rtc::sealed::Instance>::WakeupInterrupt::unpend(); <RTC as crate::rtc::sealed::Instance>::WakeupInterrupt::unpend();
}); });
if let Some(stop_time) = self.stop_time.borrow(cs).take() {
Some(self.instant() - stop_time)
} else {
None
} }
self.stop_time
.borrow(cs)
.take()
.map(|stop_time| self.instant() - stop_time)
} }
#[cfg(feature = "low-power")] #[cfg(feature = "low-power")]

View File

@ -340,7 +340,11 @@ impl RtcDriver {
#[cfg(feature = "low-power")] #[cfg(feature = "low-power")]
/// Set the rtc but panic if it's already been set /// Set the rtc but panic if it's already been set
pub(crate) fn set_rtc(&self, rtc: &'static Rtc) { 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")] #[cfg(feature = "low-power")]

View File

@ -14,6 +14,7 @@ use embassy_stm32::low_power::{stop_with_rtc, Executor};
use embassy_stm32::rcc::RtcClockSource; use embassy_stm32::rcc::RtcClockSource;
use embassy_stm32::rtc::{Rtc, RtcConfig}; use embassy_stm32::rtc::{Rtc, RtcConfig};
use embassy_stm32::time::Hertz; use embassy_stm32::time::Hertz;
use embassy_stm32::Config;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use static_cell::make_static; use static_cell::make_static;
@ -45,7 +46,9 @@ async fn task_2() {
#[embassy_executor::task] #[embassy_executor::task]
async fn async_main(spawner: Spawner) { 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.lse = Some(Hertz(32_768));
config.rcc.rtc = Some(RtcClockSource::LSE); config.rcc.rtc = Some(RtcClockSource::LSE);