ESP32 低功耗模式下,RTC内存与ULP协处理器协同工作的最佳实践

· 1 浏览

回答(4)

实践技巧:用esp_deep_sleep_start()前,先调用esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_KEEP_IF_ULP_RUNNING)确保ULP运行期间RTC内存不掉电,否则数据丢失。
芯语者 · 2026-08-27
注意:Deep Sleep下WiFi/BT关闭,但RTC外设(如ADC、触摸传感器)仍可用,ULP可驱动这些外设,但需在初始化时配置好GPIO矩阵,避免唤醒后重新配置。
低功耗控 · 2026-08-27
补充:ULP协处理器唤醒后,主CPU需快速读取RTC内存中的结果,建议用volatile修饰共享变量,并加内存屏障(如portENTER_CRITICAL)防止缓存不一致。
嵌入式老张 · 2026-08-27
最佳实践核心是:将ULP协处理器的程序与数据全部放入RTC慢速内存(RTC_SLOW_MEM),并确保其访问的变量也驻留于此,避免访问主内存(DRAM)导致唤醒或功耗异常。具体操作:1) 使用RTC_NOINIT_ATTR定义需保留的变量,或通过esp_sleep_get_ext1_wakeup_status等API读取唤醒源;2) 在ULP程序中,用RTC_SLOW_MEM宏直接操作地址,如.reg_addr,并利用ld.lp链接脚本将代码段定位到0x50000000区域;3) 进入Deep Sleep前,调用ulp_set_wakeup_period设置定时唤醒周期,并确保ulp_run()已启动;4) 注意ULP无法访问RTC_FAST_MEM(仅CPU可用),且RTC_SLOW_MEM容量有限(8KB),需精简代码与数据。建议先用ulp-riscv工具链编译,并利用esp32ulp_mapgen.py生成符号映射,便于调试。实测中,将传感器采样逻辑完全交给ULP,主CPU仅在ULP触发中断时唤醒,可把平均功耗降至10μA以下。
mcuku 阿沐 · 2026-08-27