最近想画一块STM32的开发板,需要设计ISP自动下载电路,在此借鉴正点原子的ISP自动下载电路的硬件设计。由于模拟电路不是很精通,本章结合PSpice进行仿真理解ISP的原理。
1. STM32的启动方式
讲到下载方式,一定得首先首先知道STM32的启动方式。STM32一共有三种其中方式,如下图所示
BOOT0 | BOOT1 | 启动方式 |
---|---|---|
0 | X | 内部FLASH |
1 | 0 | 系统存储器 |
1 | 1 | 内部RAM |
- 内部FLASH通常对应的是我们使用下载器进行烧录,比如常用的Jlink、STlink、DAPlink等等
- 系统存储器通常对应的是使用串口下载,因为STM32在出厂时就内置了一段BootLoader,这段BootLoader用于启动串口下载的程序。
- 内部RAM没用用过, 就不过多介绍
如果我们的开发板没有一键下载电路的话,我们下载程序时要把boot 0的跳冒从接GND变成接VCC,然后下载,按一下复位按键程序才能烧录,最后再把接VCC变成接GND,并且再按一下复位,这样单片机才能运行程序,每一次烧录程序都很麻烦。而当我们的单片机有了一键下载电路后,就不需要改变boot 0的值,直接烧录就可以运行。下面就我个人来分析一下一键下载电路。串口ISP通信的详细原理请看着: STM32 串口 ISP 原理
2. ISP自动下载电路设计
所谓自动就是指用户无需按下复位键和BOOT切换来实现下载,一般复位管脚会接上拉电阻,默认为高电平,而BOOT0管脚一般会接下拉电阻,默认为低电平,我们需要设计一种电路,在下载的时候将RESET管脚设置为低电平,BOOT0设置为高电平。怎么才能设置这两个管脚呢?解决的思路是通过上位机去控制这两个管脚的电平,具体怎么控制呢?这就涉及到串口的硬件流控制了,上位机是可以通过编程控制USB转TTL芯片的相关管脚状态的。
2.1 正点原子ISP自动下载电路设计
如下图所示为正点原子ISP自动下载电路设计原理图。ISP电路只要看左边部分,下载软件(mcuISP或者FlyMCU等软件)需要设置为DTR的低电平复位和RTS高电平进BootLoader,此时CH340G的RTS#为低电平,DTR#为高电平,电平相反的原因是:DTR#和RTS#表示反向标志的的意思。因为我们的mcuisp软件使用的是232标准电平,而单片机是ttl电平,他们两者电平是相反的。所以原理图中DTR后面加了一个#表示我们CH340G芯片此时接收到的DTR是高电平(与我圈起来的序号1中的DTR低电平相反所以是高电平)。并不是说CH340G芯片会进行逻辑非运算,仅仅只是一个提醒标志而已。由电路图可知,Q3会导通,导致BOOT0管脚为高电平,Q2也会导通, 导致RESET管脚为低电平,此时MCU进入复位,此时就能达到我们的设置电平的作用了。
2.2 ISP自动下载电路全过程解析
如下图所示,为mcuisp串口烧录软件的全过程,我们需要设置好1和3就可以实现自动下载了,标号2处显示的是下载时的调试信息。从图示我们可知分为以下几步:
- DTR置低、RTS置高(对应DTR#置高、RTS#置低), 延时100ms
- DTR置高、RTS维持高
- 程序下载
2.2.1 DTR置低、RTS置高(对应DTR#置高、RTS#置低) 阶段
此时Q3和Q1都导通,BOOT0为高电平,RESET为低电平,STM32此时进入BootLoader,为烧录程序做准备。下图为仿真图,注意在仿真的时候需要将RESET的上拉电阻和BOOT0的下拉电阻画上, 不然很难分析出BOOT0和RESET的电平变化。
2.2.2 DTR置高、RTS置高(对应DTR#置低、RTS#置低) 阶段
此时Q3导通,Q1截止,BOOT0为高电平,RESET为高电平,释放复位。下图为仿真图
经过这两步后就可以通过串口下载代码了
2.3 疑问点
2.3.1 为什么需要将两个三极管连接在一起?
这是因为Q3在这里其主导作用,当RTS#为低电平时,给Q2的射极提供了一个电平,若RTS#为高电平,此时不管DTR#为任何电平,Q2都不会导通,此时RESET为高电平。下图为仿真结果
2.3.2 为什么需要那个IN4148二极管?
这个二极管的作用我觉得是防止手动复位电路影响到ISP自动下载电路,目前的仿真结果看不出这个结论。至于是不是得实物调试,有知道的大佬也可以麻烦告诉我
2.3.3 下载完成后RTS#是不是会自动变为高电平?
理论上在下载程序后需要将BOOT0拉低, 此时需要Q3截止,那就是需要RTS#为高电平,但是我们冲上位机下载日志中没看出这个调试信息, 具体得看实物的电平。