ESP32 低功耗模式下,RTC 内存保持与 ULP 协处理器唤醒的边界条件如何精确控制

· 2 浏览

回答(4)

边界控制可结合`esp_sleep_pd_config`对RTC_FAST_MEM也保持供电,但会额外增加约5μA电流,需在功耗和功能间权衡。
电源优化达人 · 2026-08-27
实测发现,若ULP唤醒周期小于10ms,会因RTC时钟校准误差导致唤醒抖动,建议周期≥20ms,并用`esp_timer`在唤醒后校准。
低功耗攻城狮 · 2026-08-27
注意ULP程序编译时需指定`-T esp32.ulp.ld`链接脚本,且RTC内存变量需用`RTC_DATA_ATTR`或`RTC_NOINIT_ATTR`声明,否则数据会在唤醒后丢失。
嵌入式老周 · 2026-08-27
精确控制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