0 前言
最近在研究STM32时,在下载程序时遇到了一些问题,在查找相关资料并结合自己的实践后,突然发现自己之前对STM32程序下载和启动配置等理解存在较大的误区,特写篇文章记录一下。
1 启动配置
相信很多人学习STM32都会接触这张启动配置的图:
从画红线的部分可以了解到,当芯片复位之后,系统时钟(SYSCLK)起振,程序从地址0x0000 0000开始运行,在SYSCLK第四个上升沿锁存BOOT的引脚电平,然后决定接下来是从主闪存运行还是系统存储器中运行,也就是PC指针接下来跳转到哪个位置执行程序,0x0800 0000对应主闪存;0x1FFF F000对应系统存储器。
于是就出现了第一个疑点。网上有很多博客在介绍stm32的启动配置时,都提到stm32内部存储的结构,低地址主要是系统存储区,高地址是主闪存,如下图所示
图片来源:我之前的一篇博客
然而,根据STM32的数据手册,其内部存储是这样分布的:
可以看出,实际上系统存储区在高地址,主闪存在低地址,也就不存在所谓的先后执行的顺序关系了,先执行系统存储区,判断有没有下载的请求,如果有则进行下载操作;否则,执行后面的用户程序,这是51单片机特有的启动流程,不要搞混了。在以STM32为代表的ARM单片机中,这两部分的程序实际上是单独存在的,都是死循环的结构,也就是进入到其中一个执行之后,无法自动跳出到另外一个部分去执行,除非更换启动配置然后复位或者是软件内部执行指令跳转。而决定进入哪个死循环的就是初始的启动配置,即初始上电时BOOT引脚的电平。
所以很显然,最直白的方式就是使用外部编程器/仿真器进行下载,速度快的同时还能进行仿真,此外,不用来回切换启动配置。
试想一下,如果你使用串口下载,需要哪些步骤,假定起点是芯片正在正常执行程序,然后现在需要更新程序,需要:
- 首先是将启动配置切换到系统存储运行(即BOOT0接1,BOOT1接0),
- 然后复位,
- 再使用串口下载,
- 下载完毕之后,又要把启动配置切换到运行