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

它涵盖了两个实际示例,

第一个是直接从 FSBL 运行的简单闪烁 LED 应用程序。

第二种是更有用的设置,其中 FSBL 从外部存储器加载应用程序并从内部 RAM 运行它。

介绍

上电时,boot ROM 将 FSBL 二进制文件从外部存储器复制到内部 SRAM。一旦引导 ROM 任务完成,它将跳转到 FSBL 项目,该项目通常负责 执行时钟和系统设置,配置外部存储器,最后,它将 应用程序二进制文件复制到内部 SRAM 中或将外部存储器设置为内存映射模式.完成后,应用程序本身将启动并运行。如果您想了解更多关于 boot ROM 的信息,请查看这篇知识文章

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

本文使用 STM32N6570-DK 作为其动手实践部分的基础,但内容可以针对任何特定的 STM32N6 硬件进行定制。显示了两个示例:第一个示例是直接从 FSBL 运行的简单闪烁 LED,第二个示例由两个二进制文件(应用程序和 FSBL)组成。这两个示例都添加了 header 并在外部存储器上编程。FSBL 可以直接从内部 RAM 执行应用程序,或者从外部 FLASH 复制到内部 RAM 并执行应用程序。

1. FSBL 主要特点

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

1.1 作为 FSBL 第一种加载模式:

在此模式下,boot ROM 从外部串行 NOR 闪存中获取 FSBL。由于 FSBL 和应用程序包含在同一个二进制文件中,因此在此模式下存在 511 KB 的大小限制。这是因为引导ROM从外部存储器复制到内部SRAM的总RAM区域为512 KB。可以在下面的小动画中观察到视觉表示:

1.2 FSBL Load&Run 运行应用程序第二种加载模式

在此模式下,boot ROM 从外部闪存获取 FSBL。这一次,FSBL 继续配置外部存储器并获取存储在其中的第二个二进制文件,然后将其复制到内部 SRAM 中。加载二进制文件后, FSBL 会跳转到 RAM 中的新位置,即应用程序代码所在的位置并开始执行。此模式适用于 STM32Cube_FW_N6 中提供的一些示例。有趣的是,511 KB 的大小限制不再适用,因为用户代码可以放置在内部 RAM 的剩余区域中。

2. 闪烁 LED Demo 实现方法

本文假设您已安装 STM32CubeMX(6.13 或更高版本)、最新版本的 STM32N6 HAL 驱动程序、STM32CubeProgrammer(2.18 或更高版本)和 STM32CubeIDE(1.17.0 或更高版本)。用于展示的硬件是 STM32N6570-DK,并确保你将其置于 DEV 引导模式来编程代码:

2.1 使用简单 FSBL 闪烁代码的第一个演示

该项目需要配置一些外设才能正常工作,包括与 PO1 及其有效高电平相关的绿色 LED,以验证第一步。此外,FSBL 和应用程序位于同一二进制文件中。那么,让我们先从这个初始配置开始。

使用 STM32CubeMX 创建一个新项目,然后选择 [STM32N657X0H3Q]。选择使用 [仅限安全域] 的选项。

2.1.1 配置 LED 引脚

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

我们需要分配 FSBL 要使用的 GPIO

2.1.2 代码生成和编辑

在 [Project Manager] 选项卡中,确保选中 [FSBL] 复选框,并为您的首选工具链生成代码。

创建项目后,在主循环中添加以下两行:

  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
            HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin);
            HAL_Delay(100);
  }
  /* USER CODE END 3 */

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

进入调试模式并验证您的代码是否正常工作。现在您已经这样做了,我们需要添加 FSBL 标头以确保 boot ROM 能够从外部存储器读取和复制它。为此,我们将使用 STM32CubeProgrammer 的 CLI。接下来假设 STM32CubeProgrammer 安装在默认路径中,如果没有,请确保相应地调整它。

2.1.3 添加标头

为了方便这个过程,可以在二进制文件夹中键入 [cmd]。

例如..\LED_Toggle\STM32CubeIDE\FSBL\Debug 中。这将在所选路径中弹出 cmd,并且可以使用以下命令:

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

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

2.1.4 对二进制文件进行编程

