敢问路在何方,路在脚下。。。STM32启动运行的过程就像人的一生。人生的第一步可以有很多选择,而STM32运行的第一步却已经被限制在了三种,没错,这三种就是它的启动方式。
在了解STM32微处理的启动方式这个问题之前,我们首先要弄清楚STM32微处理的存储结构。我们以STM32L系列微处理中的一款为例,可以看到存储器结构图中从0x0000 0000到0Xffff ffff地址的分布情况。而处理器的启动只会从图中三个箭头标注的其中之一的地方进行启动,这个三个地方分别是Flash system memory,Systerm memory和SRAM。
图1 STM32的存储器结构
下面我们来详细介绍一下这三个存储区域:
(一) Flash system memory:故名思议,既然是Flash ,那就是属于ROM的一种,即数据断电情况下是可以保存的,类似于我们常用的NANDFlash,NORFlash等等。我们最终产品的应用程序固件也都是烧写口下载到这个区域并进行运行的。
(二) System memory:系统存储区,ST公司在生产芯片的过程中会将嵌入式的启动代码固件下载到这个区域,用户可以通过USART1,USART2,SPI1或者SPI2来重新烧写第一部分中Flash system memory中的程序。这个过程也可以被称作是自举,System memory的固件程序也被称作是自举程序,ST公司为不同的STM32的子产品分别烧写了不同版本的自举程序。
下图是USART1接口,USART2接口与自举程序进行通讯,并将我们用户应用程序下载到Flash system memory的示例:
图2 通过自举程序将应用程序下载到Flash
系统复位以后,对时钟,GPIO,指令看门狗,systick分别进行初始化,自举程序会循环检测USART1和USART2接口,当其中一个接口接收到0x7F数据后,禁止所有中断源并配置相对应的接口,等待上位机发出自举程序命令。
(三) SRAM:SRAM一般很小,只有几K字节的大小,且掉电会丢失,所以不能存放很大的程序,只能临时运行比较小的程序进行在线调试仿真使用。当然了,它也有它的优点,那就是运行速度特别快,因为CPU可以通过系统总线或者I-Code/D-Code总线直接访问SRAM。
上面介绍了三种启动方式一般用于什么情况以及该如何选择,那下面介绍具体配置成其中一种方式。其实也非常简单,就是把BOOT0引脚和BOOT1引脚进行组合即可。
图3 STM32启动方式的选择
只要将BOOT0引脚接低电平,BOOT1引脚无论为什么电平,都会从Flash system memory启动;当BOOT0引脚接高电平,BOOT1引脚接低电平时,会从System memory启动;当BOOT0引脚接高电平,BOOT1引脚接高电平时,会从SRAM启动。
我们做产品,最终的代码都是存储在Flash system memory中的,当系统上电复位后,会在systick时钟的第四个上升沿读取BOOT0和BOOT1的高低电平,来选择期望的启动模式。对于低功耗系列芯片从待机模式退出后也会重新采样这两个引脚的高低电平。
总结:STM32的三条路大多数人会选择让它走flash这条,在极少数情况下会让它走...。每条路都有它的价值,所以选择走哪条路要根据自己的目标来选择!