diff --git a/soc/arm/st_stm32/stm32wb/CMakeLists.txt b/soc/arm/st_stm32/stm32wb/CMakeLists.txt index 5ae42f3a1d2..2b21a72d326 100644 --- a/soc/arm/st_stm32/stm32wb/CMakeLists.txt +++ b/soc/arm/st_stm32/stm32wb/CMakeLists.txt @@ -11,3 +11,5 @@ zephyr_linker_sources_ifdef(CONFIG_BT_STM32_IPM zephyr_sources_ifdef(CONFIG_PM power.c ) + +zephyr_sources_ifdef(CONFIG_POWEROFF poweroff.c) diff --git a/soc/arm/st_stm32/stm32wb/Kconfig.series b/soc/arm/st_stm32/stm32wb/Kconfig.series index 03c9bf95723..a0192ae4e6c 100644 --- a/soc/arm/st_stm32/stm32wb/Kconfig.series +++ b/soc/arm/st_stm32/stm32wb/Kconfig.series @@ -14,5 +14,6 @@ config SOC_SERIES_STM32WBX select CPU_HAS_ARM_MPU select HAS_SWO select HAS_PM + select HAS_POWEROFF help Enable support for STM32WB MCU series diff --git a/soc/arm/st_stm32/stm32wb/power.c b/soc/arm/st_stm32/stm32wb/power.c index cf368503c36..e3dcdfa6cab 100644 --- a/soc/arm/st_stm32/stm32wb/power.c +++ b/soc/arm/st_stm32/stm32wb/power.c @@ -58,15 +58,7 @@ static void lpm_hsem_lock(void) /* Invoke Low Power/System Off specific Tasks */ void pm_state_set(enum pm_state state, uint8_t substate_id) { - if (state == PM_STATE_SOFT_OFF) { - lpm_hsem_lock(); - - /* Clear all Wake-Up flags */ - LL_PWR_ClearFlag_WU(); - - LL_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN); - - } else if (state == PM_STATE_SUSPEND_TO_IDLE) { + if (state == PM_STATE_SUSPEND_TO_IDLE) { lpm_hsem_lock(); @@ -93,18 +85,17 @@ void pm_state_set(enum pm_state state, uint8_t substate_id) return; } + /* Release RCC semaphore */ + z_stm32_hsem_unlock(CFG_HW_RCC_SEMID); + + LL_LPM_EnableDeepSleep(); + + /* enter SLEEP mode : WFE or WFI */ + k_cpu_idle(); } else { LOG_DBG("Unsupported power state %u", state); return; } - - /* Release RCC semaphore */ - z_stm32_hsem_unlock(CFG_HW_RCC_SEMID); - - LL_LPM_EnableDeepSleep(); - - /* enter SLEEP mode : WFE or WFI */ - k_cpu_idle(); } /* Handle SOC specific activity after Low Power Mode Exit */ diff --git a/soc/arm/st_stm32/stm32wb/poweroff.c b/soc/arm/st_stm32/stm32wb/poweroff.c new file mode 100644 index 00000000000..d95aa24fc0c --- /dev/null +++ b/soc/arm/st_stm32/stm32wb/poweroff.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2023 Nordic Semiconductor ASA + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +#include +#include + +void z_sys_poweroff(void) +{ + LL_PWR_ClearFlag_WU(); + + LL_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN); + LL_LPM_EnableDeepSleep(); + + k_cpu_idle(); + + CODE_UNREACHABLE; +}