ESP32S3串口自动下载电路解析,以及串口调试中无法复位问题
在ESP32系列或其他开发板中我们时常能看到如下电路
也就是所谓的自动下载电路
其中EN为ESP32S3的使能引脚,高电平时芯片使能,低电平时芯片关闭
IO0则属于Strapping引脚(其余Strapping引脚为IO3,IO45,IO46),模组每次上电或复位时,都需要一些初始配置参数,如加载模组的启动模式、flash存储器的电压等。这些参数 通过strapping 管脚控制。
如下图
当芯片从复位状态释放时,GPIO0和GPIO46共同决定了芯片的启动模式
其中在Joint Download Boot 模式下,用户可通过 USB 或UART0 接口将二进制文件下载至flash,或将二进制文件 下载至SRAM并运行SRAM中的程序,而我们使用自动下载电路的目的就是为了让芯片进入这个模式下。
值得一提的是, GPIO0、GPIO45 和 GPIO46 在芯片复位时连接芯片内部的弱上拉/下拉电阻,如果在芯片外部这些引脚没有连接其他玩意的话,那么它们默认值应该是这样的
也就是说我们要做的只是将IO0也拉低(而且得在芯片使能前,否则来不及拉低就会进入另外一个模式)
如何实现?
现在我们将目光再次切换回这张图上
不去考虑这些引脚的含义,仅仅关注这个电路
DTR和RTS的组合有如下四种
DTR | RTS | 结果 |
---|---|---|
0 | 0 | 两个Q2,Q3都截止,EN,IO0皆处于默认状态,及EN=1,IO0=1 |
0 | 1 | Q2截止,Q3导通,EN=1,IO0= DTR=0 |
1 | 0 | Q2导通,Q3截止,EN=RTS=0,IO0=1 |
1 | 1 | Q2,Q3都截止(UBE=0),EN=1,IO0=1 |
我们所要做的就是当EN由低电平变为高电平的时候,IO始终保持低电平的状态。
这一步可以拆解成两个状态即
- EN =0 ,IO0=0
- EN =1,IO=0
第二步只需DTR =0,RTS=1即可办到,关键是第一步似乎无论DTR,RTS怎么组合都无法满足
事情似乎已经陷入僵局。。。。。。
然而伟大的串口之神早已为我们指明了方向!!!
在观摩乐鑫官方的开发板时,看到这一细节
芯片的EN引脚与地之间连接了一个0.1uf 的电容。
起先我并不在意,只当该电容只是简单的用于滤波,然而当我结合esptool中关于芯片复位部分时才明白其中深意。
esptool是啥?
在前面配置ESP32S3的编译环境时,曾看到过esptool,这是乐鑫芯片的工具集,可以做许多事情,例如:
- 读取、写入、擦除和验证存储在闪存中的二进制数据。
- 读取芯片特征和其他相关数据,例如MAC地址或闪存芯片ID。
- 读取和写入一次性可编程的 efuse。
- 准备用于刷机的二进制可执行映像。
- 分析、组合和合并二进制图像。
如下是乐鑫官方对其编写的文档
当然这并不重要
现在让我们找到这个esptool,点开其中的reset.py,看看在芯片复位时到底做了些什么
上面的代码一共干了这么几件事
- DTR=1 RTS=0,此时IO0=1,EN =0,芯片复位
- 短暂延时(0.1s)
- DTR=0,RTS=1 ,此时IO0=0,EN=1
- 短暂延时(0.05s)
- DTR=1,此时IO0=1
关键在于步骤1和3之间,由于EN与地之间电容的存在,当从步骤1到步骤3时,EN需要先给电容充电从而导致变成高电平的时间延后。
即IO0先变成低电平,EN才会产生一个上升沿,这样就解决了问题。
另一个小问题
在我使用sscom串口调试器对esp32s3进行串口开发时,发现当我按下开发板上的复位按键时,开发板并没有复位而是进入了等待下载模式。
这是由于勾选了sscom中的DTR导致