从BOOT说起
BOOT在词典的解释为:
boot:(亦作 boot-up)[usu. as modifier] the process of starting a computer and putting it into a state of readiness for operation (电脑的)启动
既然是引申义,写者想它和靴子的联系,于是想到如下情景:当从屋子里要出门时,需要穿上长靴才能走后续的路,而程序需要知道指令首地址才能运行。不要问我为什么不是shoe.
在标准模式下,当复位发生时,由BOOT脚及BOOT_ADD0/1选项字将确定内核跳转到的地址。BOOT脚接低电平时,启动地址为0x08000000,即用户闪存存储空间(user Flash memory)的首地址;BOOT脚接高电平时,启动地址为0x1FF00000,即系统闪存存储空间(system Flash memory)的首地址,而在也是启动引导程序bootloader的首地址(后者属于前者)。
在评估板的BOOT脚一般接低电平,那么程序直接运行用户程序,即“.s”文件中的程序,那部分属于汇编和Cortex-M架构的内容了,这里不细展开。而当用户程序编写时有BUG,如写Flash时把Flash锁了,或设置低功耗模式,将导致新的程序下载不进去。那么把BOOT脚接高电平,程序将运行意法固化在系统存储中的BootLoader程序,对用户来说相当于ROM区域的程序,没有BUG,用户就可以在这个模式下通过SWD或bootloader的方式下载程序了。
BootLoader
在bootloader中,程序将在主循环等待和确定上位机通过某种方式(如UART,SPI)与它通信[2],而上位机可用通过如MCUISP这个的上位机软件实现具体的通信过程。
如果确认是串口与它通信,那么程序将在子循环通过具体的通信协议来擦除闪存、读/写保护设置和写入用户程序。
访问方式
注:前面说的是在默认访问方式——标准模式下进行的。
标准模式:用户存储(User memory)包含应用程序代码和数据,同时通过STM32 bootloader程序加载系统内存。当复位发生时,由BOOT脚及BOOT_ADD0/1选项字将确定内核跳转到的地址。(STM32 bootloader程序是出厂时固化到Flash的程序)
安全访问模式:此模式下,微控器总是从 secure bootloader 程序启动。于是,如果不需要安全服务,代码将安全地跳转到由BOOT脚及BOOT_ADD0/1选项字确定的(用户程序)启动地址。
从安全区域运行的代码才能访问Secure-Only区域 .安全访问模式是通过置位SECURE选项字位并且单片机复位进入的。
由“Table 17. Option byte organization”的出厂默认值知,默认情况下(即意法半导体交付设备时),使用的是标准模式,存储映射位SWAP_BANK==0。
注:这里需要对照着“2.6 Boot configuration”来看。寄存器BOOT_ADD0/1的值表示4字节地址值的高两字节。
存储映射
记得stm32f103的是将Flash地址从0x0800,0000映射到了0x0000,0000,而在stm32h743中,Flash的0x0000,0000地址是给ITCM的(这一点在程序调试时需要特别注意)。Stm32743中的存在着另一种存储映射,由SWAP_BANK选项位控制(默认设置为0,下电不丢失),具体见表15。存储映射是在上电复位或系统复位后确定的,在程序正常运行过程中不会改变,修改存储映射见图10。
由于地址映射的不同,stm32f103上错误地进行了空指针的解引用(dereference null pointer),将出现总线错误,但在stm32h743上,将会不知不觉地改变ITCM内的值,而不会直接出发错误。
参考资料
[1] RM0433 Reference manual :STM32H742, STM32H743/753 and STM32H750 Value line advanced Arm®-based 32-bit MCUs
[2] AN2606 Application note :STM32 microcontroller system memory boot mode
[3] AN3155 Application note : USART protocol used in the STM32 bootloader