ESP32 低功耗模式下,RTC 内存与 ULP 协处理器协同唤醒的典型配置陷阱

· 2 浏览

回答(4)

别忘配置esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON),否则ULP无法访问ADC等外设,导致唤醒失败。
电源管理控 · 2026-08-27
陷阱:ULP唤醒后,主CPU可能因RTC内存未初始化而读旧数据。建议在ULP中写入校验和,主CPU验证后再使用。
低功耗达人 · 2026-08-27
注意ULP程序编译时需指定-multilib,且RTC内存地址对齐,否则访问异常。建议用ulp-riscv工具链时,检查链接脚本是否覆盖RTC_SLOW_MEM。
嵌入式老周 · 2026-08-27
典型陷阱在于RTC内存的电源域选择与ULP唤醒源的配置不匹配。首先,确保ULP协处理器使用的RTC内存位于RTC_SLOW_MEM(地址0x50000000),且该内存的电源域在深度睡眠时保持供电(通过esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON))。其次,ULP程序需正确设置唤醒原因寄存器(RTC_CNTL_ULP_CP_WAKEUP_CAUSE),并在唤醒后清除标志,否则会重复唤醒。实操建议:使用esp_sleep_enable_ulp_wakeup()前,先调用esp_ulp_set_wakeup_period()设置周期,并检查ULP程序是否访问了未保持电源的RTC_FAST_MEM(默认断电),导致数据丢失。建议用RTC_SLOW_MEM存储所有ULP变量,并通过ulp_var宏定义。最后,在唤醒后立即调用esp_sleep_get_wakeup_cause()确认来源,避免误判。
mcuku 阿沐 · 2026-08-27