1. 方案设计目标与前提条件
本方案的设计目标是:在STM32N6平台上,使用STM32CubeIDE在DEV模式下直接调试XIP应用,不需要切换Boot模式。相比传统需要切换Boot模式并按复位的调试方法,本方案省去了硬件操作步骤,调试设置完成后可以直接启动调试会话。
方案的前提条件包括:
- 硬件:STM32N6570-DK开发板,或基于STM32N6且外部Flash电路兼容的目标板
- 软件:STM32CubeIDE V1.18.1及以上版本,STM32Cube_FW_N6_V1.3.0固件包,STM32CubeProgrammer
- 工程:基于Template_FSBL_XIP参考工程,或结构兼容的自定义工程
- 启动模式:仅以外部Flash启动模式为例,其他启动模式未涉及
方案不涉及的内容包括:其他启动模式下的调试方法、ExtMemLoader子工程的使用、生产环境中的固件加密与安全启动配置。
资料获取:实战经验 | LAT1721 使用STM32CubeIDE调试STM32N6 XIP应用的一种方法
2. 开发环境搭建
在开始调试前,需要完成开发环境的搭建。
硬件准备:将STM32N6570-DK开发板通过USB线连接到PC,确保开发板供电正常。开发板上的ST-LINK调试器用于STM32CubeIDE与目标芯片之间的调试通信。
软件安装:从ST官网下载并安装STM32CubeIDE,版本要求V1.18.1或更高。安装过程中确保包含STM32N6系列的设备支持包。同时安装STM32CubeProgrammer,用于将Application固件烧录到外部Flash。
固件包获取:下载STM32Cube_FW_N6_V1.3.0固件包并解压。Template_FSBL_XIP工程位于固件包的Projects\STM32N6570-DK\Templates\Template_FSBL_XIP目录下。
工程导入:在STM32CubeIDE中通过File → Open Projects from File System导入Template_FSBL_XIP工程。导入后在工程浏览窗口可以看到三个子工程:Template_FSBL_XIP_AppS(应用程序)、Template_FSBL_XIP_FSBL(第一阶段引导程序)和ExtMemLoader(外部存储器加载器,本文不做讨论)。
3. Step1:编译FSBL子工程
第一步是编译FSBL子工程。在STM32CubeIDE的工程浏览窗口中,找到Template_FSBL_XIP_FSBL子工程,右键单击该工程,在弹出的菜单中选择Build Project进行编译。
编译完成后,在Template_FSBL_XIP\STM32CubeIDE\Boot\Debug目录下会生成以下文件:
- bin:FSBL的二进制镜像文件
- out:FSBL的ELF格式文件,包含符号表与调试信息
其中Template_FSBL_XIP_FSBL.out文件将在后续的Debug配置中通过GDB的load命令加载,用于在调试过程中执行FSBL代码。编译FSBL是整个调试流程的基础,因为后续的GDB脚本依赖FSBL的elf文件与符号地址。
4. Step2:编译与烧录Application
第二步是编译Application子工程并将其烧录到外部Flash。
Application的编译与FSBL类似。在工程浏览窗口中右键单击Template_XIP_AppS子工程,菜单选择Build Project即可。编译完成后,在\Template_FSBL_XIP\STM32CubeIDE\AppS\Debug目录下会生成Template_XIP_AppS.bin和Template_XIP_AppS.elf等文件。
编译完成后,需要将生成的bin文件烧录到外部Flash。使用STM32CubeProgrammer连接开发板,在Erasing & Programming界面中选择Template_XIP_AppS.bin文件,将Start address设置为0x7010400,点击Start programming开始烧录。烧录完成后,Application固件就存储在外部Flash的指定地址处,等待调试时由FSBL跳转执行。
需要强调的是,Application的烧录地址0x7010400必须与应用程序链接脚本中指定的运行地址一致。如果地址不匹配,调试时函数调用与变量访问将出现错误。
5. Step3:Application Debug配置详解
第三步是配置Application的Debug设置。在STM32CubeIDE中,右键单击Template_XIP_AppS工程,选择Debug As → Debug Configurations进入调试配置界面。
对于Main、Debugger、Source、Common设置页,本文不做修改,保持默认即可。例如Debugger设置页保持默认配置,调试器会自动识别ST-LINK并连接目标芯片。
配置的重点在Startup选项页。在配置界面的Initialization Commands子窗口中,需要添加以下GDB初始化命令:
load "../Boot/Debug/Template_XIP_FSBL.elf"
set {uint32_t}0xE000ED08 = 0x34180400
break *0x34180810
continue
break main
这五条命令的作用已在2.5节详细解析。简单来说,它们让调试器在启动时先加载FSBL符号表、设置向量表指向FSBL、在FSBL跳转应用前断点暂停、运行至该断点、然后在应用main函数处设断点。
在“Load Image and Symbols”选项设置中,不需要下载代码(因为Application已经通过STM32CubeProgrammer烧录到外部Flash),但需要加载符号表。符号表的加载让调试器能够显示应用程序中的函数名与变量名。具体操作是在该选项区域中,将Template_XIP_AppS.elf条目的Download列设为false,Load symb.列设为true。
在Runtime选项设置中,可以取消“Set breakpoint at main”选项,因为前面的GDB初始化命令脚本中已经通过break main语句设置了main函数断点。如果保留该选项,可能会导致重复断点。对于其他常规选项,可自行根据需要进行配置。
6. Step4:启动调试会话与断点管理
前面的Debug设置完成后,即可选择Template_XIP_AppS开始调试。点击Debug按钮后,STM32CubeIDE开始Debug会话,调试器按照GDB初始化脚本的顺序执行:先加载FSBL符号表,设置向量表,在JumpToApplication地址设断点并运行,FSBL执行完成XSPI配置后在跳转应用前暂停,随后加载应用符号表并在main函数入口处停下。
调试会话启动后,开发者可以像调试普通应用一样进行单步执行、查看变量、查看寄存器等操作。但有一个关键点需要特别注意:对于处于外部Flash上的断点,需要将其改为硬断点。
修改断点类型的操作步骤如下:
- 在断点列表子窗口(Breakpoints)中,找到需要修改的断点
- 右键单击该断点,选择“Breakpoint Properties”进入断点属性设置窗口
- 在Common选项卡中,将Type从默认的Software改为Hardware或Hardware Temporary
- 点击Apply and Close保存设置
完成硬断点设置后,就可以正常使用IDE进行Application子工程的调试了。在外部Flash地址上设置的断点会通过Cortex-M55的FPB单元触发,不依赖修改外部Flash中的指令。
7. 常见问题与排查
在实施本方案的过程中,可能遇到以下常见问题:
问题一:调试会话无法启动或连接失败。排查方向:确认STM32CubeIDE版本不低于V1.18.1;检查ST-LINK驱动是否正常安装;确认开发板供电正常且调试接口连接可靠;确认FSBL子工程已成功编译,elf文件存在于指定路径。
问题二:调试器停在错误位置或无法到达main函数。排查方向:检查GDB初始化脚本中的地址是否正确(0x34180400和0x34180810),这些地址来自FSBL工程的map文件,如果FSBL重新编译且链接配置有变化,地址可能不同;确认Application已正确烧录到0x7010400;确认向量表设置命令已正确执行。
问题三:外部Flash上的断点不生效。排查方向:确认断点类型已改为Hardware或Hardware Temporary;软断点在外部Flash上无法生效,这是由外部Flash只读特性决定的;确认断点地址在外部Flash的映射范围内。
问题四:FSBL执行失败或XSPI未配置。排查方向:确认FSBL编译时使用的配置与目标板硬件匹配;确认外部Flash型号与FSBL中的驱动兼容;通过在FSBL中设置断点单步执行,定位FSBL失败的具体位置。
8. 方案适用边界
在使用本方案时,需要明确其适用边界:
- 本文方法仅适用于外部Flash启动模式下的XIP应用调试。其他启动模式(如从内部SRAM启动、从其他外部存储器启动)不在本文讨论范围内。
- 方案基于Template_FSBL_XIP参考工程进行说明。对于自定义工程,需要根据实际的链接脚本与地址配置调整GDB脚本中的地址参数。
- ExtMemLoader子工程不在本文讨论范围内。ExtMemLoader通常用于STM32CubeProgrammer对外部Flash的烧录支持,与应用调试无直接关系。
- 方案假设Application固件已预先烧录到外部Flash。调试器本身不负责Application的下载,这一点与常规的片内Flash调试不同。
- 方案在DEV模式下工作,依赖DEV模式下DBG端口打开的硬件特性。如果芯片处于其他启动模式且DBG端口被关闭,本方案无法使用。
184