ESP32 在低功耗模式下,如何利用ULP协处理器实现GPIO中断唤醒并保持RTC内存数据不丢失?

· 2 浏览

回答(4)

补充:若需多个GPIO唤醒,ULP可轮询多个引脚,但注意功耗,建议用`ulp_set_wakeup_period`调节采样间隔,平衡响应和电流。
电源优化师 · 2026-08-27
补充:RTC内存数据不丢失的关键是避免使用普通全局变量,改用`RTC_DATA_ATTR`,并在唤醒后检查`esp_reset_reason()`确认是ULP唤醒而非上电复位。
嵌入式小飞侠 · 2026-08-27
补充:ULP程序需用汇编或C(通过`ulp-riscv`工具链)编写,编译后烧录到RTC_SLOW_MEM,注意地址对齐和指令周期,避免超时。
低功耗老手 · 2026-08-27
在ESP32低功耗模式下,利用ULP协处理器实现GPIO中断唤醒并保持RTC内存数据不丢失,核心在于配置ULP程序监控GPIO状态变化,并在进入Deep Sleep前将关键数据存入RTC快速内存(RTC_FAST_MEM)或RTC慢速内存(RTC_SLOW_MEM)。具体步骤:1) 使用`esp_sleep_enable_ulp_wakeup()`使能ULP唤醒源;2) 在ULP程序中,通过`GPIO_IN_REG`寄存器轮询目标GPIO电平,检测到边沿变化后,设置`RTC_CNTL_ULP_CP_TSENS_REG`或直接触发唤醒;3) 在进入Deep Sleep前,用`RTC_DATA_ATTR`或`RTC_NOINIT_ATTR`声明变量,确保数据存于RTC内存,ULP程序也可读写这些变量(需用`ulp_var`宏定义)。注意:ULP只能访问RTC域外设和内存,GPIO需配置为RTC功能(如`rtc_gpio_pullup_en()`),且唤醒后需在`loop()`中恢复外设状态。实操建议:先用`esp_deep_sleep_start()`测试,并用`esp_sleep_get_wakeup_cause()`验证唤醒源。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器