本教程是在 STM32N6 上对外部串行闪存中的代码进行调试的全面指南。
它涵盖以下内容:环境搭建、调试器配置以及设置验证。
1.引言
调试核心逻辑
- 内存映射模式: 需将外部存储器设置为内存映射模式。通过运行于 AXI-SRAM2 的 FSBL(第一阶段引导程序)作为调试入口,该程序负责初始化 XSPI 接口、启用内存映射模式,并跳转至外部存储器中的应用代码。
- 断点限制: 在 FSBL 执行前,无法在外部存储器的应用代码中设置断点(因外部存储器尚未配置为内存映射模式),需在 FSBL 完成配置后再启用断点。
2. 软件与硬件准备
-
软件要求
- 安装 STM32CubeMX(6.13 及以上版本)
- 安装 STM32N6 系列 HAL 驱动(最新版本)
- 安装 STM32CubeProgrammer(2.18 及以上版本)
- 安装 STM32CubeIDE(1.17.0 及以上版本)
-
硬件配置(以 STM32N6570-DK 开发板为例)
- 断开开发板与电脑的连接(通过 CN6 接口)。
- 将 BOOT0 设置为低电平(L),BOOT1 设置为高电平(H),进入 DEV BOOT 模式。
- 将 JP2 跳线帽设为 1-2 位置(5V-STLINK 供电)。
- 重新连接开发板与电脑。
3. 调试说明
FSBL 将是我们进行调试的入口点,但我们必须将所有项目放在同一个工作区中,以便在调试器配置中能看到 *.elf 文件。以下步骤展示了如何添加 XIP 模板,该模板将用于演示此过程。该模板位于:
C:\Users\%username%\STM32Cube\Repository\STM32Cube_FW_N6_V1.1.1\Projects\STM32N6570-DK\Templates\Template_FSBL_XIP\STM32CubeIDE
3.1 Step 1: 打开STM32CubeIDE 软件
通过 STM32CubeIDE 的 文件 > 从文件系统打开项目 功能,导入模板路径下的项目:
C:\Users\%username%\STM32Cube\Repository\STM32Cube_FW_N6_V1.1.1\Projects\STM32N6570-DK\Templates\Template_FSBL_XIP\STM32CubeIDE
3.2 Step 2: 工程设置
该路径包含三个项目:FSBL(引导程序)、AppS(应用程序)和 ExtMemLoader(外部存储器加载器)。此示例将重点关注 FSBL(引导加载程序)和 AppS(应用程序)。
外部内存加载器(ExtMemLoader)的主要目的是提供一个自定义的外部加载器文件.这个工程是可选的,因为 STM32CubeProgrammer 已经包含了一个可用的 *.stldr 文件:
3.3 步骤 3:添加Postbuild 命令和编译
添加构建后步骤(Post Build Step)
- 针对 FSBL 和 AppS 项目,需在编译后通过签名工具对二进制文件进行处理。
- 操作路径:
在项目资源管理器中右键点击项目 → 属性(Properties) → C/C++ 构建(C/C++ Build) → 构建后步骤(Post-build Steps) → Shell命令(Shell Command)。
cd "${ProjDirPath}/Debug" && echo y | "C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\STM32_SigningTool_CLI.exe" -bin "${ProjName}.bin" -nk -of 0x80000000 -t fsbl -o "${ProjName}-Trusted.bin" -hv 2.3 -dump "${ProjName}-Trusted.bin"
已知限制:ExtMemLoader 当前的构建后脚本可能需要管理员权限才能包含 *.stldr 文件,如果你看到此消息:
可以用这个命令来替换构建后操作:
cp "${BuildArtifactFileBaseName}.elf" "../CustomN6.stldr”
这将在项目文件夹内创建 CustomN6.stldr 文件:
3.4 步骤 4:配置调试器
两个工程都需要配置调试器和运行器。
. 右击 [Template_XIP_FSBL] ,选择 [Debug As] -> [Debug Configurations...]:
在 [调试配置] 窗口中,转到 [调试器] 选项卡。然后,[添加] 以下外部加载器 MX66UW1G45G_STM32N6570 - DK.stldr:
- 勾选[启用],取消勾选[初始化]。
- 也可以使用 CustomN6.stldr。为此,在[外部加载器]窗口中,选择[工作区…]并找到 CustomN6.stldr。
3.5 步骤 5:启动配置
转到【启动】选项卡并添加 AppS 项目。确保取消勾选【执行构建】和【下载】。
- 要将应用程序(AppS)编程到外部串行闪存中,请点击[添加...]并指向已签名的二进制文件。该文件将位于调试文件夹中,文件名为项目名称 - Trusted.bin。确保同时添加指向外部存储器的地址 0x70100000:
C:\Users\%username%\STM32Cube\Repository\STM32Cube_FW_N6_V1.1.1\Projects\STM32N6570-DK\Templates\Template_FSBL_XIP\STM32CubeIDE\AppS\Debug\Template_XIP_AppS-Trusted.bin
- 由于设置断点存在限制,我们将把第一个断点设置在 FSBL 函数调用 BOOT_Application 处,而不是通常的 main 函数处。现在,在 FSBL 固件中,XSPI 已将外部存储器配置为内存映射模式:
最终的视图应该是这样的:
- 点击【应用】和【关闭】。配置和调试现已准备好运行。
3.6 Step 6: 开发板的准备
- 断开开发板和PC主机的连接
- 将 BOOT1 开关拨到 H 位置,同时将 BOOT0 开关保持在 L 位置,以进入设备引导(DEV BOOT)模式。
3.7 步骤 7:开始调试
- 将开发板连接到计算机,然后在集成开发环境(IDE)中点击[调试]。如果所有步骤都已成功完成,运行应用程序时应会在 BOOT_Application 函数中设置的断点处暂停:
- 代码从在 AXISRAM2 内的某个地址运行的 FSBL 应用程序开始。代码在此处停止后,按 [继续]。开发板上的绿色 LED 应开始闪烁。
- 通过暂停代码,可以注意到它正在从外部闪存运行。这可以通过检查调用栈中的函数地址来验证。此时,可以使用所有标准调试功能。这些功能包括断点、变量、寄存器和内存视图。
提示:如果在点击进入调试模式时出现失败信息,你可能需要对开发板进行断电重启操作。此外,如果在不同的调试会话之间保留了现有的断点,你也会收到失败信息。
4.处理重新编程错误
当你使用预编程的外部存储器进入调试模式时,可能会出现错误消息。如果发生这种情况,请对开发板进行电源循环操作(断开与计算机的连接,然后重新连接)。这是由于所提供的默认 *.stldr 文件存在一个小错误,该错误将在未来的版本中得到修正。为避免此问题,可以在 stm32_sfdp_driver.c 文件的 EXTMEM_DRIVER_NOR_SFDP_DeInit 函数中添加以下几行:
#ifdef STM32_EXTMEMLOADER_STM32CUBETARGET
memory_mapmode(DISABLE);
#endif
重新构建外部内存加载器(ExtMemLoader),并使用 CustomN6.stldr 替代它。
结论
通过遵循这些步骤,你可以成功调试在 STM32N6 上从外部闪存运行的代码。本教程提供了一种实用的方法,包括设置环境、配置调试器以及验证设置。
References
Getting started with STM32CubeN6 for STM32N6 series - User manual
How to proceed with boot ROM on STM32N6 MCUs - User manual
Discovery kit with STM32N657X0 MCU - User manual
STM32N647/657xx Arm<Sup>®</Sup>-based 32-bit MCUs - Reference manual