• 正文
  • 相关推荐
申请入驻 产业图谱

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

04/29 09:18
950
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

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

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

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

1、FSBL_XIP的启动模式

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

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

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

1、CubeMX配置

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

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

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

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

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

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

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

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

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

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

Memory配置为PSRAM.

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

2、代码编写

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翻转。

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

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

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中设置一个命令,让程序在编译完之后自动进行签名:

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"

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

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

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

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

意法半导体

意法半导体

意法半导体(ST)集团于1987年6月成立,是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成。1998年5月,SGS-THOMSON Microelectronics将公司名称改为意法半导体有限公司。意法半导体是世界最大的半导体公司之一,公司销售收入在半导体工业五大高速增长市场之间分布均衡(五大市场占2007年销售收入的百分比):通信(35%),消费(17%),计算机(16%),汽车(16%),工业(16%)。 据最新的工业统计数据,意法半导体是全球第五大半导体厂商,在很多市场居世界领先水平。例如,意法半导体是世界第一大专用模拟芯片和电源转换芯片制造商,世界第一大工业半导体和机顶盒芯片供应商,而且在分立器件、手机相机模块和车用集成电路领域居世界前列.

意法半导体(ST)集团于1987年6月成立,是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成。1998年5月,SGS-THOMSON Microelectronics将公司名称改为意法半导体有限公司。意法半导体是世界最大的半导体公司之一,公司销售收入在半导体工业五大高速增长市场之间分布均衡(五大市场占2007年销售收入的百分比):通信(35%),消费(17%),计算机(16%),汽车(16%),工业(16%)。 据最新的工业统计数据,意法半导体是全球第五大半导体厂商,在很多市场居世界领先水平。例如,意法半导体是世界第一大专用模拟芯片和电源转换芯片制造商,世界第一大工业半导体和机顶盒芯片供应商,而且在分立器件、手机相机模块和车用集成电路领域居世界前列.收起

查看更多

相关推荐