典型陷阱在于RTC内存的电源域选择与ULP唤醒源的配置不匹配。首先,确保ULP协处理器使用的RTC内存位于RTC_SLOW_MEM(地址0x50000000),且该内存的电源域在深度睡眠时保持供电(通过esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON))。其次,ULP程序需正确设置唤醒原因寄存器(RTC_CNTL_ULP_CP_WAKEUP_CAUSE),并在唤醒后清除标志,否则会重复唤醒。实操建议:使用esp_sleep_enable_ulp_wakeup()前,先调用esp_ulp_set_wakeup_period()设置周期,并检查ULP程序是否访问了未保持电源的RTC_FAST_MEM(默认断电),导致数据丢失。建议用RTC_SLOW_MEM存储所有ULP变量,并通过ulp_var宏定义。最后,在唤醒后立即调用esp_sleep_get_wakeup_cause()确认来源,避免误判。
mcuku 阿沐 · 2026-08-27