扫码加入

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

RT1170 MDK RAM 代码烧录外部Flash实操:非XIP镜像的Flash部署方案

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

NXP RT1170 的 MDK RAM 工程为非 XIP(就地执行)镜像,默认仅能下载到芯片 RAM 中调试,无法直接烧录到外部 Flash。实际开发中若需将 RAM 代码部署到外部 QSPI Flash 并实现独立启动,需通过工程地址偏移配置、镜像文件生成、专用工具烧录三步实现。本文基于 RT1170-EVK 开发板与 MDK-ARM 环境,详解 RAM 代码适配外部 Flash 的完整流程,包含工程配置、镜像生成、MCUBootUtility 烧录及启动模式切换,实现 RAM 代码在外部 Flash 的稳定运行。

资料获取:如何下载RT1170 MDK RAM代码到外部flash

1. 核心原理与环境准备

1.1 RAM 代码烧录 Flash 的核心逻辑

RT1170 的 RAM 工程(none-xip)与 XIP 工程的核心区别在于运行介质与地址映射
  • RAM 工程:代码编译后指向片内 RAM 地址(如 ITCM 0x20000000),无 Flash 启动相关的 IVT/FCB 配置,IDE 仅支持下载到 RAM 调试;
  • Flash 烧录适配:通过修改工程链接地址偏移栈 / 程序入口地址,生成可被 Flash 烧录工具识别的 bin/hex 镜像,再通过专用工具将镜像写入外部 QSPI Flash,最后切换芯片启动模式为 Flash 启动,实现代码从外部 Flash 加载到 RAM 运行。

1.2 关键特性说明

  • 非 XIP 特性不变:代码最终仍运行在片内 RAM,外部 Flash 仅作为存储介质,而非运行介质;
  • IVT 偏移规则:RT1170 的非 XIP 镜像 IVT(镜像向量表)默认偏移 0x400,因此需将 APP 镜像入口地址偏移至 0x2000(避开 IVT 区域);
  • ITCM 地址基础:RT1170 的 ITCM(指令紧耦合内存)默认大小 256KB(0x40000),为代码运行的核心 RAM 区域,工程配置需基于该地址。

1.3 软硬件环境准备

  • 硬件:MIMXRT1170-EVK 开发板、USB Type-C 线缆 2 根(烧录 + 调试)、外部 QSPI Flash(开发板板载);
  • 软件:MDK-ARM(Keil)、RT1170 SDK 2.15.000、MCUBootUtility 工具(v6.1.0 及以上);
  • 工程基础:从 NXP MCUXpresso SDK Builder 生成的 RT1170 MDK 独立工程(如iled_blinky_cm7闪烁工程,纯 RAM 运行);
  • 工具下载

2. 步骤 1:MDK RAM 工程配置 —— 地址偏移与链接脚本修改

核心是调整工程的栈地址、程序入口地址链接脚本(.scf),让生成的镜像适配外部 Flash 烧录与 RAM 加载,以 0x2000 作为 APP 镜像入口地址为例。

2.1 生成 RT1170 MDK 独立 RAM 工程

  1. 打开 NXP MCUXpresso SDK Builder,选择硬件为MIMXRT1170-EVK,筛选Example Projects
  2. 选择纯 RAM 运行的工程(如led_blinky_cm7),选择开发环境为MDK-ARM,生成并下载工程压缩包(如MIMXRT1170-EVK-iled_blinky_cm7.zip);
  3. 解压后用 MDK-ARM 打开工程,默认工程为 RAM 调试模式,编译后仅能下载到片内 RAM。

2.2 工程目标地址偏移配置

  1. 打开 MDK 工程,点击「Options for Target」(魔法棒图标),进入「Target」标签页;
  2. 修改栈 / 堆代码地址:基于 ITCM 0x20000000 基地址,将 APP 入口地址偏移至 0x2000,确保避开 IVT 区域;
  3. 关键配置:保持 RAM 基地址为 0x20000000(ITCM),仅调整代码段的偏移起始地址为 0x2000。

2.3 链接脚本(.scf)修改

RT1170 的 MDK 工程使用.scf作为链接脚本,需修改其程序入口、代码段地址,匹配 0x2000 的偏移配置:
  1. 在 MDK 工程目录中找到链接脚本文件(如MIMXRT117xx.scf),双击打开;
  2. 修改ROM(实际为 RAM 代码段)的起始地址为0x20000000 + 0x2000 = 0x20002000,大小为 ITCM 剩余空间(256KB - 0x2000);
  3. 调整STACK(栈)和HEAP(堆)的地址,避免与代码段重叠;
  4. 保存脚本,确保编译后代码的链接地址与偏移配置一致。

