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 的核心逻辑
- 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 运行); - 工具下载:
- RT1170 SDK:MCUXpresso SDK Builder;
- MCUBootUtility:GitHub Release。
2. 步骤 1:MDK RAM 工程配置 —— 地址偏移与链接脚本修改
2.1 生成 RT1170 MDK 独立 RAM 工程
- 打开 NXP MCUXpresso SDK Builder,选择硬件为
MIMXRT1170-EVK,筛选Example Projects; - 选择纯 RAM 运行的工程(如
led_blinky_cm7),选择开发环境为MDK-ARM,生成并下载工程压缩包(如MIMXRT1170-EVK-iled_blinky_cm7.zip); - 解压后用 MDK-ARM 打开工程,默认工程为 RAM 调试模式,编译后仅能下载到片内 RAM。
2.2 工程目标地址偏移配置
- 打开 MDK 工程,点击「Options for Target」(魔法棒图标),进入「Target」标签页;
- 修改栈 / 堆与代码地址:基于 ITCM 0x20000000 基地址,将 APP 入口地址偏移至 0x2000,确保避开 IVT 区域;
- 关键配置:保持 RAM 基地址为 0x20000000(ITCM),仅调整代码段的偏移起始地址为 0x2000。
2.3 链接脚本(.scf)修改
.scf作为链接脚本,需修改其程序入口、代码段地址,匹配 0x2000 的偏移配置:- 在 MDK 工程目录中找到链接脚本文件(如
MIMXRT117xx.scf),双击打开; - 修改
ROM(实际为 RAM 代码段)的起始地址为0x20000000 + 0x2000 = 0x20002000,大小为 ITCM 剩余空间(256KB - 0x2000); - 调整
STACK(栈)和HEAP(堆)的地址,避免与代码段重叠; - 保存脚本,确保编译后代码的链接地址与偏移配置一致。
2.4 生成 bin/hex 镜像文件
.out调试文件,需开启hex 文件生成并添加bin 文件生成命令,生成可被烧录工具识别的镜像文件:- 进入「Options for Target」→「Output」标签页,勾选Create HEX File,开启 hex 文件生成;
- 进入「User」标签页,在「After Build/Rebuild」的「Run#1」中添加 bin 文件生成命令(基于 MDK 的 fromelf 工具):
$KARMARMCCbinfromelf.exe --bin --output=debug@L.bin !L- 说明:
@L表示工程名,!L表示当前输出的.out 文件,命令执行后会在debug目录生成与工程同名的 bin 文件;
- 说明:
- 点击「OK」保存配置,编译工程,编译完成后在工程的
debug目录下会生成bin+hex两个镜像文件(核心烧录文件)。
3. 步骤 2:MDK 工程调试适配(可选)—— 修改 debug.ini 文件
debug.ini文件,让调试器匹配新的栈(SP)、程序计数器(PC)及中断偏移寄存器地址:- 在 MDK 工程目录中找到
debug.ini文件,用记事本 / MDK 打开; - 修改文件中的Setup 函数,更新 SP、PC 地址为偏移后的 0x2000 相关地址,同时调整中断向量表偏移寄存器;
- 保存文件后重新编译工程,点击「Debug」即可正常进入偏移后的 RAM 代码调试,验证代码逻辑无问题后,再进行 Flash 烧录。
4. 步骤 3:外部 Flash 烧录 —— 基于 MCUBootUtility 工具
4.1 开发板切换为 Serial Download Mode(SDP 模式)
- 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 工具烧录操作
- 打开 MCUBootUtility 工具,工具会自动识别处于 SDP 模式的 RT1170-EVK 开发板,若未自动识别,点击「连接设备」手动选择;
- 设备连接成功后,点击「选择文件」,导入工程
debug目录下的hex 镜像文件(hex 文件包含地址信息,烧录更精准); - 无需额外配置(工具默认适配 RT1170-EVK 的外部 QSPI Flash),直接点击工具的All-in-One-Action按钮,工具会自动执行「擦除 Flash→写入镜像→校验镜像」全流程;
- 等待烧录完成,工具提示「操作成功」后,点击「Reset device」复位开发板,断开工具与设备的连接。
5. 步骤 4:启动模式切换 —— 从外部 Flash 启动并验证
5.1 切换为外部 Flash 启动模式
- Flash 启动拨码:SW1-1=OFF、SW1-2=OFF、SW1-3=ON、SW1-4=OFF;
- 操作:开发板断电,调整拨码开关后重新上电。
5.2 验证代码运行
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 型号
- 工具中点击「Flash 配置」,选择对应的 Flash 厂商、型号、容量;
- 若工具无对应 Flash 配置,可添加自定义 Flash 的擦除 / 编程算法,确保烧录与擦除正常。
7.2 批量烧录适配
量产阶段需实现多设备批量烧录,可基于 MCUBootUtility 的命令行模式编写批处理脚本,自动完成烧录流程,无需手动操作工具,提升量产效率。
7.3 结合 XIP 工程实现 Flash 直接运行
若需让代码直接在外部 Flash 运行(而非加载到 RAM),需将 RAM 工程改为XIP 工程:
- 修改工程配置为 XIP 模式,添加 Flash 的 IVT/FCB 配置;
- 链接脚本指向外部 Flash 基地址(如 0x60000000);
- 编译后生成 XIP 镜像,用 MCUBootUtility 烧录后,代码可直接在 Flash 中运行,无需加载到 RAM。
7.4 镜像加密与安全烧录
若需提升产品安全性,可在烧录前对 bin/hex 镜像进行加密,结合 RT1170 的 HAB 安全启动功能,实现加密镜像烧录 + 安全启动验证,防止固件篡改与非法烧录。
RT1170 MDK RAM 代码烧录到外部 Flash 的核心是地址偏移适配 + 专用工具烧录,通过修改工程的链接地址、链接脚本,生成适配 Flash 烧录的 bin/hex 镜像,再利用 MCUBootUtility 工具在 SDP 模式下完成烧录,最后切换启动模式即可实现外部 Flash 启动。
99