【官方原创】一站式生成STM32N6的ExtMemLoader, FSBL, Appli的点灯工程 LAT1614

附件:一站式生成STM32N6的ExtMemLoader, FSBL, Appli的点灯工程

关键字:STM32N6,ExtMemLoader, FSBL, Application

1. 引言

STM32N6系列没有内部用户Flash,只有一个BootROM,BootROM中固化了引导

代码,用于将一级启动的FSBL代码搬运到STM32N6内部的RAM。本文介绍的应用属于

BootFlash 应用,完整的BootFlash应用工程包括子启动子工程FSBL,应用子工程

Application, 另外由于需要将二进制代码文件烧录到外部Flash,还包含一个

ExtMemLoader 子工程。

本文档会从STM32CubeMX开始,基于NUCLEO-N6570开发板,一步步进行配

置,最终生成ExtMemLoader,FSBL,Appli的三合一的LED点灯工程。文中也介绍了

XIP 和Load and Run 应用的一些调试技巧。客户使用STM32N6570-DK开发板或者自己

设计的电路板,也可参考此开发流程。

2. XIP 和Load and Run 流程

在开始之前,先向大家介绍下XIP和Load and Run的代码运行流程。

2.1. FSBL+XIP

XIP 应用案例是直接从存储应用代码的外部Flash执行代码,FSBL+XIP应用案例的代

码执行流程主要包括以下三步。

• BootROM 执行: Boot ROM从外部 FLASH 将FSBL复制到内部 SRAM。当

BootROM 任务完成后, PC指令跳转到FSBL工程的第一个指令位置。由于

BootROM是一段固化的代码,如果选择从NOR Flash启动,只有固定的PIN脚才支

持BOOT ROM代码,支持BOOT的引脚在DS手册中有boot标识,也可参考

NUCLEO-N6570和STM32N6570-DK开发板中连接NOR Flash的引脚配置。

• FSBL 执行:将外部Flash配置为内存映射模式,当 FSBL工程执行完成时,PC会跳转

到存放在外部Flash的应用程序的第一条指令位置。

• Application 执行:执行来自外部闪存的应用。

图1. FSBL+XIP 代码执行流程

2.2. FSBL+Load and Run

Load and Run 案例与XIP不同点在于,FSBL会将应用代码先从外部Flash加载到

RAM中,然后跳转到RAM中应用代码开始执行。

图2. FSBL+Load and Run 代码执行流程

3. 工程创建

下面会从STM32CubeMX开始,一步一步配置,最终完成一个包含FSBL,

Application,ExtMemLoader 的 LED 点灯程序。

打开STM32CubeMX软件,按照下图中的次序,首先创建一个空白工程,并从MCU

选择开始。

图3. 选择ACCESS TO MCU SELECTOR

图4. 输入MCU型号开始工程

工程创建好后,还是一个空白工程,我们需要逐步配置相应的外设,最后生成代码。

我们要创建的是一个完整的BootFlash 应用工程。我们会看到配置包括FSBL,

Application, ExtMemLoader 三部分,这其实对应三个子工程。

FSBL : 第一级启动子工程,STM32N6的FSBL也是存储在外部存储器中的。FSBL配

置比较简单,仅配置和启动相关的外设,如配置时钟,GPIO电压范围,使用外部内存管

理中间件(EXTMEM_MANAGER)来配置外部存储器,实现应用程序XIP或Load and

RUN。

ExtMemLoader:用于生成外部存储器下载器子工程,它在执行前会被加载到RAM

中,执行时会将FSBL和Application的二进制文件下载(烧录)到外部存储器中。

EXTMEM_LOADER中间件可以快速开发三种编译器(IAR、MDK-ARM、

STM32CubeIDE/Prog)的下载器。

Application : 应用代码子工程,存储在外部存储器中,并由FSBL启动。该工程会更

新系统时钟ICACHE/DCACHE管理,更新MPU配置,配置APP用到的外设等。

3.1. 在 FSBL中配置BSEC

Boot and security control(BSEC)用于管理 OTP, Debug。如果要在FSBL中配置

OTP让XSPI在1.8V达到200MHz,那么就需要使能BSEC。这里使能BSEC,后面在代

码中配置OTP和打开SWD端口。

图5. 在FSBL中配置BSEC

3.2. 配置FSBL和Appli的MPU

这里把ICache和DCache都使能了,在FSBL中跳转到App会有关闭Icache和

