How to execute code from the external serial NOR using the STM32N6[XIP]

使用 STM32N6 从外部串行 NOR 执行代码[XIP] 是第三种代码执行方式

总结

第一阶段引导加载程序 (FSBL) 是 STM32N6 微控制器引导过程中的关键组件。它负责初始化系统、配置硬件以及将应用程序代码从外部内存加载到内部或外部存储器中执行。本文提供了有关如何使用 FSBL 并让它配置外部串行 NOR FLASH in Execution in Execution in Execution (XiP) 的快速教程,包括配置和编程外部存储器的过程。

介绍

上电时,boot ROM 将 FSBL 二进制文件从外部串行 NOR 闪存复制到内部 SRAM。一旦 boot ROM 任务完成,它将跳转到 FSBL 工程,FSBL 工程通常负责执行 clock 和 system 设置以及配置外部存储器。最后,它要么在内部 SRAM 中复制应用程序二进制文件,要么将外部存储器设置为内存映射模式。完成后,应用程序本身将启动并运行。如果您想了解更多关于 boot ROM 的信息,请查看这篇文章

在 STM32N6 MCU 上,第一阶段引导加载程序 (FSBL) 必须经过签名或至少具有有效的标头,以便引导 ROM 可以在安全锁定状态下执行它。FSBL 布局包括几个关键组件,本文提供了更多详细信息。

本文使用 STM32N6570-DK 作为其动手实践部分的基础,但内容可以针对任何特定的 STM32N6 硬件进行定制。该示例显示了直接从外部串行 NOR FLASH 运行的简单闪烁 LED。该项目将有两个二进制文件,一个用于 FSBL,另一个用于外部 FLASH。两者都在外部存储器上添加了接头并进行了编程。由 FSBL 在内存映射模式下执行 XSPI,以允许从外部 FLASH 执行。

1. FSBL 主要特点

FSBL 可以以多种不同的方式使用,每种方式都适合特定的应用要求。以下部分介绍了本文中使用 FSBL 的模式。

1.1 FSBL 和从外部闪存运行的应用程序

在此模式下,FSBL 和应用程序位于外部闪存的不同地址中。boot ROM 将 FSBL 从外部存储器复制到内部 SRAM。由 FSBL 准备内存以在内存映射模式下运行,并跳转到应用程序的位置,以便直接从外部 FLASH 执行。可以在下面的小动画中观察到视觉表示:

2. 手动作:闪烁 LED

本文假设您已安装 STM32CubeMX(6.13 或更高版本)、最新版本的 STM32N6 HAL 驱动程序、STM32CubeProgrammer(2.18 或更高版本)和 STM32CubeIDE(1.17.0 或更高版本)。

用于展示的硬件是 STM32N6570-DK,并确保你把它放在 DEV 引导模式下来编程代码:

2.1 FSBL 和应用程序:XiP 中的闪烁代码

2.1.1 配置 LED 引脚

该项目需要配置一些外设才能正常工作,包括与 PO1 相关的绿色 LED 及其有效高电平,以及连接到 XSPI2 的外部存储器。

首先使用 STM32CubeMX 创建一个新项目,然后选择 [STM32N657X0H3Q]。

选择使用 [仅限安全域] 的选项。

找到 PO1 并将其配置为 GPIO_Output,并使用标签将其命名为 [GREEN_LED]

我们需要分配应用程序要使用的 GPIO。

2.1.2 配置 XSPI 和 XSPIM

找到 “Connectivity” 菜单下左侧的 [XSPIM],选择它在 [First Stage Boot Loader] 期间运行,并选择 [Direct] 模式:

Octo-SPI 闪存具有以下特性:1 Gbit、1.8 V、200 MHz、DTR、边写边读。

它连接到 XSPI2 上 STM32N6570-DK 板上 STM32N657X0H3Q 微控制器的 OCTOSPI 接口。

使用该信息,转到 XSPI2 以根据可用硬件配置外围设备:

