你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32N6的开发日记(2):配置、签名、烧录,配置外部Flash实现LED灯闪烁

[复制链接]
攻城狮Melo 发布时间:2026-3-23 09:04

前言

STM32N6作为意法半导体推出的首款集成自研神经处理单元的STM32产品以“MCU+NPU”的异构架构重新定义了边缘AI的算力边界,是意法半导体的MCU最前沿技术栈,不过由于其高难度技术应用以及需要的极其深厚的STM32使用经验以及神经网络基础概念,因此上手难度非常的高。

image.png

自从STM32N6发布以来,博主有幸获得一块STM32N657-DK开发板,闲暇之余陆陆续续折腾如何开发。因此将会陆陆续续发表一些使用STM32N6的使用笔记,以供将来的使用者参考。

回顾学习历程,主要是使用人群不多,导致踩了很多很多的坑,在后续使用STM32N6的文章中也会像大家陆续介绍这些点。

本期我们介绍STM32N657DK开发板的烧录方式以及如何实现FSBL_XIP即烧录FSBL(第一阶段引导程序)跳转到到外部Flash所在地址,进行第二阶段(Application)应用程序开发。 image.png

1

FSBL_XIP的启动模式

由于STM32N6并没有内置Flash,因此所有的程序都要烧录到外部Flash中,外部Flash会被划分成两个功能区:

image.png

外部Flash的前512KB被划归为FSBL功能区,FSBL的前1K内容被用于数据签名,因此最多511K空间用于第一阶段引导程序代码。

接下来我们开始使用STM32CubeMX,STM32CubeIDE以及STM32CubeProgramer实现FSBL+XIP程序。 1

CubeMX配置 image.png

image.png

在STM32CubeMX中选择STM32N657X0型号,安全域配置推荐选择下方Secure domain only。

image.png

设置高速时钟和低速时钟,调高时钟主频(此步骤非必要)

image.png

image.png

观察原理图,两颗LED灯分别是PO1和PG10,同时需要注意配置GPIO的作用域,我们的主要代码在Application,串口则使用串口1,TXD和RXD分别为PE5和PE6,对其进行初始化。

image.png

观察芯片原理图,OCTOSPI(外部FLASH)连接到XSPI2,例如图中PN1(对应XSPIM_P2_NCS1)。

image.png

同样的观察到SPRAM连接到XSPI1,所以可以推断XSPI1对应SPRAM,XSPI2对应Flash。

image.png

在XSPIM管理中,我们将模式选择直接连接模式XSPI1 连接到Port1;XSPI2连接到Port2,XSPI3不使用。

image.png

根据参考手册定义,可以知道XSPI1对应地址0x90000000、XSPI2对应地址0x70000000;即Flash对应首地址为0x70000000、SPRAM对应首地址为0x90000000;

image.png

参考官方配置外部Flash(XPI2)参数如上图所示,尤其注意Mode栏别设置错了。 image.png

配置外部SPRAM的XSPI1参数如上图所示。

image.png

在存储管理界面,我们要设置FSBL的启动模式为在外部程序运行,存储选择为Memory1,偏移量为0x100000。由于有0x100000作为偏移,因此FSBL首地址烧录在0x70000000,Application用户程序首地址下载在0x100000处。

image.png

Memory配置为PSRAM.

image.png

同时需要注意控制一下XSPI1和XSPI2的时钟频率(200MHZ需要改IO配置,这里官方推荐50MHZ,但是实测100MHZ并没有问题,拉高到200MHZ就会异常),创建STM32CubeIDE工程。 2

代码编写

image.png

CubeMX创建代码后,可以看到整个STM32N6的工程被分成了两个独立工程,分别是Appli和FSBL,对应用户程序和第一阶段引导程序。

intmain(void){
  /* USER CODE BEGIN 1 */  /* USER CODE END 1 */  /* MCU Configuration--------------------------------------------------------*/  HAL_Init();  /* USER CODE BEGIN Init */  /* USER CODE END Init */  /* Configure the system clock */  SystemClock_Config();  /* USER CODE BEGIN SysInit */  /* USER CODE END SysInit */  /* Initialize all configured peripherals */  MX_GPIO_Init();  MX_XSPI1_Init();  MX_XSPI2_Init();  MX_EXTMEM_MANAGER_Init();  /* USER CODE BEGIN 2 */  /* USER CODE END 2 */  /* Launch the application */  if (BOOT_OK != BOOT_Application())  {    Error_Handler();  }  /* Infinite loop */  /* USER CODE BEGIN WHILE */  while (1)  {    /* USER CODE END WHILE */    /* USER CODE BEGIN 3 */  }  /* USER CODE END 3 */}

FSBL工程的主要内容是初始化XSPI和内存管理,初始化完成后,BOOT_Application函数调用跳转到指定的Flash位置。

intmain(void){  /* USER CODE BEGIN 1 */  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/  HAL_Init();  /* USER CODE BEGIN Init */  /* USER CODE END Init */  /* USER CODE BEGIN SysInit */  /* USER CODE END SysInit */  /* Initialize all configured peripherals */  MX_GPIO_Init();  MX_XSPI1_Init();  MX_XSPI2_Init();  SystemIsolation_Config();  /* USER CODE BEGIN 2 */  /* USER CODE END 2 */
  /* Infinite loop */  /* USER CODE BEGIN WHILE */  while (1)  {     HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);     HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);     HAL_Delay(250);    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */  }  /* USER CODE END 3 */}

Application工程中的main.c为我们的用户代码工程文件,我们在这里设置两个LED翻转。

image.png

修改STM32N6 Appli工程的编译链接文件为:STM32N657X0HXQ_ROMxspi2_RAMxspi1.ld,即程序存储在XSPI2,SPRAM为XSPI1。

image.png

分别编译两个工程后,都没有问题。 3

程序烧录

在上一步编译完程序后获得了:工程名_FSBL.bin和工程名_Appli.bin两个文件,但是我们不能直接烧录这两个文件,需要使用STM32CubeProgram插件对其进行数字签名。

STM32_SigningTool_CLI.exe -bin "${ProjName}.bin" -nk -of 0x80000000 -t fsbl -o "${ProjName}-Trusted.bin" -hv 2.3 -dump "${ProjName}-Trusted.bin

可以在命令行用上述代码对二进制文件进行签名,需要注意的是,STM32_SigningTool_CLI.exe的路径必须添加在系统路径中,否则找不到。

当然我们也可以在STM32CubeIDE中设置一个命令,让程序在编译完之后自动进行签名:

image.png

cd "${ProjDirPath}/Debug" && echo y | "STM32_SigningTool_CLI.exe" -bin "${ProjName}.bin" -nk -of 0x80000000 -t fsbl -o "${ProjName}-Trusted.bin" -hv 2.3 -dump "${ProjName}-Trusted.bin"

image.png

这里注意的是,FSBL和Appli两个工程都要添加这个命令和进行签名。

image.png

接着我们需要打开STM32CubeProgrammer,将开发板的BOOT1拨到右边(1),BOOT0在左边(0)进入开发者模式。

image.png

连接到STM32N6570-DK开发板上后,我们需要选择外部Flash下载算法:

image.png

image.png

分别将签名后的FSBL代码和Appli代码烧录到地址0x70000000和0x70100000,之后将BOOT0和BOOT1拨回左边,复位板子: 73.gif

文章出处:实在太懒于是不想取名

收藏 评论0 发布时间:2026-3-23 09:04

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版