Dcache 的操作,因此需要在Appli再把它Enable。

图6. 在FSBL中配置MPU

图7. 在Application 中配置MPU

XSPI2 对应的地址,其MPU属性如何配置呢?请参考RM0486, XSPI2对应的地址是

0x70000000, 这段地址默认属性是Normal,是可以执行代码的,保持默认不配置也是可

以的。

图8. XSPI 地址 MPU默认属性

3.3. PWR

要保证XSPI2 外设在1.8V 200MHz DDR模式下正常运行,需要启动HSLV,默认情

况PWR无法勾选,需要先在Features页面勾选一项特性,我们这里勾选了WKUP pin

protection。

图9. PWR配置界面1

因为NOR Flash连接到了STM32N6的PN系列引脚,这部分引脚供电端口是

VDDIO3 1.8V,要在1.8V达到200MHz DDR,VDDIO3必须选择1.8V,否则达不到

200MHz的速度。

需要注意的是,STM32N6有VDDIO2,VDDIO3,VDDIO4,VDDIO5不同的电压域

(1.8V 或3.3V),他们可以独立供电,可以让不同组的GPIO输出不同的电压,在原理

图设计时需要注意它们的电压范围。

图10. PWR配置界面2

3.4. RCC

NUCLEO-N6570开发板所选的供电方式是External supply,是

PWR_EXTERNAL_SOURCE_SUPPLY 模式,该模式下Power Regulator Voltage Scale

配置对外部供电电压没有影响,它可以被读取/写入以跟踪外部供电电压的设置。当SMPS

启用时,该位控制VCORE电压水平,VOS0代表高性能,使用更高频率, 可以达到

800MHz, 详细信息可参考Datasheet。

图11. RCC配置

如果是使用SMPS供电模式的开放板,需要把SupplySource配成

PWR_SMPS_SUPPLY,但目前版本STM32CubeMX 6.15生成VOS配置会有代码缺失,

需要手动添加,例如在FSBL 的man.c中,在配置系统时钟之后添加如下代码:

HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE0)

3.5. GPIO 配置

NUCLEO-N6570开发板使用External supply供电模式,如下图所示,需要通过

GPIO 控制电源输出0.89V,以满足800MHz主频输出。使用NUCLEO-N6570开发板,

在FSBL工程中需要配置PB12输出高电平,通过该GPIO控制电源输出0.89V,如果是

STM32N6570-DK开发板,需要配置PF4输出高电平,以满足800MHz主频输出。

图12. VDDCore外部供电电路

图13. VDDCORE_OVERDRIVE GPIO配置

为了验证Application 有没有正常运行,我们在Application中配置一个LED引脚的

输出并翻转,以闪烁LED来查看代码运行状况。在NUCLEO-N6570板上,连接该LED

的引脚是PG8,生成代码后,再在Appli while(1)循环中添加GPIO翻转函数闪烁LED

灯,用来外部观察代码运行状态。如果是STM32N7670-DK,LED引脚连接的是PO1。

在调试阶段,有时会验证FSBL工程有没有正常运行,这时也可以在FSBL里配置一个

GPIO,根据GPIO翻转的状态判断FSBL的运行情况。

图14. LED GPIO配置

3.6. SYS_S 配置

在SYS_S配置中会选择时基,这个时基也是HAL_Delay的时基。

图15. SYS_S时基选择

3.7. XSPIM

XSPIM 用于管理XSPI引脚的分配,可以实现直连,交叉,复用等功能,这里选择

Direct 直连,并且在FSBL和Appli中都勾选。

图16. XSPIM配置

3.8. XSPI2

在FSBL和ExtMemLoader中都要勾选。XSPI2用来实现与外部Flash的通讯,在

FSBL 中需要配置为内存映射模式,在ExtMemLoader中需要使用它烧录代码到外部

Flash。

图17. XSPI配置界面1

图18. XSPI配置界面2

Memory Type 选择:对于NOR Flash,Memory Type一般选择Micron模式或者

Macronix 模式,两者的区别主要在于DDR模式下数据顺序是D1D0还是D0D1,Maronix

mode(D1D0),Micron mode(D0D1)。如果是其他品牌的NOR Flash, 如果该Flash只支持

STR 模式,那么选Micron或者Macronix模式都可以。如果支持DDR模式,需要查看对应的

datasheet,与下图的时序进行对照来选择。

图19. Macronix模式和Micron模式DTR时序