确保 FLASH 存储器的外部加载器已启用,并使用地址 [0x7000 0000] 对二进制文件进行编程。

提示:如果单击 [开始编程] 时出现失败消息,您可能需要重新启动电路板。

2.1.5 验证

要验证整个过程是否有效,请断开与 STM32CubeProgrammer 的连接。然后将 BOOT1 切换到 0 并重置板子。这可确保引导 ROM 使用外部存储器,并且绿色 LED 应闪烁。

2.2 使用 FSBL Load&Run 应用程序的演示

现在,我们已经完成了从 FSBL 运行简单代码的过程,是时候实现第二个示例了。此示例包括让 FSBL 将应用程序内容从外部 FLASH 复制到内部 RAM,并从那里执行代码。

2.2.1 配置 XSPI 和 XSPIM

使用相同的 STM32CubeMX 项目,在左侧的 [Connectivity] 菜单下找到 [XSPIM],然后选择它在 [FSBL] 期间运行,并选择 [Direct] 模式:

OCTOSPI 闪存具有以下特性:1 Gbit、1.8 V、200 MHz、DTR、边写边读。它连接到 XSPI2 上 STM32N6570-DK 板上 STM32N657X0H3Q 微控制器的 OCTOSPI 接口。使用该信息,转到 XSPI2 以根据可用硬件配置外围设备:

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

2.2.2 配置 EXTMEM_MANAGER

下一步是在 [Categories] 中找到 [Middleware and Software Packs]。展开 [EXTMEM_MANAGER]。添加 FSBL 并使用以下设置将其激活:

[LRUN 源地址偏移] = 0x00100000

[LRUN 源代码大小] = 0x10000

[LRUN 目标地址] = 0x34000000

在 [Memory 1] 选项卡中,确保其如下:

2.2.3 配置 XSPI 时钟

XSPI 的最后一步是配置其 clock。在本例中,我们将 XPI2 clock 设置为 50MHz。要实现此串行 NOR 闪存支持的高达 200 MHz 的更高速度,您需要更改 OTP 以优化 IO 速度,本文未对此进行介绍,请参看另外一个篇文章。(如何对 STM32N6 的一次性可编程(OTP)熔丝位进行编程

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

2.2.4 代码生成和构建

现在我们已经完成了 XSPI,是时候在 [Project Manager] 选项卡中添加 [APPLI] 复选框了,以便创建应用程序项目:

并回滚到[引脚和配置]选项卡,更改要分配给应用程序的[GPIO] LED引脚,而不是FSBL:

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

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


在 FSBL 项目中,删除 main.c 文件中的上一个用户代码部分,该部分负责我们在第一次动手作中的 LED 切换。我肯定可以在 stm32_boot_lrun.c 中将 #define EXTMEM_HEADER_OFFSET 从 0x0 更改为 0x400,或者在 stm32_boot_lrun.h 中定义它。原因是我们的应用程序还具有脚本添加的 1 KB 标头。

2.2.5 添加标头并对二进制文件进行编程

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

FSBL 的:(fsbl) 过程对地址 0x7000 0000

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

应用:(appli) 过程对地址 0x7010 0000

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

使用 STM32CubeProgrammer 使用相同的过程对地址 0x7000 0000 的 FSBL 和地址 0x7010 0000 的应用程序进行编程。请记住将 STM32N6 的 BOOT1 设置为 HIGH,并在编程之前重置或重启电路板。

2.2.6 验证

要查看您的应用程序正在运行,请将 BOOT1 设置为 LOW,断开编程器并重新启动。现在,绿色 LED 闪烁,代码由自定义 FSBL 从外部 FLASH 复制到内部 RAM!

结论

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

在我们的 STM32 HotSpot github 页面> stm32-hotspot/STM32N6_FSBL_Modes 中上传了这篇文章的完整源代码,希望对您有所帮助。

我们在 HAL 驱动程序存储库中也有模板,假设默认安装文件夹,模板应该在这里> C:\Users\%username%\STM32Cube\Repository\STM32Cube_FW_N6_V1.0.0\Projects\STM32N6570-DK\Templates\Template_FSBL_LRUN

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