Skip to content

Commit 3e4b016

Browse files
committed
add low-power example and hsem traces for #4092
1 parent 053c947 commit 3e4b016

File tree

3 files changed

+74
-2
lines changed

3 files changed

+74
-2
lines changed

embassy-stm32/src/hsem/mod.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,14 +203,31 @@ impl<'d, T: Instance> HardwareSemaphore<'d, T> {
203203
/// carried out from the HSEM_RLRx register.
204204
pub fn one_step_lock(&mut self, sem_id: SemId) -> Result<(), HsemError> {
205205
let reg = T::regs().rlr(sem_id.into()).read();
206+
trace!(
207+
"RLR (bits: 0x{:x}) - lock: {}, coreid: {}, procid: {}",
208+
reg.0,
209+
reg.lock(),
210+
reg.coreid(),
211+
reg.procid()
212+
);
206213

207214
match (
208215
reg.lock(),
209216
reg.coreid() == RlrCoreId::from(CoreId::get_current()) as u8,
210217
reg.procid(),
211218
) {
212-
(true, true, 0) => Ok(()),
213-
_ => Err(HsemError::LockFailed),
219+
(true, true, 0) => {
220+
trace!(
221+
"Locked successfully (coreid: {}, procid: {})",
222+
reg.coreid(),
223+
reg.procid()
224+
);
225+
Ok(())
226+
}
227+
_ => {
228+
trace!("Failed to lock (coreid: {}, procid: {})", reg.coreid(), reg.procid());
229+
Err(HsemError::LockFailed)
230+
}
214231
}
215232
}
216233

examples/stm32wb/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ static_cell = "2"
2727
default = ["ble", "mac"]
2828
mac = ["embassy-stm32-wpan/mac", "dep:embassy-net"]
2929
ble = ["embassy-stm32-wpan/ble"]
30+
low-power = ["embassy-stm32/low-power"]
3031

3132
[[bin]]
3233
name = "tl_mbox_ble"
@@ -52,5 +53,9 @@ required-features = ["ble"]
5253
name = "gatt_server"
5354
required-features = ["ble"]
5455

56+
[[bin]]
57+
name = "low_power"
58+
required-features = ["low-power"]
59+
5560
[profile.release]
5661
debug = 2

examples/stm32wb/src/bin/low_power.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#![no_std]
2+
#![no_main]
3+
4+
use defmt::*;
5+
use embassy_executor::Spawner;
6+
use embassy_stm32::gpio::{Level, Output, Speed};
7+
use embassy_stm32::rtc::{Rtc, RtcConfig};
8+
use embassy_stm32::peripherals;
9+
use embassy_time::Timer;
10+
use {defmt_rtt as _, panic_probe as _};
11+
use static_cell::StaticCell;
12+
13+
#[cortex_m_rt::entry]
14+
fn main() -> ! {
15+
embassy_stm32::low_power::Executor::take().run(|spawner| {
16+
spawner.spawn(async_main(spawner)).unwrap();
17+
});
18+
}
19+
20+
#[embassy_executor::task]
21+
async fn async_main(_spawner: Spawner) {
22+
let mut config = embassy_stm32::Config::default();
23+
// when enabled the power-consumption is much higher during stop, but debugging and RTT is working
24+
config.enable_debug_during_sleep = true;
25+
// Enable LSE and configure RTC to use LSE
26+
config.rcc.ls = embassy_stm32::rcc::LsConfig::default_lse();
27+
config.rcc.ls.rtc = embassy_stm32::rcc::RtcClockSource::LSE;
28+
let p = embassy_stm32::init(config);
29+
30+
static RTC: StaticCell<Rtc> = StaticCell::new();
31+
static HSEM: StaticCell<embassy_stm32::hsem::HardwareSemaphore<peripherals::HSEM>> = StaticCell::new();
32+
let rtc = RTC.init(Rtc::new(p.RTC, RtcConfig::default()));
33+
let hsem = HSEM.init(embassy_stm32::hsem::HardwareSemaphore::new(p.HSEM));
34+
35+
embassy_stm32::low_power::stop_with_rtc_and_hsem(rtc, hsem);
36+
37+
info!("Hello World!");
38+
39+
let mut led = Output::new(p.PB0, Level::High, Speed::Low);
40+
41+
loop {
42+
info!("high");
43+
led.set_high();
44+
Timer::after_millis(1000).await;
45+
46+
info!("low");
47+
led.set_low();
48+
Timer::after_millis(1000).await;
49+
}
50+
}

0 commit comments

Comments
 (0)