最佳实践核心是:将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