ESP32 ULP协处理器异常:定时唤醒失效、GPIO回升后LED不亮
ULP GPIO监测异常修复方案
问题现象
GPIO持续为高电平时,ESP32可正常被ULP唤醒,LED可正常点亮;GPIO拉低后再次回升至高电平,LED无响应,主CPU不再被唤醒。
核心问题点
- 输入引脚缺少RTC功能配置:仅对输出LED的RTC GPIO6配置了MUX选择,未对输入GPIO14做对应配置。主CPU进入深睡眠后,主GPIO外设断电,GPIO14的输入缓冲默认关闭,ULP持续采样到低电平,无法识别回升的高电平。
- 输出寄存器位宏误用:LED_On操作中,置位输出寄存器
RTC_GPIO_OUT_W1TS_REG错误使用了RTC_GPIO_OUT_DATA_W1TC_S位偏移宏,虽当前两者偏移均为0,属于隐性错误,易引发引脚输出错位。 - 注释与代码不匹配:输入引脚配置注释写为GPIO13,实际定义为GPIO14,易引发后续维护错误。
修复步骤
- 补充输入引脚的RTC配置
在ulp.S的entry段GPIO配置部分,添加GPIO14的功能选择和输入缓冲使能,修正注释:
// 原有LED配置保持不变 WRITE_RTC_REG(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_MUX_SEL_S, 1, 1) WRITE_RTC_REG(RTC_GPIO_ENABLE_W1TS_REG, RTC_GPIO_ENABLE_W1TS_S + LED, 1, 1) // 新增输入GPIO14的RTC配置 WRITE_RTC_REG(RTC_IO_PAD_GPIO14_REG, RTC_IO_PAD14_MUX_SEL_S, 1, 1) WRITE_RTC_REG(RTC_IO_PAD_GPIO14_REG, RTC_IO_PAD14_TIE_S, 1, 1) // 修正注释 // Set GPIO 14 as input WRITE_RTC_REG(RTC_GPIO_ENABLE_W1TC_REG, RTC_GPIO_ENABLE_W1TC_S + INPUT, 1, 1)
- 修正LED输出的位宏匹配
将LED_On中错误的位偏移宏改为W1TS对应宏:
LED_On: WRITE_RTC_REG(RTC_GPIO_OUT_W1TS_REG, RTC_GPIO_OUT_DATA_W1TS_S + LED, 1, 1) move r1, 5000 move r2, WakeUp jump Delay_ms
- (可选)优化深睡眠时序
主CPU调用ulp_run后添加10ms延时,确保ULP完成定时器使能、GPIO配置后再进入深睡眠:
ESP_ERROR_CHECK_WITHOUT_ABORT(ulp_run(&ulp_entry - RTC_SLOW_MEM)); // 等待ULP完成基础初始化 vTaskDelay(pdMS_TO_TICKS(10)); DEBUG_INFO("Enter deep sleep...\n"); ESP_ERROR_CHECK_WITHOUT_ABORT(esp_sleep_enable_ulp_wakeup()); esp_deep_sleep_start();
内容的提问来源于stack exchange,提问作者Kampi
相关产品推荐
相关产品推荐

