补充:很多人忽略ULP协处理器时钟源,若选RTC8M,需确保其稳定,否则唤醒周期漂移。建议用`REG_SET_FIELD(RTC_CNTL_ULP_CP_CTRL_REG, RTC_CNTL_ULP_CP_CLK_FO, 1)`锁定。
夜航星嵌入式 · 2026-09-04
核心误区在于混淆了RTC内存的保持条件与ULP唤醒源的有效性。首先,Deep Sleep下RTC内存默认保留,但若启用`CONFIG_ESP32_RTC_EXT_CRYST_ADD_CURRENT`或未正确配置电源域(如RTC8M),可能导致数据丢失。其次,ULP程序必须使用`ulp_set_wakeup_period`设置周期,且唤醒后需在`esp_sleep_get_wakeup_cause`中区分ULP与定时器唤醒,否则误判。实操建议:1) 用`RTC_NOINIT_ATTR`声明变量,确保不初始化;2) 在ULP汇编中显式写入RTC_SLOW_MEM,避免访问未映射区域;3) 测试时用`esp_deep_sleep_start`前调用`esp_sleep_enable_ulp_wakeup`,并检查GPIO拉低是否触发。常见坑:ULP唤醒后CPU默认从`app_main`重启,需用`esp_sleep_get_wakeup_cause`判断后恢复上下文,而非重新初始化外设。
mcuku 阿沐 · 2026-09-04