diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 64786c4fcd0..ed11d0b1b99 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -931,16 +931,17 @@ static esp_err_t FORCE_IRAM_ATTR esp_sleep_start_safe(uint32_t sleep_flags, uint #endif #endif // !SOC_MSPI_HAS_INDEPENT_IOMUX } +#endif +#if CONFIG_PM_SLP_SPIRAM_HALFSLEEP_ENABLED && (CONFIG_SPIRAM_XIP_FROM_PSRAM || !CONFIG_PM_SLP_IRAM_OPT) + // Code outside of esp_sleep_start_safe may be linked to FLASH if CONFIG_PM_SLP_IRAM_OPT is false, + // Code that accesses flash memory may cause cached PSRAM data to be replaced back into PSRAM before + // it has fully resumed. And if CONFIG_SPIRAM_XIP_FROM_PSRAM is enabled, code in Flash will be copied + // to PSRAM for execution. We need to wait here until PSRAM exits half-sleep before returning. + esp_psram_impl_resume_from_halfsleep_mode(s_config.rtc_clk_cal_period); #endif /* Cache Resume 1: Resume cache for continue running*/ resume_cache(); resume_timers(sleep_flags); -#if CONFIG_PM_SLP_SPIRAM_HALFSLEEP_ENABLED && CONFIG_SPIRAM_XIP_FROM_PSRAM - // Code outside of esp_sleep_start_safe may be linked to FLASH, and if CONFIG_SPIRAM_XIP_FROM_PSRAM - // is enabled, code in Flash will be copied to PSRAM for execution. We need to wait here until - // PSRAM exits half-sleep before returning. - esp_psram_impl_resume_from_halfsleep_mode(s_config.rtc_clk_cal_period); -#endif } return result; } @@ -1590,6 +1591,14 @@ esp_err_t esp_light_sleep_start(void) esp_clk_private_unlock(); esp_timer_private_unlock(); +#if CONFIG_PM_SLP_SPIRAM_HALFSLEEP_ENABLED && !CONFIG_SPIRAM_XIP_FROM_PSRAM && CONFIG_PM_SLP_IRAM_OPT + // If CONFIG_SPIRAM_XIP_FROM_PSRAM is not enabled and CONFIG_PM_SLP_IRAM_OPT is enable, + // the sleep-wake process prior to this point does not access the PSRAM, so we can postpone waiting + // for the PSRAM to resume until here, in order to reuse the time overhead + // of the wake-up process as much as possible. + esp_psram_impl_resume_from_halfsleep_mode(s_config.rtc_clk_cal_period); +#endif + #if CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION && CONFIG_PM_SLP_IRAM_OPT /* Cache Resume 0: sleep process done, resume cache for continue running */ if (!(s_config.wakeup_triggers & ignore_check_wakeup_triggers)) { @@ -1597,14 +1606,6 @@ esp_err_t esp_light_sleep_start(void) } #endif -#if CONFIG_PM_SLP_SPIRAM_HALFSLEEP_ENABLED && !CONFIG_SPIRAM_XIP_FROM_PSRAM - // If CONFIG_SPIRAM_XIP_FROM_PSRAM is not enabled, the sleep-wake process - // prior to this point does not access the PSRAM, so we can postpone waiting - // for the PSRAM to resume until here, in order to reuse the time overhead - // of the wake-up process as much as possible. - esp_psram_impl_resume_from_halfsleep_mode(s_config.rtc_clk_cal_period); -#endif - #if !CONFIG_FREERTOS_UNICORE esp_ipc_isr_stall_resume(); #if CONFIG_PM_ESP_SLEEP_POWER_DOWN_CPU && SOC_PM_CPU_RETENTION_BY_SW