ESP32要进入下载模式的前提是,IO0拉低,然后复位芯片 通过EN引脚控制,EN由低电平到高电平(上升沿)时CPU复位,复位后检测到GPIO0是低电平,MCU自动进入下载启动模式!
下载电路如下所示:
根据电路原理:EN、IO0默认为高
DTR = 0; RTS = 0, 此时Q1截止,Q2截止,EN = 默认; IO0 = 默认
DTR = 0; RTS = 1,此时Q1导通,Q2截止, EN = 默认; IO0 = 0
DTR = 1; RTS = 0, 此时Q1截止,Q2导通, EN = 0; IO0 = 默认
DTR = 1; RTS = 1, 此时Q1截止,Q2截止, EN = 默认; IO0 = 默认
逻辑中一旦CPU启动后EN就被拉高了,IO0默认上拉,所以上边电路精简后如下表格:
DTR | RTS | EN | IO0 |
---|---|---|---|
0 | 0 | 1 | 1 |
0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 |
简单总结:
当DTR和RTS同时为0或者同时为1时,此时EN和IO0的状态由其他电路决定(内部/外部上拉电阻)
当不同时为0或者1时,EN = RTS,IO0 = DTR但是这种逻辑下 EN和IO0是不可能同时为0的,然而进入下载模式则需要如下的序列
1. IO = 0; EN = 0
2. IO = 0; EN 0 -> 1
从逻辑表上看是根本无法正常进入下载模式的。
问题的答案实际在另外一部分电路,原理其实非常简单:
EN信号连接在一个电容充放电电路上,EN由于电容充电,电平并不会立马变为高电平,而是缓慢上升,我们就可以使用这个时间差。
1、设置DTR = 1; RTS = 0, 此时 EN=0 IO=1
2、设置DTR = 0; RTS = 1, EN=0 IO=0 此时EN引脚由于电容充电,实际还是0
3、等待电容充电完成,此时 EN=1 IO=0,进入下载模式
具体的DTR、RTS就是由芯片厂家提供的esptool.py下载脚本进行设置的。