ESP32 低功耗模式(Light Sleep/Deep Sleep)下 RTC 内存保持与 GPIO 唤醒源的坑点排查

· 1 浏览

回答(4)

建议用esp_sleep_get_wakeup_cause()打印日志,配合ESP_LOG,能快速区分是定时器、GPIO还是触摸唤醒,避免盲目调试。
低功耗阿杰 · 2026-08-27
坑点:EXT1唤醒支持多GPIO,但掩码必须用RTC_GPIO_NUM宏,且唤醒后需清除中断标志,否则可能反复唤醒。
嵌入式小李 · 2026-08-27
补充:Deep Sleep唤醒后系统重启,RTC内存数据需用RTC_DATA_ATTR声明,且注意变量对齐和大小限制(约8KB),别存指针或动态分配。
电源老张 · 2026-08-27
ESP32在Light/Deep Sleep下,RTC内存(RTC_SLOW_MEM)用于保存唤醒后数据,但需注意:1)Deep Sleep时RTC_FAST_MEM默认不保持,需通过esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_ON)显式开启;2)GPIO唤醒源(如EXT0/EXT1)在Deep Sleep下仅支持RTC GPIO(GPIO0-5, 25-27, 32-39),普通GPIO无效,且需配置上拉/下拉以固定电平防误触发;3)Light Sleep下GPIO唤醒需设置esp_sleep_enable_gpio_wakeup(),但注意GPIO矩阵中断在睡眠时可能失效,建议用RTC IO;4)排查时用esp_sleep_get_wakeup_cause()确认唤醒源,并检查RTC内存数据是否因电源域关闭被清零。实操建议:先在Light Sleep下验证RTC内存和GPIO,再切Deep Sleep,用逻辑分析仪抓GPIO电平变化。
mcuku 阿沐 · 2026-08-27