MCU自动下载原理及实现
串口自动下载电路实质为:上位机通过控制 USB 转串口芯片 DTR、RTS 引脚电平,配合硬件电路使进入芯片下载模式
自动下载原理
串口下载的需要依赖 bootload,其流程为在芯片中先下载一个 bootload , 进入 bootload 后检查是否进入下载模式,如果未进入下载程序,则跳转到实际程序运行。
根据进入 bootload 的方式可分为两种,一种为进入 bootload 由外部引脚控制,例如 STM32 和 ESP8266。
一种是系统复位时默认进入 bootload ,例如 STC 的 51 系列和一些自定义的 bootload 。
以 STM32 为例,在芯片出厂时在其系统存储区烧录了一个 bootload ,并通过其 boot0 和 boot1 引脚电平进行选择复位后进入的存储器。
对于自定义 bootload ,只能在系统复位时进入 bootload ,然后在 bootload 中进行进一步判断处理。
自动下载功能需要硬件和软件两部分支持,软件部分包括由上位机提供的串口下载协议和串口流控信号。
自动下载硬件电路将串口流控信号,转换为对于芯片所需的复位信号和boot引脚信号。
在串口下载的上位机程序中,需要控制串口的 DTR(Data Terminal Ready)、RTS(Request To Send) 引脚提供下载开始信号,然后由硬件电路转换为对应的复位信号和 boot 信号。
ESP8266 的自动下载原理分析
以 ESP8266 为例,ESP8266 进入下载模式的条件为 GPIO0 引脚为低电平时,复位芯片( RST\EN 上升沿)。 即 GPIO0 = 0 RST = 0 -> 1
NodeMCU 的自动下载电路如下如所示:
GPIO0 和 RST 默认电平为高电平,且需要注意到 RST 引脚有一个复位电路。
其复位延时时间约为 1.15 ms。
其自动复位电路类似三极管双稳态电路:
- 当 DTR = 1,RTS = 1 时, VT1截止,VT2截止, RST = 1; GPIO0 = 1
- 当 DTR = 0,RTS = 0 时, VT1截止,VT2截止, RST = 1; GPIO0 = 1
- 当 DTR = 1,RTS = 0 时, VT1导通,VT2截止, RST = 0; GPIO0 = 1
- 当 DTR = 0,RTS = 1 时, VT1截止,VT2导通, RST = 1; GPIO0 = 0
其真值表为:
在状态 3) 下载电路 RST 引脚为低,进入复位模式;
在状态 4) 下载电路 GPIO0 引脚为低。
由于 RST 引脚带有复位电路,在 RST 引脚电平变为高电平后,会有一段时间延时才能恢复高电平。所以只需要在上位机代码中控制 DTR&RTS 引脚电平,依次进入状态3和状态4,ESP8266 就可以进入下载模式。
查看 ESP8266 下载工具 pytool.py 代码:
# 已删减无关代码,原代码 https://hub.fastgit.org/espressif/esptool/blob/master/esptool.py#L570
# 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.
# 进入状态 3)
self._setDTR(False) # IO0=HIGH
self._setRTS(True) # EN=LOW, chip in reset
time.sleep(0.1)
# 进入状态 4)
self._setDTR(True) # IO0=LOW
self._setRTS(False) # EN=HIGH, chip out of reset
time.sleep(0.05)
# 恢复 Flash 启动模式
self._setDTR(False) # IO0=HIGH, done
使用逻辑分析仪抓取的下载时的 DTR、RTS 信号如下图所示。
其中红框所标识的就是状态 3 -> 4 的变化。
由于执行代码也需要时间,实际状态变化并不是由状态3直接进入状态4,但是状态1和2并不会对下载电路产生影响。
其他
对于不需要 boot 引脚即可进入下载模式的bootload,其自动下载同样是使用上位机控制 DTR\RTS 引脚,只不过它只需要使用一个引脚让芯片在下载前进入复位模式即可。
通过上面分析,就可以解释为什么有时在使用串口软件打开串口后,芯片会自动复位。
这是因为在串口软件中默认开启了流控,其流控引脚导致芯片进入复位状态,所以只需关闭串口软件流控,即可避免该现象发生。