shutdown added

This commit is contained in:
Priec
2025-12-03 17:57:10 +01:00
parent 33543099c2
commit 434e2b3d21
4 changed files with 32 additions and 11 deletions

View File

@@ -19,16 +19,13 @@ use dma_gpio::config::{
}; };
use dma_gpio::hw_uart_pc::{driver::uart_task, usart1}; use dma_gpio::hw_uart_pc::{driver::uart_task, usart1};
use dma_gpio::wakeup::iwdg::{clear_wakeup_flags, init_watchdog}; use dma_gpio::wakeup::iwdg::{clear_wakeup_flags, init_watchdog};
use dma_gpio::sleep::shutdown::enter_shutdown;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs { bind_interrupts!(struct Irqs {
USART1 => BufferedInterruptHandler<peripherals::USART1>; USART1 => BufferedInterruptHandler<peripherals::USART1>;
}); });
unsafe extern "C" {
fn HAL_PWR_EnterSTANDBYMode();
}
#[embassy_executor::main] #[embassy_executor::main]
async fn main(spawner: Spawner) { async fn main(spawner: Spawner) {
info!("boot"); info!("boot");
@@ -65,18 +62,14 @@ async fn main(spawner: Spawner) {
info!("DBGMCU CR: dbg_stop={}, dbg_standby={}", cr.dbg_stop(), cr.dbg_standby()); info!("DBGMCU CR: dbg_stop={}, dbg_standby={}", cr.dbg_stop(), cr.dbg_standby());
// MAIN LOOP // MAIN LOOP
info!("Preparing for standby...");
Timer::after(Duration::from_millis(500)).await; Timer::after(Duration::from_millis(500)).await;
init_watchdog(p.IWDG).await; // init_watchdog(p.IWDG).await;
Timer::after(Duration::from_millis(10)).await; Timer::after(Duration::from_millis(10)).await;
unsafe {
info!("Standby...");
HAL_PWR_EnterSTANDBYMode();
}
loop { loop {
info!("entering shutdown");
enter_shutdown();
cortex_m::asm::wfi(); cortex_m::asm::wfi();
yield_now().await; yield_now().await;
} }

View File

@@ -1,3 +1,4 @@
// src/sleep/mod.rs // src/sleep/mod.rs
pub mod standby; pub mod standby;
pub mod shutdown;

View File

@@ -0,0 +1,13 @@
// src/sleep/standby.rs
pub fn enter_shutdown() -> ! {
unsafe extern "C" {
fn HAL_PWREx_EnterSHUTDOWNMode();
}
unsafe {
HAL_PWREx_EnterSHUTDOWNMode();
}
cortex_m::asm::udf(); //panic
}

View File

@@ -9,6 +9,15 @@ use embassy_stm32::pac;
use crate::config::WATCHDOG_TIMEOUT_US; use crate::config::WATCHDOG_TIMEOUT_US;
/// Clears system reset and standby flags after wakeup.
///
/// Call early in startup to:
/// - Clear reset flags by setting `RMVF` in `RCC_CSR`.
/// - If `SBF` in `PWR_SR` is set (woke from Standby), clear it.
///
/// # Registers
/// - `RCC_CSR` — Reset and Clock Control / Status
/// - `PWR_SR` — Power Control / Status
pub fn clear_wakeup_flags() { pub fn clear_wakeup_flags() {
info!("Clearing wakeup flags..."); info!("Clearing wakeup flags...");
@@ -26,6 +35,11 @@ pub fn clear_wakeup_flags() {
} }
} }
/// Initializes the Independent Watchdog (IWDG) timer.
/// Wakeup source: Can wake the system from Standby mode on timeout
///
/// # Timing
/// - Timeout value is configured in `WATCHDOG_TIMEOUT_US` from config.rs
pub async fn init_watchdog(iwdg: Peri<'_, peripherals::IWDG>) { pub async fn init_watchdog(iwdg: Peri<'_, peripherals::IWDG>) {
info!("Initializing watchdog after watchdog wake..."); info!("Initializing watchdog after watchdog wake...");
let mut watchdog = IndependentWatchdog::new(iwdg, WATCHDOG_TIMEOUT_US); let mut watchdog = IndependentWatchdog::new(iwdg, WATCHDOG_TIMEOUT_US);