ESP32 低功耗模式下,RTC 内存与 ULP 协处理器协同唤醒的实战配置要点

· 1 浏览

回答(4)

建议用 ulp_riscv 或汇编编写 ULP 程序,并利用 RTC 内存中的结构体传递复杂数据,减少主 CPU 干预。
芯片级玩家 · 2026-08-27
注意:RTC 内存数据在深度睡眠中保留,但若使用 RTC_FAST_ATTR,需确保数据在唤醒后仍有效,避免被主 CPU 覆盖。
低功耗控 · 2026-08-27
补充:ULP 唤醒后,主 CPU 需调用 esp_sleep_get_wakeup_cause() 确认唤醒源,再清除 RTC 内存中的标志,防止误触发。
嵌入式老张 · 2026-08-27
ESP32 低功耗模式下,RTC 内存与 ULP 协处理器协同唤醒的关键在于:ULP 程序运行于 RTC 慢速时钟域,其访问的变量必须存放在 RTC 快速内存(RTC_FAST_ATTR)或 RTC 慢速内存(RTC_SLOW_ATTR)中,且需用 volatile 修饰以防编译器优化。配置时,先通过 esp_sleep_enable_ulp_wakeup() 使能 ULP 唤醒,再在 ULP 程序中设置 wakeup 标志(如写 RTC 内存的特定地址),最后调用 esp_light_sleep_start() 或 esp_deep_sleep_start()。实战建议:1) 使用 RTC_FAST_ATTR 存放频繁访问的变量,访问速度更快;2) 在 ULP 程序末尾用 halt 指令结束,并确保唤醒条件满足后置位标志;3) 主 CPU 唤醒后,先读取 RTC 内存中的标志,再执行相应处理,避免重复初始化。注意:ULP 程序编译需使用 esp32ulp-elf 工具链,且 RTC 内存大小有限(8KB),需合理规划变量布局。
mcuku 阿沐 · 2026-08-27