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

STM32N6 KEIL 调试 XIP:无需切换 Boot 模式,通过 FSBL 预配置实现高效调试

12/23 09:36
297
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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 内存映射配置:

  1. 用 KEIL 打开Template_FSBL_XIP工程;
  2. 找到STM32_ExtMem_Manager中的stm32_boot_xip.c文件;
  3. 修改BOOT_Application函数,注释跳转代码:
    BOOTStatus_TypeDef BOOT_Application(void) {
      BOOTStatus_TypeDef retr;
      /* 执行内存映射(关键:配置XSPI为XIP模式) */
      retr = MapMemory();
      if (BOOT_OK == retr) {
        // 注释跳转代码,仅保留配置
        // retr = JumpToApplication();
      }
      return retr;
    }
    
  4. 编译 FSBL,生成FSBL.axf(路径:Template_FSBL_XIPMDK-ARMFSBLObjects)。

2.2 步骤 2:创建 App.ini 脚本,自动加载 FSBL + 应用

App.ini是 KEIL 调试初始化脚本,用于自动完成 FSBL 加载、配置执行和应用挂载:

  1. 在应用工程目录(Template_FSBL_XIPMDK-ARMAppli)创建App.ini文件;
  2. 写入以下脚本(核心逻辑:加载 FSBL→执行配置→加载应用→跳转到 main):
    // 1. 加载FSBL.axf,增量链接
    LOAD ...FSBLObjectsFSBL.axf INCREMENTAL
    // 2. 设置PC为FSBL入口地址(0x34180400+4,跳过向量表)
    PC = _RDWORD(0x34180404);
    // 3. 运行FSBL,完成XSPI XIP配置
    G
    // 4. 加载应用(Appli.axf),清除之前的调试状态
    LOAD .ObjectsAppli.axf CLEAR INCREMENTAL
    // 5. 设置PC为应用入口地址(外部Flash应用起始地址+4)
    PC = _RDWORD(0x70100404);
    // 6. 跳转到main函数,开始调试
    G,main
    

2.3 步骤 3:配置应用工程,关联 App.ini 脚本

  1. 打开应用工程的调试配置:「Project」→「Options for Target」→「Debug」选项卡;
  2. 调试器选择「ST-Link Debugger」,点击「Settings」确认连接正常;
  3. 勾选「Initialization File」,选择步骤 2 创建的App.ini
  4. 取消勾选「Load Application at Startup」(避免 KEIL 直接加载应用,跳过 FSBL);
  5. (可选)优化编译选项:将「Optimization」改为-O0(禁用优化,方便设置断点)。

2.4 步骤 4:烧录应用 + 启动调试

  1. 编译应用工程,生成Appli.bin
  2. 用 STM32CubeProgrammer 将Appli.bin烧录到外部 Flash(起始地址:0x70100000);
  3. 将 STM32N6570-DK 板设置为「Dev 模式」,上电;
  4. 点击 KEIL 的「Start Debug Session」,自动执行以下流程:
    • 加载并运行 FSBL,完成 XSPI XIP 配置;
    • 加载应用,自动跳转到main函数;
  5. 调试功能正常:可设置断点、单步执行、查看内存 / 寄存器,与常规 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. 开发经验小结

  1. FSBL 修改原则:仅保留 XIP 配置(MapMemory函数),屏蔽跳转,避免覆盖应用代码;
  2. 脚本路径注意:App.iniFSBL.axfAppli.axf的路径需与工程实际路径一致,否则加载失败;
  3. 编译优化建议:调试阶段禁用优化(-O0),避免断点失效或代码执行顺序异常;
  4. 签名说明:调试阶段可跳过 FSBL 和应用的签名(加快测试速度),量产阶段必须按要求签名;
  5. 通用性:该方法适用于所有 STM32N6 XIP 应用,仅需调整 FSBL / 应用的入口地址和 Flash 起始地址。

相关推荐