的应用研究ESP32自动下载电路在应用中的可行性

1、先来看看ESP32手册说明的启动运行方式

 

由上图可知,ESP32有SPI启动模式(正常启动)与下载启动模式两种,要实现程序自动下载肯定是需要上电时自动进入下载启动模式,方法就是将GPIO0与GPIO2同时拉低,因GPIO2上电默认下拉(IO2可能会被用作SD卡或其它的作用,这样如果在有设备接入时,并且引脚呈现高电平,就会出现不能下载的现象),所以可以只考虑GPIO0,同时控制复位引脚(EN)就可以实现自动程序下载,如下:

EN由低电平到高电平(上升沿)时CPU复位,复位后检测到GPIO0是低电平,CPU自动进入下载启动模式!

2、电路实现分析

   

       

CHIP_PU就是控制CPU重启的EN信号,GPIO0决定启动时的模式选择,对图中电路分析如下:

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时,三极管Q1和Q2均为截止状态,此时EN和IO0的状态由其他电路决定(内部/外部上拉电阻)。

当不同时为0或者1时:

EN  = RTS
IO0 = DTR

注意这种逻辑下 EN和IO0是不可能同时为0的,然而进入下载模式则需要如下的序列

1.  IO = 0; EN = 0
2.  IO = 0; EN 0 -> 1

 从逻辑表上看是根本无法正常进入下载模式的,此为疑惑1。

分析-2

再来继续分析一下esptool.py里下载相关的代码

        # 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,两条语句之间的延时并不能忽略,因此分析的时候必须依次的进行状态分析,以下分为四个阶段依次分析

1) 设置DTR = 1; RTS = 0, 此时Q1导通,Q2截止, EN = 0; IO0 = 1

2) 设置DTR = 0; RTS = 0, 此时Q1截止,Q2截止, EN = 1; IO0 = 1

3) 设置DTR = 0; RTS = 1, 此时Q1截止,Q2导通, EN = 1; IO0 = 0

4) 设置DTR = 1; RTS = 1, 此时Q1截止,Q2截止, EN = 1; IO0 = 1

如果按照上面的代码分析来做结论,不论如何系统也是不可能进入下载模式的:EN和IO0首先不可能同时为0,EN由0->1的上升沿IO0也并不为0,再次确认之前的疑惑,那么系统究竟是如何进入下载模式的呢?

答案

问题的答案实际在另外一部分电路,原理其实非常简单:EN信号连接在一个电容充放电电路上

CHIP_PU即EN,代码中23阶段之后会延时一段时间,而EN由于电容充电,电平并不会立马变为高电平,而是缓慢上升,以如上参数为例计算,同时参考芯片电气参数特性

高电平为0.75VDD,则达到高电平按照如下公式计算: 

解得t = 14ms,即EN经过14ms上升到电平1,在实际代码中延时了50ms的等待时间,以确保延时后EN处于电平1的状态。

另外需要提的是,阶段1需要等待一段时间,让电容放电,保证EN电平下降到电平0,才能保证系统正常复位,在代码中预留了100ms的等待时间,同样可以通过电容放电公式计算出放电到电平0需要的时间,感兴趣的朋友可以自行根据公式计算确认。

参考

ESP8266/ESP32自动下载电路原理分析 – 知乎

物联沃分享整理
物联沃-IOTWORD物联网 » 的应用研究ESP32自动下载电路在应用中的可行性

发表评论