如何使用 STM32N6 从外部 PSRAM 执行代码

总结

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

介绍

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

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

本文使用 STM32N6570-DK 作为其动手实践部分的基础,但内容可以针对任何特定的 STM32N6 硬件进行定制。该示例显示了直接从外部 PSRAM 运行的简单闪烁 LED。该示例将有两个二进制文件,一个用于 FSBL,另一个用于应用程序。该接头将被添加并在外部串行 NOR 闪存上编程。由 FSBL 将应用程序从外部 FLASH 复制到外部 PSRAM 并执行应用程序。

1. FSBL 主要特点

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

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

在此模式下,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 和应用程序:PSRAM 中的闪烁代码

2.1.1 配置 LED 引脚

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

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

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

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

2.1.2 配置 XSPI1、XSPI2 和 XSPIM

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

Octo-SPI 闪存具有以下特性:1 Gbit、1.8 V、200 MHz、DTR、边写边读。它连接到 XSPI2 上 STM32N6570-DK 板上 STM32N657X0H3Q 微控制器的 OCTOSPI 接口。

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

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

十六进制 SPI PSRAM 具有以下特性:256 Mbit/s、1.8 V、200 MHz、DDR。它连接到STM32N657X0H3Q的十六进制 SPI 接口,该接口与 XSPI1 相关联。使用该信息,转到 XSPI1 以根据可用硬件配置外围设备:

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

2.1.3 配置 EXTMEM_MANAGER

下一步是在 [Categories] 中找到 [Middleware and Software Packs],然后展开 [EXTMEM_MANAGER]。使用以下设置添加 [第一阶段引导加载程序] 和 [激活外部内存管理器] 复选框:

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

[XiP 标头大小] = 0x400

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

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

正确配置内存后,可以使用 [Boot usecase] 选项卡并添加 Load 和 Run 选项,从串行 FLASH NOR(内存 1)复制到外部 PSRAM(内存 2)。地址和偏移量如下所示:

2.1.4 配置 XSPI 时钟

XSPI 的最后一步是配置其 clock。在本例中,我们将 XPI clock 设置为 50 MHz。转到 [Clock Configuration] 选项卡,将 IC3 作为 XSPI2 的源,键入 50 并按 Enter 键以自动调整时钟:

2.1.5 MPU 配置

为了避免在复制过程中出现不需要的缓存活动,让我们为外部存储器配置 MPU。在 [System Core] 中找到 [CORTEX_M55_FSBL]。在 [仅后台区域特权访问 + 硬故障时禁用 MPU,NMI 和 FAULTMASK 处理程序] 中启用 MPU 控制模式。如果您需要有关 MPU 的更多详细信息,请在此处考虑这篇文章。

值得突出显示参考手册中的下表,其中显示了每个 XSPI 的映射地址:

利用这些信息以及 EXTMEM_MANAGER 上使用的偏移量,为外部串行 NOR FLASH 和 PSRAM 添加 MPU 区域。从串行 NOR FLASH 开始,它将被分配给区域 0:

为外部 PSRAM 添加区域 1:

2.1.6 生成代码

现在所有设置都已完成,是时候继续为两个项目生成代码了:

2.1.7 代码编辑和构建

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


 

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

并将为 Load 和 RUN 创建的默认链接器脚本更改为 ROMxpsi1.ld。这可以通过找到 [MCU/MPU GCC Linker][General] 并更改为 STM32N657X0HXQ_ROMxspi1.ld 来完成

在 _FSBL 项目中,找到 stm32_boot_lrun.c 文件并将定义 [EXTMEM_HEADER_OFFSET] 更改为 0x400,因为我们也将在应用程序中使用头脚本。

按 [Ctrl]+[B] 构建两个项目。

2.1.8 添加标头

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

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

请注意,此过程需要在 Appli 和 FSBL 项目上执行,因此以下是每个项目的命令(假设项目名称为 FSBL_PSRAM):

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

FSBL 的:

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

应用:

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

这是预期的输出:

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

2.1.9 对二进制文件进行编程

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

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

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

2.10 验证

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

结论

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

相关链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值