扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

STM32N6 PSRAM 代码调试实操:Attach模式实现外部存储器调试

2小时前
242
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

STM32N6 系列 MCU 因内置 SRAM 容量有限,面对大型应用代码时,需将程序部署到外部 PSRAM 中运行。但 PSRAM 作为外部存储器,调试流程与内部 SRAM/Flash 存在差异,核心难点在于需先通过 FSBL(第一阶段引导程序)将代码从外部 Flash 搬运到 PSRAM,再实现调试器连接。本文以 STM32N657X0H3Q 为例,详解基于 STM32CubeIDE 的 Attach 模式调试方案,无需复杂 GDB 命令,快速实现 PSRAM 上代码的单步调试、断点设置等功能。

资料获取:STM32N6在PSRAM上运行代码的调试

1. 核心原理与环境准备

1.1 调试核心逻辑

PSRAM 代码调试的关键是 “先运行后附加”:
  1. FSBL 与应用代码(Appli)烧录到外部 Flash(XSPI2);
  2. 开发板上电后,FSBL 自动将 Appli 代码从外部 Flash(0x70100000)搬运到 PSRAM(XSPI1,起始地址 0x90000000);
  3. 调试器通过 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

  1. 开发板 BOOT 配置为 DEV boot 模式(BOOT0=X,BOOT1=H);
  2. 打开 STM32CubeProgrammer,连接开发板;
  3. 烧录配置:
    • FSBL:烧录地址0x70000000,选择签名后的 FSBL 文件;
    • Appli:烧录地址0x70100000,选择签名后的 Appli 文件;
  4. 烧录完成后,断开连接,关闭开发板电源

(3)验证代码运行

  1. 切换 BOOT 模式为 Flash boot(BOOT0=L,BOOT1=L);
  2. 上电后观察开发板 LED1 闪烁,说明 FSBL 已成功将 Appli 搬运到 PSRAM 并运行。

2.2 STM32CubeIDE 调试配置

(1)创建 Debug Configuration

  1. 打开 STM32CubeIDE,选中 Appli 工程,右键选择「Debug Configurations...」;
  2. 双击「STM32 C/C++ Application」,创建新配置(命名如STM32N6_FSBL_PSRAM_Appli_Attach)。

(2)配置 Debugger 页面

  1. 切换到「Debugger」标签页;
  2. 复位设置:选择「Reset behaviour」为「None」(不复位 MCU,避免中断已运行的代码);
  3. 取消勾选「Verify flash download」(无需重新下载代码);
  4. 保持其他默认配置,点击「Apply」。

(3)配置 Startup 页面(关键步骤)

  1. 切换到「Startup」标签页;
  2. 加载符号表:
    • 在「Load Image and Symbols」中,选中Debug/STM32N6_FSBL_PSRAM_Appli.elf
    • 点击「Edit」,取消勾选「Download」(无需下载代码),点击「OK」,此时「Download」列显示「false」;
  3. 配置运行时选项:
    • 勾选「Specify vector table address」,输入0x90100400(Appli 在 PSRAM 中的实际起始地址,跳过 Header);
  4. 点击「Apply」保存配置。

2.3 启动 Attach 调试

(1)开发板准备

  1. 确保开发板已上电,LED1 闪烁(Appli 正常运行);
  2. 保持 BOOT 模式为 Flash boot(BOOT0=L,BOOT1=L)。

(2)连接调试器

  1. 点击 STM32CubeIDE 工具栏的「Debug」按钮(或配置页面点击「Debug」);
  2. 调试器将自动 Attach 到运行中的 MCU,加载符号表后,程序指针会停在main函数入口;
  3. 验证地址:在「Disassembly」窗口中,可看到当前地址为0x901007e8左右(PSRAM 地址区间),确认调试目标正确。

(3)正常调试操作

  • 单步调试:使用「Step Over」「Step Into」按钮逐行执行代码;
  • 断点设置:在代码行左侧点击设置断点,程序运行到断点处会自动暂停;
  • 变量查看:在「Variables」窗口中查看全局变量、局部变量的值;
  • 内存查看:通过「Memory」窗口输入 PSRAM 地址(如0x90100400),查看代码或数据存储情况。

3. 关键避坑事项

  1. 代码签名不可少:未签名的 FSBL 和 Appli 无法被 STM32N6 引导程序识别,导致代码搬运失败;
  2. 地址配置准确:向量表地址必须设为0x90100400(跳过 400 字节 Header),否则调试器无法定位代码;
  3. 复位设置为 None:若选择其他复位模式,会中断已运行的代码,导致 Attach 失败;
  4. 烧录地址正确:FSBL 和 Appli 需分别烧录到0x700000000x70100000,地址错误会导致 FSBL 无法找到 Appli;
  5. 开发板上电顺序:需先让代码运行(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 上代码的逻辑错误,提升大型应用的开发效率。

相关推荐