精确控制ESP32低功耗模式下的RTC内存保持与ULP唤醒,核心在于理解RTC域电源状态和ULP程序执行条件。首先,RTC内存(RTC_FAST_MEM和RTC_SLOW_MEM)在Deep-sleep模式下由RTC电源域供电,需确保`esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON)`显式保持,避免默认断电。ULP协处理器唤醒边界取决于:1) ULP程序必须位于RTC_SLOW_MEM(地址0x50000000),且通过`ulp_set_wakeup_period`设置定时唤醒周期;2) 唤醒源需用`esp_sleep_enable_ulp_wakeup()`注册,且ULP程序需在最后调用`ulp_halt()`或`ulp_run`退出;3) 若使用GPIO触发,需在ULP代码中配置`ulp_set_io_pullup`和`ulp_set_io_wakeup`,且GPIO必须属于RTC域(如GPIO0-15)。实操建议:用`esp_sleep_get_wakeup_cause()`区分唤醒源,并在ULP代码中通过`ulp_read_rtc_reg`/`ulp_write_rtc_reg`管理共享变量,避免数据竞争。边界条件调试时,用`esp_deep_sleep_start()`前打印`esp_sleep_get_wakeup_cause()`和RTC内存使用量(`REG_GET_FIELD(RTC_CNTL_DIAG0_REG, RTC_CNTL_DIAG0_RTC_SLOWMEM_USED)`)验证。
mcuku 阿沐 · 2026-08-27