STM32 之十四 System Memory、Bootloader
由于工作的需要,最近学习了一下 STM32F4 MCU 中的 BootLoader。对比了 ST 的其他系列的的 MCU,关于 Bootloader 这部分原理基本都是一样的,无非就是配置项多少的区别。下面记录一下以 STM32F411 为例的学习历程。
引导模式
每个芯片对应的参考手册中都有这部分的介绍,在对应的翻译的中文手册中被称为自举模式。在 STM32F4xx 中,可通过 BOOT[1:0] 引脚选择三种不同的自举模式,如下图所示:

- 从 Main memory 引导: Main memory 被映射到为引导存储空间(0x00000000),但仍可以从其原始存储空间(0x08000000)中访问。 换句话说,可以从地址 0x00000000 或 0x08000000 开始访问 Main memory。在实际使用中,这种模式用的居多!
- 从 System memory 引导: System memory 被映射到为引导存储空间(0x00000000),但仍可以从其原始存储空间(0x1FFF0000)中访问。这部分存储空间中,存放了 ST 的 Boot 代码!不同的芯片里面的代码是有区别的,这个部分在手册 AN2606.pdf 中有详细的介绍。今天我们就来重点学习一下这部分。
- 从 SRAM 引导: SRAM1 被映射到为引导存储空间(0x00000000),但仍可以从其原始存储空间(0x20000000)中访问。我至今没明白这个模式如何去使用,后面有机会再研究研究。或者有知道的小伙伴可以私聊给我一些指导!
复位后,MCU 会在 SYSCLK 的 第四个 上升沿锁存 BOOT 引脚的值。如果我们需要改变启动模式,就需要在复位之后尽快改变 BOOT 引脚的值。其中,BOOT0 为专用引脚,而 BOOT1 就不一样了。主要有以下两种情况:
- 部分 MCU 中,BOOT1 不表示 I/O 引脚,而是 选项字节区域 的一个位。STM32F05x 和 STM32F3xx 器件就属于这种情况。此时 BOOT1 通过选项字节中的 nBoot1 位进行配置。
- 当 nBoot1 位置 1 时,相当于上图中的 BOOT1 复位为 0。
- 当 nBoot1 位复位为 0 时,相当于上图中的 BOOT1 置 1。
- 部分 MCU 中,则与普通的 GPIO 引脚共用一个引脚。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,我们可以将该引脚用于其它用途。
注意:
- MCU 退出待机模式时,还会对 BOOT 引脚重新采样。
- 如果器件从 SRAM 启动,在应用程序初始化代码中,需要使用 NVIC 异常及中断向量表和偏移寄存器来重新分配 SRAM 中的向量表。
- 选项字节区域 见对应 MCU 的参考手册 FLASH 章节即可
- 对于具有两个 BANK 的 MCU,例如 STM32L476,情况可能更加复杂
System Memory
这部分其实就是 MCU 中固定位置的一块区域,里面存放了一些固定的代码。如下图是 STM32F411 的地址映射图:

这部分空间在出厂前的生产期间由 ST 进行了编程,出厂后就不可更改,通常我们就将这里的程序称为 引导程序(BootLoader) 。其主要作用就是是通过一些可用的串行外设(USART、CAN、USB、I2C 等)将应用程序下载到内部 Flash 中。
几乎全系列的 MCU 都是支持这部分功能的。下面是手册给出的适用情况表格:

当然不同的 MCU 因为外设的不同,可能支持一个或多个嵌入式串行外围设备。 **引导程序标识符(ID)**提供了 MCU 支持的串行外围设备的信息。引导程序标识符具有固定的格式,适用于除STM32F1xx 之外的所有 STM32 系列 MCU。

这个 ID 也存储在 MCU 的固定位置,下图是一个部分系列 MCU 的列表

上图只是部分内容,AN2606 中有一个很长表格,详细列出了每个系列的 MCU 中的 BootLoader 支持的串行外设情况。
对于不同的外设协议,ST 都提供对应的非常详细的应用手册:
- AN3154: CAN protocol used in the STM32 bootloader
- AN3155: USART protocol used in the STM32 bootloader
- AN3156: USB DFU protocol used in the STM32 bootloader
- AN4221: I2C protocol used in the STM32 bootloader
- AN4286: SPI protocol used in the STM32 bootloader
- AN5405: FDCAN protocol used in the STM32 bootloader
对于使用 DFU/CAN 接口嵌入引导程序的 STM32 MCU,其中 DFU/CAN 操作需要外部时钟源(HSE)。 其中的引导加载程序固件会使用内部振荡器时钟(HSI,MSI) 动态检测 HSE 的值(因为引导加载程序不知道用户有没有外接 HSE)。 当(由于温度变化或其他条件)内部振荡器精度在公差带以上(理论值的1%左右)变化,引导加载程序可能会计算出错误的 HSE 频率值。 在这种情况下,引导加载程序 DFU/CAN 接口可能会出现故障或根本无法工作。
进入
除了上面的引导模式章节介绍的 BOOT 引脚方式可以进入 System Memory 之外,我们其实还可以直接使用程序跳转进入。但是在跳到引导加载程序之前,必须处理一下几个方面:
- 禁用所有外设时钟
- 禁用使用的 PLL
- 关闭所有中断
- 清除所有被挂起的中断
进入引导程序之后,我们就可以使用对应的外设协议来对 FLASH 进行操作了。ST 本身也提供了很多实用工具。例如,若通过 UART 接口来烧写程序,则要下载个 PC 端的 flash 烧录工具软件 STM32 Flash loader demonstrator 来配合;若通过USB 接口来烧写程序,则需要下载 USB DfuSe工具软件来实现。
目前,ST 推出了新一代烧写工具 STM32CubeProgrammer,把上面的工具给整合成了一个
退出
通过退出引导加载程序激活条件并生成硬件复位或使用 Go 命令执行用户代码,即可以退出系统内存引导模式。
执行 Go 命令时,引导加载程序使用的外设寄存器不会在跳转到用户应用程序之前初始化为它们的默认重置值。 如果要使用,则必须在用户应用程序中重新配置。 因此,如果 IWDG 用于在应用中,必须调整 IWDG 预分频器的值,以满足其要求。
参考
- AN2606 Application note STM32 microcontroller system memory boot mode
- DS10314.pdf
- RM0383.pdf
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
