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

· 1 浏览

回答(4)

注意ULP唤醒后主CPU启动延迟,可设置esp_sleep_set_wakeup_time作为兜底;边沿检测建议用中断模式(RTC GPIO支持边沿触发)而非轮询,但ULP仅支持轮询,需权衡功耗。
电源优化师 · 2026-08-27
时钟同步可启用RTC定时器(RTC_TIMER)作为时间基准,ULP唤醒后读取rtc_time_get,避免漂移;深度睡眠前保存RTC外设状态,唤醒后恢复。
嵌入式小周 · 2026-08-27
建议使用ulp-riscv(ESP32-S2/S3)或ulp-fsm(ESP32),在ULP代码中通过RTC_GPIO_IN_REG读取状态,并用RTC_CNTL_WAKEUP_CAUSE_REG确认唤醒源。
低功耗老张 · 2026-08-27
在ESP32低功耗设计中,ULP协处理器可在深度睡眠时监控GPIO边沿并唤醒主CPU,同时需确保RTC外设时钟同步。实操建议:1)配置GPIO为RTC GPIO(如GPIO0-15),使用rtc_gpio_pullup_en/rtc_gpio_pulldown_en设置上下拉,通过ulp_set_wakeup_period设置ULP定期采样周期(如10ms),在ULP汇编中读取RTC GPIO状态并检测边沿(比较当前和上次值),触发后执行WAKE指令。2)时钟同步:ULP运行在RTC 8MHz时钟(RTC_FAST_CLK)或150kHz(RTC_SLOW_CLK),需在ulp_init中指定ULP_CLOCK_SOURCE,并确保RTC外设(如RTC定时器)使用同一时钟源;在唤醒后调用esp_sleep_get_wakeup_cause确认ULP唤醒,并重新初始化RTC外设(如rtc_time_get)以校准时间。3)注意:ULP程序需存储在RTC快速内存,编译时用ulp-riscv或ulp-fsm工具链;边沿检测需处理抖动,可加软件滤波(连续两次相同状态)。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏰ 时钟分频计算