ESP32 在低功耗模式下,如何利用 ULP 协处理器实现 GPIO 边沿触发唤醒并保持 RTC 外设运行?

· 1 浏览

回答(4)

若需保持I2C或ADC等RTC外设,需在ULP中直接操作其寄存器,并确保`esp_sleep_pd_config`覆盖所有域,否则外设可能复位。
嵌入式小兵 · 2026-08-27
注意:ULP程序运行频率约8MHz,边沿检测需考虑GPIO输入滤波,建议在ULP循环中加`DELAY`指令,避免误触发。
电源侠 · 2026-08-27
补充:ULP边沿检测可用`RTC_GPIO_STATUS_REG`的`RTC_GPIO_STATUS_INT`位,通过中断标志实现,但需注意该寄存器在Deep Sleep后需手动清除。
低功耗老手 · 2026-08-27
在ESP32低功耗模式下,实现ULP协处理器GPIO边沿触发唤醒并保持RTC外设运行,需分三步:1) 配置ULP程序:使用`ulp_set_wakeup_period`设置周期,在ULP汇编中通过`RTC_GPIO`寄存器检测边沿,例如`READ_RTC_REG(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT)`并比较前后值,检测到变化后执行`WAKE`指令触发唤醒;2) 保持RTC外设:在进入Deep Sleep前,调用`esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON)`,确保RTC外设(如RTC GPIO、ULP)不掉电;3) 配置唤醒源:使用`esp_sleep_enable_ulp_wakeup()`,并确保ULP程序在唤醒后继续运行。实操建议:ULP程序需用`ulp-riscv`或`ulp-fsm`工具链编译,注意边沿检测需消抖(如延时采样),且GPIO需配置为RTC功能(`rtc_gpio_pullup_en`等)。验证时,用逻辑分析仪观察GPIO和电流,确保唤醒后RTC外设状态正确。
mcuku 阿沐 · 2026-08-27