至于 [参数设置],请仔细查看下图:

2.1.3 配置 EXTMEM_MANAGER

下一步是在 [Categories] 中找到 [Middleware and Software Packs],然后展开 [EXTMEM_MANAGER]。

使用以下设置添加 [第一阶段引导加载程序] 和 [激活外部内存管理器] 复选框:

[XiP 应用程序偏移] = 0x00100000

[XiP 标头大小] = 0x400

 [Memory 1] 选项卡中,确保配置如下:

2.1.4 配置 XSPI 时钟

XSPI 的最后一步是配置其 clock。在本例中,我们将 XPI clock 设置为 50 MHz。要实现此串行 NOR 闪存支持的高达 200 MHz 的更高速度,您需要更改 OTP 以优化 I/O 速度。本文不涉及这一点。(如何对 STM32N6 的一次性可编程(OTP)熔丝位进行编程

转到 [Clock Configuration] 选项卡,将 IC3 作为 XSPI2 的源,键入 50 并按 Enter 键以自动调整时钟:

继续为这两个项目生成代码。

2.1.5 代码编辑和构建

_Appli 项目中,找到 main.c 文件,并在其主循环中添加切换 LED 函数调用:

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
            HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin);
            HAL_Delay(200);
  }
  /* USER CODE END 3 */

确保您的项目设置也配置为生成 *.bin,因为我们将使用它来运行脚本:

2.1.6 添加标头

我们需要添加 FSBL 标头,以确保引导 ROM 能够从外部存储器读取和复制它。此外,还为应用程序添加了相同的标头。为此,我们使用 STM32CubeProgrammer 的 CLI。接下来假设 STM32CubeProgrammer 安装在默认路径中,如果没有,请确保相应地调整它。

为了方便这个过程,可以在二进制文件夹中键入 “cmd”,例如 ..\XIP\XIP\STM32CubeIDE\Appli\Debug。这将在所选路径中弹出 cmd。

请注意,此过程需要在 appli 和 FSBL 上执行,因此以下是每个应用程序的命令,假设项目名称为 XIP:

生成两个项目,确保为 _Appli 和 _FSBL 项目创建 *.bin 文件。成功完成构建后,我们将执行相同的步骤,在每个二进制文件的相应文件夹中调用 STM32CubeProgarmmer 的 CLI 来执行签名。这些是命令:

FSBL的:

C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\STM32_SigningTool_CLI.exe" -bin XIP_FSBL.bin -nk -of 0x80000000 -t fsbl -o FSBL-trusted.bin -hv 2.3 -dump FSBL-trusted.bin

APPli

"C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\STM32_SigningTool_CLI.exe" -bin XIP_Appli.bin -nk -of 0x80000000 -t fsbl -o Appli-trusted.bin -hv 2.3 -dump Appli-trusted.bin

这是预期的输出:

这将为二进制文件创建标头,现在可以使用 STM32CubeProgrammer 将其加载到外部闪存中。

2.1.7 对二进制文件进行编程

确保启用了闪存的外部加载器:

并使用地址 [0x7000 0000] 对 FSBL 二进制文件进行编程,

使用地址 [0x7010 0000] 对 APPli 程序二进制文件进行编程:

提示:如果单击 [Start Programming] 时出现失败消息,您可能需要重启开发板,并确保它位于 DEV 引导模式。

2.1.8 验证

要查看您的应用程序正在运行,请将 BOOT1 设置为 LOW,断开编程器并重新启动。现在,绿色 LED 闪烁,代码正在从外部闪存执行!

结论

通过了解 FSBL 布局及其主要功能,开发人员可以有效地利用 FSBL 来满足其特定需求。本文提供了一个使用 STM32N6570-DK 的动手教程,演示了如何实现 FSBL。此外,如何配置外部存储器以从外部串行 NOR 闪存运行应用程序。通过执行这些步骤,开发人员可以确保其基于 STM32N6 的项目顺利、高效的启动过程。

相关链接

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