> 技术文档 > STM32N6 的 FSBL 基本流程介绍 LAT1491_stm32n6 externalloader 开发

STM32N6 的 FSBL 基本流程介绍 LAT1491_stm32n6 externalloader 开发

关键字:STM32N6,FSBL,Boot

1. 简介

STM32N6 是 ST 第一颗带 NPU 的MCU 芯片,内部只有一小块 ROM 用于第一阶段的 Boot,必须使用外部 Flash 存储用户代码或通过 USB/U(S)ART 串口启动。另外,STM32N6 的工程引入了一些新的术语比如 FSBL 等。本文记录 STM32N6 使用的一些基本启动步骤,重点介绍FSBL。

2. 启动模式

下图是 STM32N6 DK 板,其中 BOOT1 引脚决定了两种不同的启动模式,dev boot 和Flash boot/Serial boot 模式:

图1. STM32N6 DK 板

Flash boot(Boot1 = 0, Boot0 = 0)意味着上电后,BootROM 程序(固化在片内 ROM 的一小段启动程序)会尝试从外部 Flash 启动,应用程序需要下载到外部 Flash,如果没有应用则无法启动。Dev boot 意味着上电后,BootROM 程序尝试从内部 Ram 中启动。

3. 启动流程和工程框架

3.1. FSBL

FSBL 的全称为 First Stage Boot Loader, 在上电后,先执行片内 ROM 区域的BootROM,然后根据 Boot 选项和地址,执行相应地址的 FSBL,参考下图实例为外部Flash 的启动流程。

图2. FSBL 工程

如上图,系统启动流程如下:

1. BootROM 启动后,会验证 FSBL 的头,如上图深黄色部分 1024Bytes 的 Header 信息,可以使用 ST 提供的脚本对 FSBL进行签名,FSBL程序必须完成签名,不然无法正常启动。验证成功后,BootROM 将 FSBL 程序搬运至内部 SRAM2:0x34180000 的位置,然后PC 指针跳转过去开始执行 FSBL。

2. FSBL 开始执行。

3.2. FSBL+Load&Run

APP 的开发可以在内部 SRAM 中调试完成,开发完成后通过 External loader 下载到外部Flash。

图3. FSBL+APP

如上图,系统启动流程如下:

1. 和 3.1 的 FSBL 执行一样,BootROM 先启动,然后校验,搬运 FSBL,并跳转到 FSBL。

2. FSBL 开始执行,然后拷贝 Appli 的完整内容到内部 SRAM,包括 data 和 code。然后跳转到 APP 代码进行执行。

3. APP 代码开始执行。

3.3. FSBL+XiP(Execute in Place)

图4. FSBL+XiP

如上图,系统启动流程如下:

1. BootROM 开始执行,和图 2 一样,校验完 FSBL 后将其搬运到 SRAM 中。

2. FSBL 开始执行,将外部 Flash 配置为 XiP 模式,FSBL 完成后,将 PC 跳转至外部Flash 中 App 的第一条指令。

3. APP 开始执行。

3.4. ST FSBL 签名工具

在签名前,需要安装 ST 最新的 CubeProgrammer,并将 STM32MP_SigningTool_CLI.exe的路径加入到 Windows 系统 PATH 环境变量中,确保该 exe 程序可以被正确找到并运行。

图5. Rev Code 区分 Cut 版本

Cut1.1 执行:
STM32MP_SigningTool_CLI.exe -bin FSBL.bin -nk -of 0x80000000 -t fsbl -o FSBL-trusted.bin -hv 2.1 -dump FSBL-trusted.bin

Cut2.0 执行:
STM32MP_SigningTool_CLI.exe -bin FSBL.bin -nk -of 0x80000000 -t fsbl -o FSBL-trusted.bin -hv 2.3 -dump FSBL-trusted.bin

• -bin: 原始 bin 文件。
• -nk:no keys,没有使用密钥相关选项。
• -of:option flags。
• -t:bin 文件的类型为 fsbl。
• -o:输出后的文件。
• -hv:header version,版本号。
• -dump:将 bin 文件的 header 信息 dump 出来,方便查看。

FSBL.bin 是原始的 FSBL 工程的 bin 文件,FSBL-trusted.bin 是已经被正确签名并添加好header 的 bin 文件

