一、官方提供的启动模式说明
硬件BOOT引脚接法表格
从表格可以看出有三种启动模式,然后对应这不同的存储器启动,那我们现在疑问为啥有三种不能只有一种就好,还有存储器启动区域怎么区分,有些乱,带着这些疑问,我们往下分析。
2.存储器解释
看了上面表格,可能对存储器的说明有些模糊,我们先来说说它的含义。
(1)主闪存存储器
这个大家可以理解就是我们用来存放程序的Flash;
(2)系统存储器
这个不是我们表面所看的Flash,它是厂家自己定义的一块存储区域,里面内置了一个BOOTLOADER程序程序,这个程序就存放在这个区域中。
(3)SRAM这个大家都知道,没啥特殊的
3.模式的区别
现在我们知道各个存储区域的含义,那我们就来说下为啥子会分这几个启动模式?
我们都知道程序都是保存在Flash的,那么我们写的程序要运行跑起来,是不是要从Flash区域开始运行啊,对吧,所以我们默认应当是硬件上电后,应该要以第一种模式运行,也就是将BOOT1随意接但BOOT0一定要接地,这样程序才是从Flash开始启动,运行奔跑起来啊。
既然程序都是从Flash运行,一直选这一个模式肯定没有错啊,为啥子还有其他模式啊?
首先,你程序写好是不是要烧录到硬件MCU上?那么你的烧录方法就关系到这个不同启动方式
第一种:用STLINK或者JTAG下载程序,是直接将程序写入到FLASH上面
第二种:如果你是用串口下载程序,比如STM32的串口1可以用来接收下载程序,关键点就在于你用串口下载程序,程序不是像STLINK或者JTAG直接对Flash进行写操作;而是在有一段代码功能负责将串口1接收到的程序写入FLASH中。也就是有个间接的过程。
换个意思理解,你从电脑通过USB下发程序,硬件接收是通过串口1接收,那么是不是得段代码使能串口1接收啊,然后再将串口1收到的程序写到Flash中啊。
那么这段代码就存储在 系统存储器,这段代码是ST出厂时就固化在里面了。
所以当你使用串口下载程序,你是不是要先让启动厂家固化的这段代码,所以这时候得先设置启动方式为第二种启动,这样才能让这段代码运行起来,来接收你往串口1发送的数据。当你下载完以后,启动模式是不是得切换成第一种啊,这样你写的程序才能先从Flash运行啊。没有错把。
我们常用的就是前面两种,第三种很少用基本不用,这里不做解释
4.针对第二种的控制做解释
在这里如果有做过硬件的同学,肯定知道默认画板都会搞两个10K下拉电阻接至BooT1和BooT0,既将BooT0和BooT1都接地;那么这时候就会有疑问BooT1不是随意接都可以,那我接高行不行,其实BooT1接高接地是关于你电路匹配的,如果你要通过串口下载你是不是要有个电路在下载时候先让芯片进入到第二种模式,当下载完芯片在跳转到进入到第一种模式啊,程序开始运行
那我们逻辑应该是,BOOT1始终保持位0,我们只需要控制BOOT0引脚为1或者为0就可以在两种模式下切换了,对不对啊。
上原子的电路图
我们需要注意一点:CH340G上电后DTR#和RTS#都为高电平
分析:
(1)上电是。DTR和RTS都为高,难是不是两个三极管都没动作,而BOOT1 BOOT0都为0,所以这时候是从FLASh启动正常运行。
(2)当我们下载时,控制RTS拉低(DTR还保持着原来高电平),那这时候是不是两个三极管导通,BOOT0先至高,reset在拉低(因为复位电路存在电容与1N4148二极管的存在,时间存在滞后),复位完后,这时候就进入到第二种模式啦,那么这时候我们是不是要把RESERT啦高回来,这样才可以运行可以下载程序啦,不是一直处于复位状态
(3)当你下载完程序,这时候要把DTR拉高回来,让芯片先复位,然后再把RTS也拉高回来这时BOOT0拉低,紧接着RESERT脚也跟着拉高回来了,这样就进入正常模式回来了。