ESP32使用Neopixel库触发TG1WDT_SYS_RESET启动循环求助
ESP32 DOIT DEVKIT V1 使用Adafruit_NeoPixel库触发TG1WDT_SYS_RESET看门狗复位
问题描述
在Arduino IDE环境下,使用DOIT ESP32 DEVKIT V1开发板运行Adafruit_NeoPixel库代码时,出现TG1WDT_SYS_RESET启动循环故障,即使运行官方极简示例代码也会触发该问题。
报错信息
rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:1 load:0x3fff0030,len:1184 load:0x40078000,len:13160 load:0x40080400,len:3036 entry 0x400805e4
触发问题的示例代码
#include <Adafruit_NeoPixel.h> #define PIN 6 #define NUMPIXELS 1 Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRBW); #define DELAYVAL 500 void setup() { pixels.begin(); } void loop() { pixels.clear(); for (int i = 0; i < NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.Color(0, 150, 0)); pixels.show(); delay(DELAYVAL); } }
已尝试的无效解决方案
- 降级ESP32 Core版本(3.0.8 → 2.0.7 → 2.0.4)
- 降级Adafruit_NeoPixel库版本(1.12.3 → 1.10.4)
- 将LED数量减少至1
- 禁用/重置看门狗定时器
- 添加
yield()函数
可行解决方案建议
1. 更换引脚(最直接有效)
ESP32的GPIO6是SPI Flash的片选引脚(SPI_CS0),Neopixel的信号传输会占用该引脚,干扰Flash的正常读写,直接触发看门狗复位。立即更换为非SPI Flash相关的引脚,比如GPIO2、GPIO4、GPIO13、GPIO14等。修改代码中的#define PIN 6为其他可用引脚即可。
2. 修改Neopixel库的定时器配置
TG1WDT属于Timer Group 1的系统看门狗,Adafruit_NeoPixel库默认可能使用了Timer Group 1的定时器,导致资源冲突。可以手动修改库文件:
- 找到Arduino库目录下的
Adafruit_NeoPixel/Adafruit_NeoPixel.cpp文件 - 找到定时器初始化相关代码,将
TIMER_1替换为TIMER_0(对应Timer Group 0),重新编译上传。
3. 硬件排查
检查开发板的GPIO6引脚是否存在外部接线短路、虚焊等问题;如果更换引脚后问题依旧,尝试更换同型号开发板排查硬件故障。
4. 启用PSRAM(适用带PSRAM的型号)
部分DOIT ESP32 DEVKIT V1搭载了PSRAM,在Arduino IDE中开启PSRAM选项:
- 进入
工具 > 开发板 > ESP32 Arduino > 核心调试级别 > 无 - 选择
工具 > 板载PSRAM > 启用
重新编译上传代码,可能缓解内存相关的看门狗触发问题。
内容的提问来源于stack exchange,提问作者DerekLF
相关产品推荐
相关产品推荐