图20. MXIC CSH时间要求

关于XSPI配置的参数比较多,详见下表的汇总。

3.9. EXTMEM_MANAGER配置

配置EXTMEM_MANAGER ,生成代码时会生成中间件STM32_ExtMem_Manager,里边

会有NOR FLASH的初始化和指令跳转相关函数。并且选择Execute in Place模式,也就是

XIP。

图21. EXTMEM_MANAGER配置界面1

图22. EXTMEM_MANAGER配置界面2

3.10. EXTMEM_LOADER配置

配置完XSPI和EXTMEM_MANAGER后,才能配置EXTMEM_LOADER。NUCLEO-N6570

和STM32N6570-DK开发板的一个区别是扇区的数量,一个是1024,一个是2048。

图23. NUCLEO-N6570的EXTMEM_LOADER配置

图24. STM32N6570DK的EXTMEM_LOADER配置

3.11. Clock 配置

根据应用配置时钟参数,保证XSPI的时钟参数是200MHz,这里建议XSPI2的时钟

源是HCLK。选择HCLK,会使得reboot更加简单,如果应用中会使用XSPI1,建议

XSPI1 的时钟源也选择HCLK。

图25. 时钟配置

3.12. GENERATE CODE 生成工程

输入工程名字,生成FSBL, Appli和ExtMemLoader的三合一工程。

图26. 生成工程

3.13. 编译ExtMemLoader生成stldr

生成代码后,使用STM32CubeIDE打开工程,可以看到FSBL,Appli和

ExtMemLoader 三个子工程都生成了。

图27. NUCLEO-N6570_XIP工程

我们首先编译ExtMemLoader子工程,编译之后,在Console会有编译log输出,

我们需要使用STM32CubeProgrammer来加载这个Loader进行代码的烧录。IDE的后

处理命令也会自动把Loader复制到STM32CubeProgrammer下的目录。不同的电脑可

能存在访问权限不足造成自动复制失败的问题,可以通过修改该文件访问权限来解决,将

stldr 自动复制到C:\Program

Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\ExternalLoader

目录下。

图28. 修改文件访问权限的方法

也可以手动复制,在STM32CubeIDE\ExtMemLoader\Debug目录下找到后缀为elf

的文件,将其后缀改为stldr,stldr是STM32CubeProgrammer识别的loader格式,

也可以自定义这个stldr的名字,然后将该stldr文件复制到STM32CubeProgrammer

下的相应目录,如默认路径:C:\Program

Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\ExternalLoader

复制完后,即可重新打开STM32CubeProgrammer进行验证。

图29. STM32CubeProgrammer找到stldr

在电路板与电脑连接之前,先将BOOT1拨到H位置,然后将电路板与电脑通过USB

线缆连接STLINK端口,此时STM32N6会进入开发者模式。打开

STM32CubeProgrammer, 在EL(外部加载器)页,找到对应的stldr并选择,然后点击

Connect。(注意重新复制stldr文件后,需要重起STM32CubeProgrammer才能检索

到)

为了使XSPI能够正常运行在200MHz,我们还需要修改OTP124 HSLV_VDDIO3

位。通过STM32CubeProgrammer修改OTP时,不能直接选择对应的位进行操作,例

如不能直接操作HSLV_VDDIO3的值。需要选择OTP124,因为HSLV_VDDIO3, Bit 15,

需要将OTP124配置为0x00008000,修改后回车,再点击应用。如果是批量修改,可以

在代码中进行修改。如果NUCLEO-N657开发板擦除失败,其原因有可能就是OTP124

没有正确配置。

图30. OTP124 HSLV_VDDIO3状态

3.14. stldr 的验证

可以输入0x70000000地址,读取外部Flash的数据。

图31. 查看外部Flash地址的数据。

在擦除外部存储器界面,可以选择一个扇区,点击擦除查看结果。如果可以查看地址

和擦除数据,那么你的Loader就制作成功了。

图32. 扇区擦除测试

4. STM32N6的XIP工程

我们刚刚创建的是一个XIP工程,正常情况下,STM32N6从Flash启动后,SWD端

口是关闭的,无法进行Debug,在调试阶段,可以在需要在FSBL中添加OpenDebug

代码,将SWD端口打开。相关代码如下:

复制代码
FSBL子工程main.c添加代码 
/* USER CODE BEGIN 0 */ 
static void OpenDebug(void); 
#define NO_OTP_FUSE 
#ifndef NO_OTP_FUSE 
static int32_t OTP_Config(void); 
#endif /* NO_OTP_FUSE */ 
/* USER CODE END 0 */ 
int main(void) 
{ 
  /* USER CODE BEGIN 1 */ 
  // Open for debugging, authenticate debugging of secure code. 
  // This enables debugging without going through developer mode. 
  // REMOVE FOR PRODUCTION CODE! 
  OpenDebug(); 
  /* USER CODE END 1 */ 
} 
/* USER CODE BEGIN 4 */ 
//以下代码的实现参考附件代码 
static void OpenDebug(void) 
{} 
static int32_t OTP_Config(void) 
{} 
/* USER CODE END 4 */

在Appli 中添加一个LED灯翻转的代码,编译Appli和FSBL工程,使用脚本命令进

行代码下载。

复制代码
while (1) 
{ 
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); 
HAL_Delay(200); 
/* USER CODE END WHILE */ 
} 
/* USER CODE BEGIN 3 */

图33. Application 中LED 翻转代码

代码下载的脚本请参考附件Flash scripts文件夹,连续双击脚本,第二次可能会失

败,需要重新给板子上电。FSBL和APP工程生成的bin文件需要在开头添加一个

Header,加过Header之后bin文件可以使用STM32CubeProgrammer来下载。在下

载之前,需要先将BOOT1 PIN接到高电平,即设置为DEV模式,然后给板子重新上电,

烧录完成后,BOOT1 PIN再接低电平(BOOT0 PIN也需要接低电平,即设置为Flash启

动模式),重新上电,STM32N6就会从Flash 启动了。

STM32CubeIDE 工程Debug属性配置,在debug时 代码Image Download设置

false; Reset Type:None。在代码运行起来后,即可通过debug连接板子了。

图34. Debug配置界面1

图35. Debug配置界面2

图36. Debug配置界面3

图37. STM32N6 XIP调试界面

5. STM32N6的LRUN工程

XIP 的调试,需要先用脚本将代码烧录到外部Flash,然后再用STM32CubeIDE

Attach 到应用代码,有时调试不是很方便。那么这种情况下,也可以采用Load and run

模式。

如果要更改成LRUN模式,需要将刚刚的IOC文件复制到一个新的文件夹,然后更改

boot 系统选择,选择Load and run模式。

图38. Boot 选择切换为Load and Run

LRUN source:配置从Memory1的什么地址开始搬运代码,默认搬运多少代码。实

际搬运代码可以通过生成代码的BOOT_GetApplicationSize weak函数来重写

LRUN destination:配置代码搬运到什么地址。

在生成的ld链接文件可以看到,代码和数据均放在了内部SRAM。在调试阶段可以直

接使用STM32CubeIDE进行调试。App调试相对方便了很多。

图39. STM32CubeIDE LRUN的链接文件

图40. STM32CubeIDE LRUN的调试界面

6. 小结

按照本文介绍的详细配置过程,您可以创建自己的 ExtMemLoader, FSBL, Appli的最

小系统工程。在此基础上,可以在Appli中继续添加更多所需的配置与功能。本文档介绍

的是STM32CubeIDE工程的生成过程,如果需要使用IAR或者KEIL进行开发,可以在

STM32CubeMX工程生成页面中修改 Toolchain/IDE,重新生成代码即可轻松实现。


意法半导体公司及其子公司 ("ST")保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。

相关推荐
小付爱coding2 小时前
AI Agent 思考模式
人工智能
diligence2 小时前
Claude Code 配置 Chrome DevTools MCP 指南
人工智能
沈浩(种子思维作者)2 小时前
梦境意识之谜——豆包补充
人工智能·python·量子计算
ShiMetaPi2 小时前
GM-3568JHF丨ARM+FPGA异构开发板系列教程:外设教程 08 串口
stm32·单片机·fpga开发·rk3568
yunni82 小时前
安全+智能双保障:企业级慧听AI本地化部署方案
人工智能·安全
Mintopia2 小时前
容器化部署 Flux.1-dev 文生图模型应用 | 共绩算力
人工智能·llm·图片资源
liliangcsdn2 小时前
LDM潜在扩散模型的探索
人工智能·深度学习
Fabarta技术团队2 小时前
枫清科技出席AI4S创新论坛——生态共建,智驱AI+科研新体系
大数据·人工智能·科技
墨染天姬2 小时前
【AI】2025 个人知识库工具排名
人工智能