diff --git a/components/ulp/lp_core/lp_core/include/ulp_lp_core_utils.h b/components/ulp/lp_core/lp_core/include/ulp_lp_core_utils.h index ce47034df650..007883973122 100644 --- a/components/ulp/lp_core/lp_core/include/ulp_lp_core_utils.h +++ b/components/ulp/lp_core/lp_core/include/ulp_lp_core_utils.h @@ -11,6 +11,7 @@ extern "C" { #endif #include +#include /** @@ -53,6 +54,11 @@ void ulp_lp_core_delay_cycles(uint32_t cycles); */ __attribute__((__noreturn__)) void ulp_lp_core_halt(void); +/** + * @brief The LP core puts itself to sleep and disables all wakeup sources. + */ +__attribute__((__noreturn__)) void ulp_lp_core_stop_lp_core(void); + #ifdef __cplusplus } #endif diff --git a/components/ulp/lp_core/lp_core/lp_core_utils.c b/components/ulp/lp_core/lp_core/lp_core_utils.c index e04b5c911555..cfdc68d4f4f0 100644 --- a/components/ulp/lp_core/lp_core/lp_core_utils.c +++ b/components/ulp/lp_core/lp_core/lp_core_utils.c @@ -63,3 +63,18 @@ void ulp_lp_core_halt(void) while(1); } + +void ulp_lp_core_stop_lp_core(void) +{ + /* Disable wake-up source and put lp core to sleep */ + REG_SET_FIELD(PMU_LP_CPU_PWR1_REG, PMU_LP_CPU_WAKEUP_EN, 0); + REG_SET_FIELD(PMU_LP_CPU_PWR1_REG, PMU_LP_CPU_SLEEP_REQ, 1); +} + +void __attribute__((noreturn)) abort(void) +{ + /* Stop the LP Core */ + ulp_lp_core_stop_lp_core(); + + while (1); +}