2.4 生成 bin/hex 镜像文件

MDK 默认仅生成.out调试文件,需开启hex 文件生成并添加bin 文件生成命令,生成可被烧录工具识别的镜像文件:
  1. 进入「Options for Target」→「Output」标签页,勾选Create HEX File,开启 hex 文件生成;
  2. 进入「User」标签页,在「After Build/Rebuild」的「Run#1」中添加 bin 文件生成命令(基于 MDK 的 fromelf 工具):
    $KARMARMCCbinfromelf.exe --bin --output=debug@L.bin !L
    
    • 说明:@L表示工程名,!L表示当前输出的.out 文件,命令执行后会在debug目录生成与工程同名的 bin 文件;
  3. 点击「OK」保存配置,编译工程,编译完成后在工程的debug目录下会生成bin+hex两个镜像文件(核心烧录文件)。

3. 步骤 2:MDK 工程调试适配(可选)—— 修改 debug.ini 文件

地址偏移后,直接调试会因调试初始化文件(.ini) 与新地址不匹配导致无法进入代码,若需继续在 MDK 中调试偏移后的 RAM 工程,需修改debug.ini文件,让调试器匹配新的栈(SP)、程序计数器(PC)及中断偏移寄存器地址:
  1. 在 MDK 工程目录中找到debug.ini文件,用记事本 / MDK 打开;
  2. 修改文件中的Setup 函数,更新 SP、PC 地址为偏移后的 0x2000 相关地址,同时调整中断向量表偏移寄存器;
  3. 保存文件后重新编译工程,点击「Debug」即可正常进入偏移后的 RAM 代码调试,验证代码逻辑无问题后,再进行 Flash 烧录。

4. 步骤 3:外部 Flash 烧录 —— 基于 MCUBootUtility 工具

使用 NXP 专用烧录工具MCUBootUtility将生成的 bin/hex 镜像写入 RT1170 的外部 QSPI Flash,该工具支持 RT1170 的 Serial Download Mode(SDP 模式),无需 JLink/ST-Link,仅需 USB 即可烧录。

4.1 开发板切换为 Serial Download Mode(SDP 模式)

RT1170-EVK 通过板载拨码开关SW1切换启动模式,需切换为 SDP 模式以支持 USB 烧录:
  • SDP 模式拨码:SW1-1=OFF、SW1-2=OFF、SW1-3=OFF、SW1-4=ON;
  • 操作:开发板断电,调整拨码开关后重新上电,用 USB Type-C 线缆将开发板的J20 USB1接口连接到 PC,PC 会识别到 RT1170 的 SDP 设备。

4.2 MCUBootUtility 工具烧录操作

  1. 打开 MCUBootUtility 工具,工具会自动识别处于 SDP 模式的 RT1170-EVK 开发板,若未自动识别,点击「连接设备」手动选择;
  2. 设备连接成功后,点击「选择文件」,导入工程debug目录下的hex 镜像文件(hex 文件包含地址信息,烧录更精准);
  3. 无需额外配置(工具默认适配 RT1170-EVK 的外部 QSPI Flash),直接点击工具的All-in-One-Action按钮,工具会自动执行「擦除 Flash→写入镜像→校验镜像」全流程;
  4. 等待烧录完成,工具提示「操作成功」后,点击「Reset device」复位开发板,断开工具与设备的连接。

5. 步骤 4:启动模式切换 —— 从外部 Flash 启动并验证

烧录完成后,需将 RT1170-EVK 的启动模式切换为内部 Boot 模式(外部 QSPI Flash 启动),让芯片上电后从外部 Flash 加载镜像到 RAM 运行。

5.1 切换为外部 Flash 启动模式

调整开发板拨码开关SW1内部 Boot 模式(QSPI Flash 启动):
  • Flash 启动拨码:SW1-1=OFF、SW1-2=OFF、SW1-3=ON、SW1-4=OFF;
  • 操作:开发板断电,调整拨码开关后重新上电。

5.2 验证代码运行

上电后,RT1170 会自动从外部 QSPI Flash 读取镜像,加载到片内 RAM(ITCM)并执行,以led_blinky_cm7工程为例:
  • 板载 LED 会按照工程中设定的频率闪烁,说明 RAM 代码已成功烧录到外部 Flash 并实现独立启动;
  • 若 LED 未闪烁,检查启动模式拨码、镜像烧录是否成功、工程地址偏移是否正确。

