shutdown added
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
// src/sleep/mod.rs
|
// src/sleep/mod.rs
|
||||||
|
|
||||||
pub mod standby;
|
pub mod standby;
|
||||||
|
pub mod shutdown;
|
||||||
|
|||||||
13
semestralka_2/src/sleep/shutdown.rs
Normal file
13
semestralka_2/src/sleep/shutdown.rs
Normal 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
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user