详细有使用过ESP32的朋友都会经历过上传时烧录超时的问题。同一批次的esp32也会有一两个出现这个问题,有时候用着用着的同一块板子,也回突然出现这个超时问题。我分析出现这个问题的原因有三个:
- 烧录电路的USB转UART芯片不稳定造成的
- ESP32开发板电路设计不合理
- ESP模块已经烧掉了
自动烧录原理
ESP32开发板通过USB-UART Bridge连通USB接口和芯片的串口引脚。而GPIO0引脚高低决定模块是下载还是运行模式。
模式 | GPIO0 |
---|---|
UART 下载模式 | 低 |
Flash 运行模式 | 高 |
电平信号时序图
我们可以在烧录时通过按下GPIO0按钮,可以切换模块运行状态。我们再看看板子上的自动下载电路,USB-UART Bridge收到烧录数据时,RTS(Ready To Send)先变成高电平,然后DTR(Data Terminal Ready)变成低电平,实际先触发一个GPIO0下拉,接着EN下拉,然后一起上拉,连串信号给到ESP32模块,从而完成烧录模式的切换,实现了自动烧录。
在EN和GPIO0上,也有一个RC延时电路,增长了EN和GPIO0之间的下拉的时间间隔。自动烧录超时,往往是因为EN和GPIO之间切换时间过短,芯片分辨不出来。官方文档教你就是按下BOOT/FLASH/IO0按钮就可以启动下载了。
烧录芯片的讨论
现在主流ESP32开发板的USB转UART(或者叫USB转串口)芯片通常是CP2102或者CH340这两种。CP2102速度快,体积小,传输稳定,价格贵,8-10元;然而CH340呢?速度稍慢,体积大,传输也ok,稳定性不如CP2102,胜在价格便宜,1-2元之间。如果你是大厂的老板,你会怎么想?只要功能一直,那就应该不断压缩成本,哈。就好比如NodeMCU V2使用的是CP2102,但NodeMCU V3却该用了CH340,究竟是成本还是供应链的问题呢?无从考究了。
【解决办法1】 降低烧录速度
知道了大概的原理,在开发板没有坏的情况下,我们增加EN和GPIO下拉的时间间隔,就能让ESP32顺利进入下载模式,那降低烧录速度就是一个最简单的办法。通常降低到115200成功率比较高。
【解决办法2】手动进入烧录状态
即然自动烧录电路是先触发一个EN然后GPIO0的下拉信号,那我们是否可以自己手动触发呢?答案是可以的,你可以
- 长按BOOT(IO0)
- 按下EN,然后松开
- 松开BOOT
就能进入下载模式。通过串口观察,可以看到waiting for download的提示,然后就可以开始烧录。
【解决办法3】外加电容 (对WROOM系列比较有效)
还有一个有趣的实验,国外大神尝试了外加一个10uf的电容到EN和GND之间也能解决这个超时问题,原理其实也是增加EN和GPIO0被拉低之间的时间间隔来实现。原理可行性,但外观欠奉,我这里指给出思路不做深入讨论,大家可以自行查看这篇文章,https://randomnerdtutorials.com/solved-failed-to-connect-to-esp32-timed-out-waiting-for-packet-header/
总结
本文讨论了ESP32自动烧录超时(Timed out waiting for packet header)问题的原因,烧录原理和3种解决办法,如果这3种办法都帮不到您解决问题,建议你还是选择高质量的ESP32开发板,尤其是要选择使用CP210X系列芯片的板子!