diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index cb17d945c4..bd1b7d4f61 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -259,6 +259,7 @@ static void ext0_wakeup_prepare(void); #endif #if SOC_PM_SUPPORT_EXT1_WAKEUP static void ext1_wakeup_prepare(void); +static void IRAM_ATTR ext1_wakeup_clear(void); #endif static esp_err_t timer_wakeup_prepare(int64_t sleep_duration); #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 @@ -638,6 +639,8 @@ static esp_err_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags, esp_sleep_mode_t m #if SOC_PM_SUPPORT_EXT1_WAKEUP if (s_config.wakeup_triggers & RTC_EXT1_TRIG_EN) { ext1_wakeup_prepare(); + } else { + ext1_wakeup_clear(); } #endif @@ -1629,6 +1632,14 @@ static void ext1_wakeup_prepare(void) rtc_hal_ext1_set_wakeup_pins(s_config.ext1_rtc_gpio_mask, s_config.ext1_trigger_mode); } +static void ext1_wakeup_clear(void) +{ + // Clear state from previous wakeup + rtc_hal_ext1_clear_wakeup_status(); + // Clear all ext1 wakup-source setting + rtc_hal_ext1_clear_wakeup_pins(); +} + uint64_t esp_sleep_get_ext1_wakeup_status(void) { if (esp_sleep_get_wakeup_cause() != ESP_SLEEP_WAKEUP_EXT1) {