STM32N6 无内部 Flash,XIP 应用需在外部 Flash 直接运行,但 KEIL 直接调试会因 XSPI 未配置内存映射失败。核心解决方案:通过App.ini脚本先加载 FSBL 完成 XIP 配置,再调试应用,全程无需切换 Boot 模式,仅需 Dev 模式即可实现断点、单步等完整调试功能。
资料获取:开发经验 | LAT1575 使用KEIL IDE调试STM32N6芯片XIP的一种方法
1. 问题背景:XIP 应用调试的核心痛点
1.1 STM32N6 XIP 启动流程
外部 Flash 启动时,系统需经历 “BootROM→FSBL→应用” 三级跳转:
- BootROM:初始化基础硬件,加载 FSBL 到 RAM;
- FSBL:配置 XSPI 为内存映射(XIP)模式,映射外部 Flash 到地址空间;
- 应用:从外部 Flash 直接运行(XIP),无需拷贝到 RAM。
1.2 直接调试的致命问题
KEIL 直接调试 XIP 应用时,会跳过 FSBL 执行:
- XSPI 未配置内存映射,KEIL 无法读取外部 Flash 中的应用代码;
- 调试器无法挂载,或挂载后无法设置断点、执行代码,调试失败。
1.3 传统方案的弊端
传统方法需烧录 FSBL 和应用到外部 Flash,手动切换 Boot 模式(Dev→外部 Flash)并复位,操作繁琐且易出错,效率极低。
2. 实操方案:4 步实现 KEIL XIP 调试(以 Template_FSBL_XIP 为例)
2.1 步骤 1:修改 FSBL,仅保留 XIP 配置功能
核心是屏蔽 FSBL 的应用跳转逻辑,仅让其完成 XSPI 内存映射配置:
- 用 KEIL 打开
Template_FSBL_XIP工程; - 找到
STM32_ExtMem_Manager中的stm32_boot_xip.c文件; - 修改
BOOT_Application函数,注释跳转代码: - 编译 FSBL,生成
FSBL.axf(路径:Template_FSBL_XIPMDK-ARMFSBLObjects)。
2.2 步骤 2:创建 App.ini 脚本,自动加载 FSBL + 应用
App.ini是 KEIL 调试初始化脚本,用于自动完成 FSBL 加载、配置执行和应用挂载:
- 在应用工程目录(
Template_FSBL_XIPMDK-ARMAppli)创建App.ini文件; - 写入以下脚本(核心逻辑:加载 FSBL→执行配置→加载应用→跳转到 main):
2.3 步骤 3:配置应用工程,关联 App.ini 脚本
- 打开应用工程的调试配置:「Project」→「Options for Target」→「Debug」选项卡;
- 调试器选择「ST-Link Debugger」,点击「Settings」确认连接正常;
- 勾选「Initialization File」,选择步骤 2 创建的
App.ini; - 取消勾选「Load Application at Startup」(避免 KEIL 直接加载应用,跳过 FSBL);
- (可选)优化编译选项:将「Optimization」改为
-O0(禁用优化,方便设置断点)。
2.4 步骤 4:烧录应用 + 启动调试
- 编译应用工程,生成
Appli.bin; - 用 STM32CubeProgrammer 将
Appli.bin烧录到外部 Flash(起始地址:0x70100000); - 将 STM32N6570-DK 板设置为「Dev 模式」,上电;
- 点击 KEIL 的「Start Debug Session」,自动执行以下流程:
- 加载并运行 FSBL,完成 XSPI XIP 配置;
- 加载应用,自动跳转到
main函数;
- 调试功能正常:可设置断点、单步执行、查看内存 / 寄存器,与常规 RAM 调试无差异。
3. 关键原理解析
3.1 App.ini 脚本核心指令作用
LOAD .axf INCREMENTAL:增量加载镜像,保留之前的硬件配置;_RDWORD(地址):读取指定地址的 32 位数据(获取 FSBL / 应用入口地址);G:运行程序,G,main:运行到 main 函数暂停;CLEAR INCREMENTAL:清除之前的调试状态,重新加载应用。
3.2 入口地址说明
- FSBL 入口地址:0x34180400(RAM 中 FSBL 起始地址),+4 是跳过向量表,直接执行代码;
- 应用入口地址:0x70100400(外部 Flash 应用起始地址),+4 同样是跳过向量表。
4. 开发经验小结
- FSBL 修改原则:仅保留 XIP 配置(
MapMemory函数),屏蔽跳转,避免覆盖应用代码; - 脚本路径注意:
App.ini中FSBL.axf和Appli.axf的路径需与工程实际路径一致,否则加载失败; - 编译优化建议:调试阶段禁用优化(
-O0),避免断点失效或代码执行顺序异常; - 签名说明:调试阶段可跳过 FSBL 和应用的签名(加快测试速度),量产阶段必须按要求签名;
- 通用性:该方法适用于所有 STM32N6 XIP 应用,仅需调整 FSBL / 应用的入口地址和 Flash 起始地址。
阅读全文
297