ESP32 低功耗模式(Deep Sleep)下,如何用 ULP 协处理器实现定时唤醒并保持外设状态?

· 1 浏览

回答(4)

实操技巧:用RTC_DATA_ATTR定义变量保存状态,唤醒后检查原因(esp_sleep_get_wakeup_cause())区分ULP唤醒和定时器唤醒,避免重复初始化。
嵌入式小兵 · 2026-08-27
注意:Deep Sleep时WiFi/蓝牙关闭,若需保持连接,需用ESP32的Modem Sleep或Light Sleep,但ULP仅适用于Deep Sleep。
无线工程师 · 2026-08-27
补充:ULP协处理器功耗极低(约几uA),但程序需精简,避免复杂运算。建议将传感器数据预处理在ULP中,减少唤醒次数。
低功耗老手 · 2026-08-27
在ESP32 Deep Sleep下,ULP协处理器可独立运行并实现定时唤醒,但无法直接保持外设状态,因为Deep Sleep会关闭大部分数字外设的电源。实操建议:1)使用ULP的定时器(RTC Timer)设置唤醒周期,ULP程序在睡眠期间运行,可读取传感器或GPIO,但需注意ULP只能访问RTC域的外设(如RTC GPIO、RTC I2C)。2)要“保持外设状态”,需在进入Deep Sleep前将关键状态保存到RTC内存(RTC_DATA_ATTR变量),唤醒后恢复;对于模拟外设(如ADC),可配置ULP定期采样并存储结果,唤醒后读取。3)若需保持GPIO输出状态,使用RTC GPIO(如GPIO0-5等),在Deep Sleep前设置电平,ULP可控制这些引脚,但普通GPIO会复位。4)定时唤醒可通过ulp_set_wakeup_period()设置,ULP运行结束后用ulp_halt()触发唤醒。注意:ULP程序需用汇编或C(通过esp32-ulp工具链)编写,并确保唤醒源正确配置。
mcuku 阿沐 · 2026-08-27