3.5. 总结

既然单独一个 FSBL 工程里面也可以包含应用程序,那么是不是所有 APP 程序都放在 FSBL里面,然后像 3.1 一样只编译和烧录一个工程即可?

不是,BootROM 最大只能拷贝 512K 字节,如果工程超过了这个大小,则需要类似 3.2 小节中所示架构,具体如下图所示:

图6. BootROM 的限制

4. 开发流程

本节将以 IAR+STM32N6 DK 板为例,介绍 STM32N6 开发的基本流程。该 demo 位于SDK:

Projects\\STM32N6570-DK\\Examples\\UART\\UART_HyperTerminal_IT 目录下,该 demo的框架只有一个 FSBL 程序,应用程序和 FSBL 是一个工程,对应 3.1 小节中的架构。

4.1. 进入 Development 模式

Development 模式用于开发调试,BootROM 启动后,将直接执行 RAM 中的代码。

Dev mode 进入方式如下:

图7. DK 板进入 dev mode

图8. Nucleo 板进入 dev mode

4.2. 项目选项

请确保 Device 内部包含 STM32N6 相关的内容,如果没有请先安装 STM32N6 的补丁。

图9. Device 确认

图10. ST LINK 配置

图11. Output 设置

图12. Debugger 设置

4.3. 编译

编译前,如果使用 Keil 或 IAR,请确保 N6 相关的补丁包已经打上,如果使用CubeIDE则需更新 CubeIDE 的版本。补丁包位于 SDK 中下图所示目录:

图13. STM32N6 补丁包的位置

选择默认的编译选项,完成编译。

4.4. 调试

虽然该工程是 FSBL 工程,但调试阶段不需要签名。

图14. 调试界面

Reset 方式请确保设置为 Software,才可以正常调试,设置完成后,退出调试,然后重新下载调试。再次启动调试界面后点击运行,程序应该可以正常从串口打印出相应信息。

4.5. 烧录程序到外部 Flash

烧录前请先确定工程是不是 FSBL 工程,由于该工程是 FSBL 工程,所以先进行签名才可以从外部 Flash 启动,签名流程参考 3.4。

烧录到外部 Flash 需要利用 External loader,STM32N6 DK 和 Nucleo板自带了External loader 程序,如果是自己的开发板,需要先开发 External loader 应用,可以参考 ST 其他文档,本文中没有介绍 External loader 的开发。

4.5.1. 命令行烧录

准备工作:

1. 开发板进入 dev 模式。

2. 将 STM32N6 的 External loader 设置为环境变量 DKEL,参考下图:

图15. 环境变量设置

3. 将 STM32_Programmer_CLI 的目录添加到系统 PATH 环境变量。

• Linux
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG ap=1 -el $DKEL - hardRst -w FSBL-trusted.bin 0x70000000

• Windows
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG ap=1 -el %DKEL% - hardRst -w FSBL-trusted.bin 0x70000000

Note :
建议通过指定地址的方式烧录 bin 文件,而不是直接烧录 hex 文件,因为工程编译出
来的 hex 的默认地址一般是 RAM,而不是外部 Flash,需要更改烧录地址才可以直接烧录
到外部 flash 中,这是经常容易发生错误的地方。

4.5.2. CubeProgrammer 烧录

如下图所示,boot1 切换到 dev 模式后,连接 CubeProgrammer:

图16. CubeProgrammer 配置

选择 STM32N6 DK 板相应的 External loader:

图17. External loader 选择

下载 hex 文件: 

图18. 烧录 hex 文件

下载 Bin 文件:

图19. 烧录 bin 文件,并指定地址

4.6. 重启

烧录完成后,将 boot 模式调整为从外部 Flash 启动,具体方法见下图:

图20. STM32N6 DK 板 外部 Flash 启动模式 

图21. Nucleo 板 外部 Flash 启动模式

然后,重启开发板,此时 BootROM 会从外部 flash 启动,没有错误的话 demo 工程可以和开发调试时候一样正常运行。

在 Cut1.1 的版本中,Flash 启动模式并没有关闭调试口,可以通过“attach to 
running target”的方式,进行调试,如下图:

图22. Attach to Running Target

文档中所用到的工具及版本

IAR:9.30.1

Keil:5.41.0.0