01
自动下载电路
,用户无需按钮即可令单板自动进入下载模式实现固件烧录。串口芯片支持DTR和RTS
,CH340E却只有RTS信号,没有DTR信号,于是研究学习了一下自动下载电路的原理,准备用一些奇淫技巧解决CH340E的自动下载问题。目前的中文互联网上,关于ESP8266/ESP32自动下载原理,所有能搜索到的解释大部分都是错误的
,差之毫厘,谬以千里。02
EN(也称为RST)上升沿时候GPIO0保持为低电平
,如下图所示:03
DTR = 0; RTS = 0, 此时Q1截止,Q2截止,EN = 1; IO0 = 1
DTR = 0; RTS = 1,此时Q1截止,Q2导通, EN = 1; IO0 = 0
DTR = 1; RTS = 0, 此时Q1导通,Q2截止, EN = 0; IO0 = 1
DTR = 1; RTS = 1, 此时Q1截止,Q2截止, EN = 1; IO0 = 1
当DTR和RTS同时为0或者同时为1时,三极管Q1和Q2均为截止状态,此时EN和IO0的状态由其他电路决定(内部/外部上拉电阻)
。EN = RTS
IO0 = DTR
1. IO = 0; EN = 0
2. IO = 0; EN 0 -> 1
04
# 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
然而由于这里是高级语言python,两条语句之间的延时并不能忽略
。05
EN信号连接在一个电容充放电电路上
而EN由于电容充电,电平并不会立马变为高电平,而是缓慢上升
,以如上参数为例计算,同时参考芯片电气参数特性即EN经过14ms上升到电平1,在实际代码中延时了50ms的等待时间,以确保延时后EN处于电平1的状态
。ESP32下载模式: https://www.esp32.com/viewtopic.php?t=5731
[2]关于esptool下载逻辑: https://github.com/espressif/esptool/issues/136
谁是最强打工人?这类开发岗位平均月薪超3万元!
搞技术,如何写好技术文档?
智能车与马克思主义
美国为什么不用芯片技术卡俄罗斯的脖子?