在 RT1170 开发中,开发者常先将代码下载到 SDRAM 调试(速度快、无 Flash 擦写损耗),调试完成后需将代码固化到外部 Flash 并实现启动。本文基于 NXP RT1170 SDK 2.15 的 HelloWorld 示例,详解 ARMGCC 环境下 SDRAM 代码生成、XMCD 文件提取、Flash 烧录的完整流程,通过 None XIP 模式实现从外部 Flash 启动,适用于各类 RT1170 基于 SDRAM 的应用场景。
1. 核心原理与环境准备
1.1 关键概念解析
- None XIP 模式:代码从外部 Flash 加载到 SDRAM 后再执行,区别于 XIP(就地执行),需 BootROM 完成 SDRAM 初始化与代码搬运;
- XMCD 文件:即 Device Configuration Data 文件,包含 SDRAM 初始化配置(时钟、时序、引脚等),由 BootROM 在启动时执行,确保 SDRAM 可正常使用;
- ARMGCC 环境:生成适用于 GCC 编译器的工程文件与二进制镜像,需配套编译工具链与脚本支持。
1.2 软硬件与工具环境
- 硬件:NXP MIMXRT1170-EVK 开发板(板载外部 FlexSPI NOR Flash、SDRAM)、USB 调试线;
- 软件:RT1170 SDK 2.15、ARMGCC 编译工具链(参考 SDK Getting Started 文档安装)、MCUBootUtility v5.2.1(Flash 烧录工具);
- 工程基础:SDK 自带
hello_worlddemo(cm7 核心,SDRAM 配置已默认启用)。
2. 分步实现流程
步骤 1:准备 SDK 与 ARMGCC 编译环境
(1)下载并解压 SDK
SDK_2_15_000_MIMXRT1170-EVK),解压到本地目录(如C:installSDK_Archive),确保目录无中文与空格。(2)配置 ARMGCC 编译环境
- 参考 SDK 文档
Getting Started with MCUXpresso SDK for MIMXRT1170-EVK.pdf,安装 ARMGCC 工具链; - 配置环境变量:将 ARMGCC 工具链的
bin目录添加到系统 PATH,确保终端可识别arm-none-eabi-gcc命令; - 验证环境:打开 GCC Command Prompt,输入
arm-none-eabi-gcc -v,显示版本信息即配置成功。
步骤 2:修改工程链接脚本(LD 文件),偏移 Image 起始地址
- 进入工程 ARMGCC 目录:
SDK_2_15_000_MIMXRT1170-EVKboardsevkmimxrt1170demo_appshello_worldcm7armgcc; - 编辑 SDRAM 链接脚本:打开
MIMXRT1176xxxx_cm7_flexspi_nor_sdram.ld; - 偏移起始地址:在 LD 文件中找到
FLASH段定义,将起始地址偏移0x2000字节(预留头部空间,可根据需求微调),示例:/* 原地址:0x60000000 */ FLASH (rx) : ORIGIN = 0x60002000, LENGTH = 0x1000000 /* 外部Flash地址,偏移0x2000 */ SDRAM (rwx) : ORIGIN = 0x80000000, LENGTH = 0x2000000 /* SDRAM地址不变 */ - 保存文件,确保修改后的 LD 文件被工程引用(CMakeLists.txt 中需指定该 LD 文件)。
步骤 3:编译工程,生成 ELF 文件
- 打开 GCC Command Prompt,切换到工程 ARMGCC 目录:
cd C:installSDK_ArchiveSDK_2_15_000_MIMXRT1170-EVKboardsevkmimxrt1170demo_appshello_worldcm7armgcc - 运行编译脚本:执行
build_sdram_debug.bat(Windows)或build_sdram_debug.sh(Linux),编译生成 SDRAM 调试版本的 ELF 文件; - 验证产物:编译完成后,在
armgccdebug目录下生成hello_world_demo_cm7.elf文件,即为目标镜像文件。
步骤 4:提取 XMCD 文件(SDRAM 初始化配置)
- 找到 SPT 工具路径:SDK 自带 SPT 工具(Serial Programming Tool),位于
SDK_2_15_000_MIMXRT1170-EVKtoolsspt; - 执行提取命令:在 GCC Command Prompt 中运行以下命令,从 ELF 文件中提取 XMCD 信息并生成 DCD bin 文件:
spt.exe -i hello_world_demo_cm7.elf -o xmcd.bin -t dcd - 保存文件:提取成功后,当前目录生成
xmcd.bin文件,即为所需的 XMCD 配置文件(记录路径,后续烧录使用)。
步骤 5:使用 MCUBootUtility 烧录镜像到外部 Flash
(1)硬件准备与模式配置
- 将 RT1170-EVK 的 BOOT 模式设置为 Serial Download 模式(通过板上拨码开关配置);
- 用 USB 线连接开发板与 PC,确保设备被 PC 识别(设备管理器显示 NXP USB-HID 设备)。
(2)MCUBootUtility 配置与镜像加载
- 打开 MCUBootUtility v5.2.1,配置目标设备:
- MCU Series:选择
i.MXRT; - MCU Device:选择
i.MXRT117x-LFBGA289; - Boot Device:选择
FLEXSPI NOR(外部 Flash 类型);
- MCU Series:选择
- 加载 XMCD 文件:
- 切换到「DCD Option」标签页;
- 选择「Use DCD bin file」,点击「Browse」选择步骤 4 生成的
xmcd.bin; - 确认 DCD Purpose 为「SDRAM Initialization」,SDRAM Base Address 为
0x80000000(与 LD 文件一致);
- 加载 ELF 文件并生成完整镜像:
- 切换到「Image Generation」标签页;
- 点击「Browse」选择步骤 3 生成的
hello_world_demo_cm7.elf; - 无需修改其他参数(默认生成适配外部 Flash 的镜像);
- 开始烧录:点击「Burn」按钮,等待烧录完成(日志显示 “Burn successfully” 即成功)。
步骤 6:切换启动模式,验证启动
- 烧录完成后,断开 USB 连接,将开发板 BOOT 模式切换为 Internal Boot(从外部 Flash 启动);
- 重新上电开发板,观察串口输出(需提前配置串口工具,波特率与 SDK 例程一致,默认 115200);
- 验证结果:串口输出 “hello world”,说明代码已从外部 Flash 加载到 SDRAM 并成功执行。
3. 注意事项
- LD 文件偏移配置:起始地址偏移
0x2000是为预留 IVT 空间,偏移过小会导致头部数据覆盖,需根据实际 Image 大小调整; - XMCD 文件提取:必须从 SDRAM 版本的 ELF 文件中提取,否则缺少 SDRAM 初始化配置,启动时会卡死;
- 烧录工具选择:需使用 MCUBootUtility v5.2.1 及以上版本,确保支持 RT1170 的 FLEXSPI NOR Flash 烧录;
- 启动模式切换:烧录时为 Serial Download 模式,启动时需切换为 Internal Boot 模式,否则无法从 Flash 启动;
- 编译脚本选择:需运行
build_sdram_debug.bat(SDRAM 版本),而非普通 Flash 版本脚本,否则工程未配置 SDRAM。
4. 常见问题排查
4.1 编译失败,提示 LD 文件路径错误
- 排查:CMakeLists.txt 中是否指定了修改后的
MIMXRT1176xxxx_cm7_flexspi_nor_sdram.ld文件; - 解决:在 CMakeLists.txt 中添加
set(LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/MIMXRT1176xxxx_cm7_flexspi_nor_sdram.ld)。
4.2 烧录成功但无法启动,串口无输出
- 排查:XMCD 文件是否正确加载,SDRAM 初始化是否成功;
- 解决:重新提取 XMCD 文件,确认 MCUBootUtility 中 DCD 配置正确,可通过示波器测量 SDRAM 引脚时钟是否正常。
4.3 启动后程序跑飞,无预期输出
- 排查:LD 文件中 SDRAM 起始地址与 XMCD 文件中配置是否一致;
- 解决:确保两者 SDRAM Base Address 均为
0x80000000,避免地址不匹配导致代码加载错误。
RT1170 ARMGCC SDRAM 代码烧录外部 Flash 的核心是 “偏移 Image 地址 + 提取 XMCD 配置 + None XIP 模式烧录”,关键在于确保 SDRAM 初始化参数正确、Flash 镜像包含完整头部信息。整个流程无需复杂修改代码,仅需调整链接脚本、提取配置文件并通过专用工具烧录,即可实现从外部 Flash 启动 SDRAM 代码。该方案适用于 RT1170 大型应用开发(代码超出内部 SRAM 容量),兼顾调试效率与量产需求,可直接复用本文步骤快速落地。
163