aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxoviat <[email protected]>2023-10-02 18:11:03 -0500
committerxoviat <[email protected]>2023-10-02 18:11:03 -0500
commite042b3056d64564f7ed738883253372914847fbc (patch)
tree0e75ed33b351a75270fe9c4b6720b5dfe1ae96c5
parenta742a80171508b33988095c23f64d4d58d087fbb (diff)
stm32: fix stop
-rwxr-xr-xci.sh2
-rw-r--r--embassy-stm32/src/low_power.rs26
-rw-r--r--embassy-stm32/src/rcc/mod.rs3
-rw-r--r--embassy-stm32/src/rtc/v2.rs31
-rw-r--r--embassy-stm32/src/time_driver.rs6
5 files changed, 33 insertions, 35 deletions
diff --git a/ci.sh b/ci.sh
index 7e688a51b..de46d898b 100755
--- a/ci.sh
+++ b/ci.sh
@@ -196,8 +196,6 @@ cargo batch \
196 --- build --release --manifest-path tests/riscv32/Cargo.toml --target riscv32imac-unknown-none-elf \ 196 --- build --release --manifest-path tests/riscv32/Cargo.toml --target riscv32imac-unknown-none-elf \
197 $BUILD_EXTRA 197 $BUILD_EXTRA
198 198
199# temporarily disabled: broken by nightly update and/or clock settings update.
200rm out/tests/stm32f429zi/stop
201 199
202if [[ -z "${TELEPROBE_TOKEN-}" ]]; then 200if [[ -z "${TELEPROBE_TOKEN-}" ]]; then
203 echo No teleprobe token found, skipping running HIL tests 201 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 ce8afb578..bb714b8ca 100644
--- a/embassy-stm32/src/low_power.rs
+++ b/embassy-stm32/src/low_power.rs
@@ -1,6 +1,7 @@
1use core::arch::asm; 1use core::arch::asm;
2use core::marker::PhantomData; 2use core::marker::PhantomData;
3 3
4use atomic_polyfill::{compiler_fence, Ordering};
4use cortex_m::peripheral::SCB; 5use cortex_m::peripheral::SCB;
5use embassy_executor::*; 6use embassy_executor::*;
6 7
@@ -67,10 +68,8 @@ impl Executor {
67 } 68 }
68 69
69 unsafe fn on_wakeup_irq(&mut self) { 70 unsafe fn on_wakeup_irq(&mut self) {
70 trace!("low power: on wakeup irq");
71
72 self.time_driver.resume_time(); 71 self.time_driver.resume_time();
73 trace!("low power: resume time"); 72 trace!("low power: resume");
74 } 73 }
75 74
76 pub(self) fn stop_with_rtc(&mut self, rtc: &'static Rtc) { 75 pub(self) fn stop_with_rtc(&mut self, rtc: &'static Rtc) {
@@ -82,21 +81,18 @@ impl Executor {
82 } 81 }
83 82
84 fn configure_pwr(&mut self) { 83 fn configure_pwr(&mut self) {
85 trace!("low power: configure_pwr");
86
87 self.scb.clear_sleepdeep(); 84 self.scb.clear_sleepdeep();
88 if !low_power_ready() {
89 trace!("low power: configure_pwr: low power not ready");
90 return;
91 }
92 85
93 if self.time_driver.pause_time().is_err() { 86 compiler_fence(Ordering::SeqCst);
94 trace!("low power: configure_pwr: time driver failed to pause");
95 return;
96 }
97 87
98 trace!("low power: enter stop..."); 88 if !low_power_ready() {
99 self.scb.set_sleepdeep(); 89 trace!("low power: not ready to stop");
90 } else if self.time_driver.pause_time().is_err() {
91 trace!("low power: failed to pause time");
92 } else {
93 trace!("low power: stop");
94 self.scb.set_sleepdeep();
95 }
100 } 96 }
101 97
102 /// Run the executor. 98 /// Run the executor.
diff --git a/embassy-stm32/src/rcc/mod.rs b/embassy-stm32/src/rcc/mod.rs
index 9ccf2ac4f..ac9673833 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);
111 111
112#[cfg(feature = "low-power")] 112#[cfg(feature = "low-power")]
113pub fn low_power_ready() -> bool { 113pub fn low_power_ready() -> bool {
114 trace!("clock refcount: {}", CLOCK_REFCOUNT.load(Ordering::SeqCst)); 114 // trace!("clock refcount: {}", CLOCK_REFCOUNT.load(Ordering::SeqCst));
115
116 CLOCK_REFCOUNT.load(Ordering::SeqCst) == 0 115 CLOCK_REFCOUNT.load(Ordering::SeqCst) == 0
117} 116}
118 117
diff --git a/embassy-stm32/src/rtc/v2.rs b/embassy-stm32/src/rtc/v2.rs
index 4608d3114..4974f6ee6 100644
--- a/embassy-stm32/src/rtc/v2.rs
+++ b/embassy-stm32/src/rtc/v2.rs
@@ -112,25 +112,26 @@ impl super::Rtc {
112 pub(crate) fn stop_wakeup_alarm(&self, cs: critical_section::CriticalSection) -> Option<embassy_time::Duration> { 112 pub(crate) fn stop_wakeup_alarm(&self, cs: critical_section::CriticalSection) -> Option<embassy_time::Duration> {
113 use crate::interrupt::typelevel::Interrupt; 113 use crate::interrupt::typelevel::Interrupt;
114 114
115 trace!("rtc: stop wakeup alarm at {}", self.instant()); 115 if RTC::regs().cr().read().wute() {
116 trace!("rtc: stop wakeup alarm at {}", self.instant());
116 117
117 self.write(false, |regs| { 118 self.write(false, |regs| {
118 regs.cr().modify(|w| w.set_wutie(false)); 119 regs.cr().modify(|w| w.set_wutie(false));
119 regs.cr().modify(|w| w.set_wute(false)); 120 regs.cr().modify(|w| w.set_wute(false));
120 regs.isr().modify(|w| w.set_wutf(false)); 121 regs.isr().modify(|w| w.set_wutf(false));
121 122
122 crate::pac::EXTI 123 crate::pac::EXTI
123 .pr(0) 124 .pr(0)
124 .modify(|w| w.set_line(RTC::EXTI_WAKEUP_LINE, true)); 125 .modify(|w| w.set_line(RTC::EXTI_WAKEUP_LINE, true));
125
126 <RTC as crate::rtc::sealed::Instance>::WakeupInterrupt::unpend();
127 });
128 126
129 if let Some(stop_time) = self.stop_time.borrow(cs).take() { 127 <RTC as crate::rtc::sealed::Instance>::WakeupInterrupt::unpend();
130 Some(self.instant() - stop_time) 128 });
131 } else {
132 None
133 } 129 }
130
131 self.stop_time
132 .borrow(cs)
133 .take()
134 .map(|stop_time| self.instant() - stop_time)
134 } 135 }
135 136
136 #[cfg(feature = "low-power")] 137 #[cfg(feature = "low-power")]
diff --git a/embassy-stm32/src/time_driver.rs b/embassy-stm32/src/time_driver.rs
index 5b01937f5..917502412 100644
--- a/embassy-stm32/src/time_driver.rs
+++ b/embassy-stm32/src/time_driver.rs
@@ -340,7 +340,11 @@ impl RtcDriver {
340 #[cfg(feature = "low-power")] 340 #[cfg(feature = "low-power")]
341 /// Set the rtc but panic if it's already been set 341 /// Set the rtc but panic if it's already been set
342 pub(crate) fn set_rtc(&self, rtc: &'static Rtc) { 342 pub(crate) fn set_rtc(&self, rtc: &'static Rtc) {
343 critical_section::with(|cs| assert!(self.rtc.borrow(cs).replace(Some(rtc)).is_none())); 343 critical_section::with(|cs| {
344 rtc.stop_wakeup_alarm(cs);
345
346 assert!(self.rtc.borrow(cs).replace(Some(rtc)).is_none())
347 });
344 } 348 }
345 349
346 #[cfg(feature = "low-power")] 350 #[cfg(feature = "low-power")]