如何实现ESP8266/ESP32自动下载电路

前一段时间需要自己制作一片esp32单板,成本和封装考虑,计划选择ch340e作为usb转串口芯片,esp8266/esp32的单板一般都有自动下载电路,用户无需按钮即可令单板自动进入下载模式实现固件烧录,然而自动下载电路需要串口芯片支持dtr和rts,ch340e却只有rts信号,没有dtr信号,于是研究学习了一下自动下载电路的原理,准备用一些奇淫技巧解决ch340e的自动下载问题。
遗憾的是, 目前的中文互联网上,关于esp8266/esp32自动下载原理,所有能搜索到的解释大部分都是错误的,差之毫厘,谬以千里,如果随意的假设,自以为是,最终得出的只能是一厢情愿的结论。
下载模式
esp8266/esp32进入下载模式[1]的条件很简单:
en(也称为rst)上升沿时候gpio0保持为低电平,如下图所示:
分析1
下载电路如下所示,其结构与rs触发器比较类似,注意en和io0信号均连接在三极管集电极,通过控制三极管只能拉低此信号,若三极管截止,则此信号的状态由其他电路决定(一般来说,此类信号会默认接电阻上拉到vcc)
逻辑关系如下:
dtr = 0; rts = 0, 此时q1截止,q2截止,en = 1; io0 = 1dtr = 0; rts = 1,此时q1截止,q2导通, en = 1; io0 = 0dtr = 1; rts = 0, 此时q1导通,q2截止, en = 0; io0 = 1dtr = 1; rts = 1, 此时q1截止,q2截止, en = 1; io0 = 1 真值表:
dtr rst en io0
0 0 1 1
0 1 1 0
1 0 0 1
1 1 1 1
简单总结:当dtr和rts同时为0或者同时为1时,三极管q1和q2均为截止状态,此时en和io0的状态由其他电路决定(内部/外部上拉电阻)。
当不同时为0或者1时:
en  = rtsio0 = dtr 注意这种逻辑下 en和io0是不可能同时为0的,然而进入下载模式则需要如下的序列:
1.  io = 0; en = 02.  io = 0; en 0 -> 1 从逻辑表上看是根本无法正常进入下载模式的,此为疑惑1
分析2
再来继续分析一下esptool.py[2]里下载相关的代码
 # issue reset-to-bootloader:        # rts = either ch_pd/en or nreset (both active low = chip in reset        # dtr = gpio0 (active low = boot to flasher)        #        # dtr & rts are active low signals,        # ie true = pin @ 0v, false = pin @ vcc.        if mode != 'no_reset':            self._setdtr(false)  # io0=high        1)  self._setrts(true)   # en=low, chip in reset            time.sleep(0.1)        2)  self._setdtr(true)   # io0=low        3)  self._setrts(false)  # en=high, chip out of reset            time.sleep(0.05)        4)  self._setdtr(false)  # io0=high, done 注意true是低电平,false为高电平,另外代码中的setdtr()和setrts()两条语句之间虽然看上去紧挨着没有延时,然而由于这里是高级语言python,两条语句之间的延时并不能忽略,因此分析的时候必须依次的进行状态分析,以下分为四个阶段依次分析:
设置dtr = 1; rts = 0, 此时q1导通,q2截止, en = 0; io0 = 1
设置dtr = 0; rts = 0, 此时q1截止,q2截止, en = 1; io0 = 1
设置dtr = 0; rts = 1, 此时q1截止,q2导通, en = 1; io0 = 0
设置dtr = 1; rts = 1, 此时q1截止,q2截止, en = 1; io0 = 1
如果按照上面的代码分析来做结论,不论如何系统也是不可能进入下载模式的:en和io0首先不可能同时为0,en由0->1的上升沿io0也并不为0,再次确认之前的疑惑,那么系统究竟是如何进入下载模式的呢?
答案
问题的答案实际在另外一部分电路,原理其实非常简单:en信号连接在一个电容充放电电路上
chip_pu即en,代码中2-3阶段之后会延时一段时间,而en由于电容充电,电平并不会立马变为高电平,而是缓慢上升,以如上参数为例计算,同时参考芯片电气参数特性
高电平为0.75vdd,则达到高电平按照如下公式计算:
解得t = 14ms,即en经过14ms上升到电平1,在实际代码中延时了50ms的等待时间,以确保延时后en处于电平1的状态。
另外需要提的是,阶段1需要等待一段时间,让电容放电,保证en电平下降到电平0,才能保证系统正常复位,在代码中预留了100ms的等待时间,同样可以通过电容放电公式计算出放电到电平0需要的时间,感兴趣的朋友可以自行根据公式计算确认。


系统调用具体是如何实现的
关于GD32 Colibri-F450VE开发板的性能分析和介绍
煤气管道焊缝泄露的处理措施
讯飞录音笔SR501是否适合做商务礼品?实用又极富科技感
服务器log日志大,掌握这些可正确快速定位错误!
如何实现ESP8266/ESP32自动下载电路
深度揭秘磁环电感电流大小怎么看
diy风力发电机制作
荣耀V9和荣耀V8哪个好?荣耀V9与荣耀V8区别在哪?
三种最受欢迎的短距离无线标准介绍
服务器负载均衡有几种类型,做负载均衡好在哪
解决装配制造难题,AHTE 2023工业装配展观众招募进行中!
双轨直销软件报单管理系统 双轨直销奖金自动结算系统
三星电视2021年新品重磅开箱,带来超出想象的视觉享受
PCB设计中焊盘的重要考虑因素:预防焊盘凹凸
变频器实用技术分享:变频器选型方法和原则、变频器使用保养注意事项
Belkin推出雷电3扩展基座Pro,支持MacBook和Windows PC双系统
将国产进行到底!新版千元旗舰机魅蓝E拆解
比亚迪王朝系列来袭,论颜值博越都得靠边站!
应对电能质量监测新挑战,ADI助力配电网数字化转型