STM32N6 系列 MCU 因内置 SRAM 容量有限,面对大型应用代码时,需将程序部署到外部 PSRAM 中运行。但 PSRAM 作为外部存储器,调试流程与内部 SRAM/Flash 存在差异,核心难点在于需先通过 FSBL(第一阶段引导程序)将代码从外部 Flash 搬运到 PSRAM,再实现调试器连接。本文以 STM32N657X0H3Q 为例,详解基于 STM32CubeIDE 的 Attach 模式调试方案,无需复杂 GDB 命令,快速实现 PSRAM 上代码的单步调试、断点设置等功能。
资料获取:STM32N6在PSRAM上运行代码的调试
1. 核心原理与环境准备
1.1 调试核心逻辑
PSRAM 代码调试的关键是 “先运行后附加”:
- FSBL 与应用代码(Appli)烧录到外部 Flash(XSPI2);
- 开发板上电后,FSBL 自动将 Appli 代码从外部 Flash(0x70100000)搬运到 PSRAM(XSPI1,起始地址 0x90000000);
- 调试器通过 Attach 模式连接已运行的 MCU,加载符号表后即可调试 PSRAM 中的代码。
1.2 软硬件与工具环境
- 硬件:STM32N6570-DK 开发板、外部 PSRAM(连接 XSPI1)、外部 Flash(连接 XSPI2)、USB 调试线;
- 软件:STM32CubeIDE v1.18.1、STM32CubeProgrammer v2.20.0、STM32_SigningTool_CLI(代码签名工具);
- 基础工程:已实现 “Flash→PSRAM 代码搬运” 的 FSBL+Appli 工程(参考 ST Community 文档:https://community.st.com/t5/stm32-mcus/how-to-execute-code-from-the-externalpsram-using-the-stm32n6/ta-p/772691)。
1.3 关键地址定义
| 存储设备 | 起始地址 | 用途 |
|---|---|---|
| 外部 Flash(XSPI2) | 0x70000000 | 存储 FSBL 代码 |
| 外部 Flash(XSPI2) | 0x70100000 | 存储 Appli 代码(带 Header) |
| 外部 PSRAM(XSPI1) | 0x90000000 | PSRAM 起始地址 |
| 应用代码运行地址 | 0x90100400 | Appli 实际运行地址(跳过 Header) |
2. 分步实现流程
2.1 代码签名与烧录
(1)代码签名(添加 Header)
FSBL 与 Appli 代码需通过签名工具添加 Header,才能被 STM32N6 的引导程序识别,执行以下命令:
# 签名FSBL代码(输出带Header的bin文件)
STM32_SigningTool_CLI.exe -bin STM32N6_FSBL_PSRAM_FSBL.bin -nk -of 0x80000000 -t fsbl -o STM32N6_FSBL_PSRAM_FSBL-trusted.bin -hv 2.3 -dump
# 签名Appli代码
STM32_SigningTool_CLI.exe -bin STM32N6_FSBL_PSRAM_Appli.bin -nk -of 0x80000000 -t fsbl -o STM32N6_FSBL_PSRAM_Appli-trusted.bin -hv 2.3 -dump
- 输出文件:
STM32N6_FSBL_PSRAM_FSBL-trusted.bin(签名后 FSBL)、STM32N6_FSBL_PSRAM_Appli-trusted.bin(签名后 Appli)。
(2)烧录到外部 Flash
- 开发板 BOOT 配置为 DEV boot 模式(BOOT0=X,BOOT1=H);
- 打开 STM32CubeProgrammer,连接开发板;
- 烧录配置:
- FSBL:烧录地址
0x70000000,选择签名后的 FSBL 文件; - Appli:烧录地址
0x70100000,选择签名后的 Appli 文件;
- FSBL:烧录地址
- 烧录完成后,断开连接,关闭开发板电源。
(3)验证代码运行
- 切换 BOOT 模式为 Flash boot(BOOT0=L,BOOT1=L);
- 上电后观察开发板 LED1 闪烁,说明 FSBL 已成功将 Appli 搬运到 PSRAM 并运行。
2.2 STM32CubeIDE 调试配置
(1)创建 Debug Configuration
- 打开 STM32CubeIDE,选中 Appli 工程,右键选择「Debug Configurations...」;
- 双击「STM32 C/C++ Application」,创建新配置(命名如
STM32N6_FSBL_PSRAM_Appli_Attach)。
(2)配置 Debugger 页面
- 切换到「Debugger」标签页;
- 复位设置:选择「Reset behaviour」为「None」(不复位 MCU,避免中断已运行的代码);
- 取消勾选「Verify flash download」(无需重新下载代码);
- 保持其他默认配置,点击「Apply」。
(3)配置 Startup 页面(关键步骤)
- 切换到「Startup」标签页;
- 加载符号表:
- 在「Load Image and Symbols」中,选中
Debug/STM32N6_FSBL_PSRAM_Appli.elf; - 点击「Edit」,取消勾选「Download」(无需下载代码),点击「OK」,此时「Download」列显示「false」;
- 在「Load Image and Symbols」中,选中
- 配置运行时选项:
- 勾选「Specify vector table address」,输入
0x90100400(Appli 在 PSRAM 中的实际起始地址,跳过 Header);
- 勾选「Specify vector table address」,输入
- 点击「Apply」保存配置。
2.3 启动 Attach 调试
(1)开发板准备
- 确保开发板已上电,LED1 闪烁(Appli 正常运行);
- 保持 BOOT 模式为 Flash boot(BOOT0=L,BOOT1=L)。
(2)连接调试器
- 点击 STM32CubeIDE 工具栏的「Debug」按钮(或配置页面点击「Debug」);
- 调试器将自动 Attach 到运行中的 MCU,加载符号表后,程序指针会停在
main函数入口; - 验证地址:在「Disassembly」窗口中,可看到当前地址为
0x901007e8左右(PSRAM 地址区间),确认调试目标正确。
(3)正常调试操作
- 单步调试:使用「Step Over」「Step Into」按钮逐行执行代码;
- 断点设置:在代码行左侧点击设置断点,程序运行到断点处会自动暂停;
- 变量查看:在「Variables」窗口中查看全局变量、局部变量的值;
- 内存查看:通过「Memory」窗口输入 PSRAM 地址(如
0x90100400),查看代码或数据存储情况。
3. 关键避坑事项
- 代码签名不可少:未签名的 FSBL 和 Appli 无法被 STM32N6 引导程序识别,导致代码搬运失败;
- 地址配置准确:向量表地址必须设为
0x90100400(跳过 400 字节 Header),否则调试器无法定位代码; - 复位设置为 None:若选择其他复位模式,会中断已运行的代码,导致 Attach 失败;
- 烧录地址正确:FSBL 和 Appli 需分别烧录到
0x70000000和0x70100000,地址错误会导致 FSBL 无法找到 Appli; - 开发板上电顺序:需先让代码运行(LED 闪烁),再启动调试,否则 Attach 会失败。
4. 常见问题排查
4.1 Attach 失败,提示 “无法连接目标”
- 排查:开发板是否上电、LED 是否闪烁;USB 调试线是否连接正常;BOOT 模式是否为 Flash boot;
- 解决:重新插拔 USB 线,确认开发板正常运行后再启动调试。
4.2 断点无效或程序跑飞
- 排查:向量表地址是否正确(
0x90100400);符号表是否加载成功(STM32N6_FSBL_PSRAM_Appli.elf路径是否正确); - 解决:重新配置 Startup 页面的向量表地址,确认.elf 文件路径无误。
4.3 无法查看变量值
- 排查:编译时是否生成调试信息(工程配置中「Debug Info」设为「DWARF with dwo」);
- 解决:在工程属性→「C/C++ Build」→「Settings」→「Tool Settings」→「MCU GCC Compiler」→「Debugging」,确保勾选「Generate debug information」。
STM32N6 PSRAM 代码调试的核心是 “Attach 模式 + 符号表加载”,无需复杂的 GDB 命令或引导程序修改,仅需通过 STM32CubeIDE 的配置即可实现。该方案的关键是确保代码先在 PSRAM 中正常运行,再通过调试器附加连接,精准配置向量表地址和符号表路径。
此方法适用于所有 STM32N6 系列 MCU 的外部存储器调试(如外部 Flash XIP 调试),无需依赖特定硬件,通用性强,可帮助开发者快速定位 PSRAM 上代码的逻辑错误,提升大型应用的开发效率。
阅读全文
242