6. 关键避坑事项与问题排查

6.1 烧录后无法启动,LED 无反应

  • 原因 1:启动模式拨码错误,未切换为外部 Flash 启动模式;
  • 原因 2:镜像文件选择错误,使用了 bin 文件而非 hex 文件(bin 文件无地址信息,易烧录地址偏移);
  • 原因 3:工程地址偏移配置错误,APP 入口地址与 IVT 区域冲突(未避开 0x400 偏移);
  • 解决:重新核对拨码开关配置,使用 hex 文件重新烧录,检查工程链接地址是否为 0x2000 偏移。

6.2 MDK 编译后无 bin/hex 文件

  • 原因:未开启 hex 文件生成,或 bin 文件生成命令输入错误(路径 / 参数错误);
  • 解决:勾选「Create HEX File」,核对 fromelf 工具的命令路径($K为 MDK 安装目录,自动识别),命令格式为$KARMARMCCbinfromelf.exe --bin --output=debug@L.bin !L

6.3 地址偏移后 MDK 调试无法进入代码

  • 原因debug.ini文件未同步修改,调试器的 SP/PC 地址仍为默认地址,与偏移后的地址不匹配;
  • 解决:修改debug.ini中的 Setup 函数,更新 SP、PC 及中断向量表偏移地址,与工程链接地址保持一致。

6.4 MCUBootUtility 无法识别开发板

  • 原因 1:开发板未切换为 SDP 模式,或拨码开关配置错误;
  • 原因 2:USB 连接的是调试口而非烧录口(需连接 J20 USB1 接口);
  • 原因 3:PC 未安装 RT1170 的 USB 驱动,设备识别失败;
  • 解决:重新核对 SDP 模式拨码,更换 USB 线缆并连接正确的 USB 口,安装 NXP USB 驱动(工具自带或官网下载)。

6.5 烧录成功但代码运行异常(如 LED 闪烁频率错误)

  • 原因:工程链接脚本修改错误,栈 / 堆地址与代码段重叠,导致程序运行时内存溢出
  • 解决:重新检查链接脚本(.scf),确保 STACK、HEAP 与代码段的地址无重叠,ITCM 地址范围控制在 0x20000000~0x2003FFFF(256KB)。

7. 进阶扩展与实用建议

7.1 适配自定义外部 Flash 型号

若使用非 RT1170-EVK 板载的 QSPI Flash 型号(不同容量 / 厂商),需在 MCUBootUtility 中手动配置 Flash 参数:
  1. 工具中点击「Flash 配置」,选择对应的 Flash 厂商、型号、容量;
  2. 若工具无对应 Flash 配置,可添加自定义 Flash 的擦除 / 编程算法,确保烧录与擦除正常。

7.2 批量烧录适配

量产阶段需实现多设备批量烧录,可基于 MCUBootUtility 的命令行模式编写批处理脚本,自动完成烧录流程,无需手动操作工具,提升量产效率。

7.3 结合 XIP 工程实现 Flash 直接运行

若需让代码直接在外部 Flash 运行(而非加载到 RAM),需将 RAM 工程改为XIP 工程

  1. 修改工程配置为 XIP 模式,添加 Flash 的 IVT/FCB 配置;
  2. 链接脚本指向外部 Flash 基地址(如 0x60000000);
  3. 编译后生成 XIP 镜像,用 MCUBootUtility 烧录后,代码可直接在 Flash 中运行,无需加载到 RAM。

7.4 镜像加密与安全烧录

若需提升产品安全性,可在烧录前对 bin/hex 镜像进行加密,结合 RT1170 的 HAB 安全启动功能,实现加密镜像烧录 + 安全启动验证,防止固件篡改与非法烧录。
RT1170 MDK RAM 代码烧录到外部 Flash 的核心是地址偏移适配 + 专用工具烧录,通过修改工程的链接地址、链接脚本,生成适配 Flash 烧录的 bin/hex 镜像,再利用 MCUBootUtility 工具在 SDP 模式下完成烧录,最后切换启动模式即可实现外部 Flash 启动。

该方案保留了 RAM 工程运行速度快的特性(代码最终运行在片内 ITCM),同时利用外部 Flash 实现代码永久存储,兼顾了运行性能与产品实用性。整个流程无需复杂的 Flash 驱动开发,基于官方工具与 SDK 即可实现,适配 RT1170 的所有 RAM 工程,是快速将 RAM 调试代码部署到产品的最优方案。

相关推荐