diff --git a/src/Power.cpp b/src/Power.cpp index 1c1f34cd406..4118dac538c 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -906,7 +906,7 @@ void Power::shutdown() #if HAS_SCREEN messageStore.saveToFlash(); #endif -#if defined(ARCH_NRF52) || defined(ARCH_ESP32) || defined(ARCH_RP2040) +#if defined(ARCH_NRF52) || defined(ARCH_ESP32) || defined(ARCH_RP2040) || defined(ARCH_STM32WL) #ifdef PIN_LED1 ledOff(PIN_LED1); #endif diff --git a/src/platform/stm32wl/main-stm32wl.cpp b/src/platform/stm32wl/main-stm32wl.cpp index 97b63a96582..d429c5662de 100644 --- a/src/platform/stm32wl/main-stm32wl.cpp +++ b/src/platform/stm32wl/main-stm32wl.cpp @@ -7,6 +7,7 @@ #include #if HAS_LSE +#include #include // LSEDRV is a 2-bit RCC_BDCR field where every combination is a legal drive level, so this covers all 4 values. @@ -120,6 +121,7 @@ void stm32wlSetup() rtc.setClockSource(STM32RTC::LSE_CLOCK); rtc.begin(); stm32wlRtcValid = true; + LowPower.begin(); LOG_INFO("STM32WL: LSE locked, hardware RTC available"); } else { // Don't leave a failed oscillator burning current. @@ -138,7 +140,34 @@ bool stm32wlRtcAvailable() void stm32wlSetup() {} #endif -void cpuDeepSleep(uint32_t msecToWake) {} +void cpuDeepSleep(uint32_t msecToWake) +{ +#if HAS_LSE + if (!stm32wlRtcAvailable()) { + // Hardware can't shutdown, but firmware has already prepared itself for shutdown + // Do not leave the device unresponsive, reset instead + LOG_WARN("STM32WL: hardware RTC failed, cannot deep sleep/shutdown"); + if (Serial) { + Serial.flush(); + Serial.end(); + } + HAL_NVIC_SystemReset(); + } + + if (Serial) { + Serial.flush(); + Serial.end(); + } + + if (msecToWake != portMAX_DELAY) { + LowPower.shutdown(msecToWake); + } else { + LowPower.shutdown(); + } + // RTC wakes from shutdown into MCU reset, so this code should never be reached + HAL_NVIC_SystemReset(); +#endif +} // Hacks to force more code and data out. diff --git a/variants/stm32/rak3172/platformio.ini b/variants/stm32/rak3172/platformio.ini index 514668a12db..5ed5be1d709 100644 --- a/variants/stm32/rak3172/platformio.ini +++ b/variants/stm32/rak3172/platformio.ini @@ -20,5 +20,7 @@ lib_deps = ${stm32_base.lib_deps} # renovate: datasource=github-tags depName=STM32RTC packageName=stm32duino/STM32RTC https://github.com/stm32duino/STM32RTC/archive/refs/tags/1.9.0.zip + # renovate: datasource=github-tags depName=STM32LowPower packageName=stm32duino/STM32LowPower + https://github.com/stm32duino/STM32LowPower/archive/refs/tags/1.5.0.zip upload_port = stlink