如何从用户闪存启动STM32?

How to boot STM32 from user flash?

STM32 微控制器能够从不同的来源启动,例如:

  1. 用户快闪
  2. 系统内存
  3. 嵌入式 SRAM。

在固件方面,“从用户闪存启动”是否意味着执行自定义引导加载程序?

没有

从用户闪存启动”模式意味着复位后运行的应用程序代码位于用户闪存中。该模式下的用户闪存别名为从引导存储器 space 中的地址 0x00000000 开始。复位后,从地址 0x00000000 获取 top-of-stack 值,然后代码从地址 0x00000004 开始执行。

相比之下,“从系统内存启动”模式只是意味着系统内存(不是用户闪存)现在别名化为从地址 0x00000000 开始。这种情况下的应用程序代码必须已经加载到系统内存中。

从嵌入式 SRAM 引导”模式不会为 SRAM 地址设置别名。选择此模式时,设备预计向量 table 已使用 NVIC 异常 table 和偏移寄存器重新定位,并且执行从嵌入式 SRAM 的开始处开始。这种情况下的应用程序代码必须已经加载到嵌入式 SRAM 中。

有关更多详细信息,请参阅您正在使用的特定 STM32 设备系列的参考手册,在标题为 "Boot Configuration" 的部分中。

视情况而定。

选项"Boot from user Flash" 将运行 用户闪存中的任何内容。此代码可以是您想要的任何内容。可能是:

  • 自定义引导加载程序或
  • 它可能是应用程序代码。

根据您编写代码的目的,这种区别是合乎逻辑的。即,甚至有可能拥有一个重写部分或全部自身的应用程序(你怎么称呼它取决于你)。

如果您确实使用自定义引导加载程序,那么您通常会有两个项目。

  1. 自定义引导加载程序会将其自己的项目与自己生成的二进制映像加载到闪存的启动中。
  2. 应用程序代码也有自己的项目和生成的.bin 文件。

应用程序被加载到引导加载程序在构建时知道的特定地址(在一些空闲的静态分配内存块中 - 通常在页面边界上以允许刷新,同时保持引导加载程序不变)。这些地址可以在链接器文件中配置。

自定义引导加载程序是实现以下功能的好方法:

  1. 自定义 coms 堆栈,通过其他一些 coms 协议刷新您的应用程序。
  2. 应用代码双重冗余。

请注意,STM32 微处理器 "System Memory" 已经包含 ST 自己的引导加载程序,它支持一系列串行链接,无需完全自定义的引导加载程序即可刷新微处理器。

ST 的文档很愚蠢。他们提到了这一点,但他们也没有告诉您只需配置 BOOT0 & BOOT1 引脚即可 select 引导源。

所以这两个引脚二进制表示给你三个选项是:

  • (A) BOOT0 = 0, BOOT1 = 随便,
  • (B) BOOT0 = 1, BOOT1 = 0
  • (C) BOOT0 = 1, BOOT1 = 1.

选项 A 在闪存中启动,选项 B 在引导加载程序中启动,选项 C 启动在 SRAM 中。

那么这个怎么用呢。首先选择配置B开始与你指示(在bootloader自己的命令中)的bootloader通信以擦除FLASH并将你的程序上传到FLASH中。然后将配置更改为 A 并使用 MCU 的 RESET 引脚重新启动。

Note:

I perfer the NXP's documentation which has everything black on white. As a developper I value my time and good documentation is a way to go. Ditch ST and go for NXP if documentation is what you value. Here is NXP's sample documentation:

https://www.nxp.com/docs/en/user-guide/UM10562.pdf

I am really sorry ST, but you have to do better than what you are currently doing...