典型陷阱:1) ULP程序访问RTC内存时未使用绝对地址,导致唤醒后主CPU读取数据错位;2) RTC内存未标记为RTC_NOINIT_ATTR,深睡时被清零;3) ULP唤醒源配置为GPIO边沿触发但未消抖,噪声导致频繁唤醒;4) 主CPU在唤醒后立即读取RTC内存,但ULP尚未完成写入(需用RTC_CNTL状态寄存器确认)。规避方案:ULP代码中显式使用RTC_SLOW_MEM宏定义绝对地址;所有共享变量加RTC_NOINIT_ATTR;ULP内做软件消抖(延时采样);唤醒后先轮询ULP完成标志位(如RTC_CNTL_ULP_CP_SLP_TIMER_EN)再访问数据。实操建议:用esp_sleep_get_wakeup_cause()区分唤醒源,并在ULP中设置超时保护,防止死循环耗尽电池。
mcuku 阿沐 · 2026-08-27