扫码加入

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

RT1170 ARMGCC SDRAM代码烧录外部Flash实操:None XIP模式启动方案

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

在 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_world demo(cm7 核心,SDRAM 配置已默认启用)。

2. 分步实现流程

步骤 1:准备 SDK 与 ARMGCC 编译环境

(1)下载并解压 SDK

从 NXP 官网下载 RT1170 SDK 2.15(SDK_2_15_000_MIMXRT1170-EVK),解压到本地目录(如C:installSDK_Archive),确保目录无中文与空格。

(2)配置 ARMGCC 编译环境

  1. 参考 SDK 文档Getting Started with MCUXpresso SDK for MIMXRT1170-EVK.pdf,安装 ARMGCC 工具链;
  2. 配置环境变量:将 ARMGCC 工具链的bin目录添加到系统 PATH,确保终端可识别arm-none-eabi-gcc命令;
  3. 验证环境:打开 GCC Command Prompt,输入arm-none-eabi-gcc -v,显示版本信息即配置成功。

步骤 2:修改工程链接脚本(LD 文件),偏移 Image 起始地址

为预留 IVT(Image Vector Table)等头部数据空间,需修改 SDRAM 工程的 LD 文件,调整 Image 起始地址:
  1. 进入工程 ARMGCC 目录:SDK_2_15_000_MIMXRT1170-EVKboardsevkmimxrt1170demo_appshello_worldcm7armgcc
  2. 编辑 SDRAM 链接脚本:打开MIMXRT1176xxxx_cm7_flexspi_nor_sdram.ld
  3. 偏移起始地址:在 LD 文件中找到FLASH段定义,将起始地址偏移0x2000字节(预留头部空间,可根据需求微调),示例:
    /* 原地址:0x60000000 */
    FLASH (rx) : ORIGIN = 0x60002000, LENGTH = 0x1000000 /* 外部Flash地址,偏移0x2000 */
    SDRAM (rwx) : ORIGIN = 0x80000000, LENGTH = 0x2000000 /* SDRAM地址不变 */
    
  4. 保存文件,确保修改后的 LD 文件被工程引用(CMakeLists.txt 中需指定该 LD 文件)。

步骤 3:编译工程,生成 ELF 文件

  1. 打开 GCC Command Prompt,切换到工程 ARMGCC 目录:
    cd C:installSDK_ArchiveSDK_2_15_000_MIMXRT1170-EVKboardsevkmimxrt1170demo_appshello_worldcm7armgcc
    
  2. 运行编译脚本:执行build_sdram_debug.bat(Windows)或build_sdram_debug.shLinux),编译生成 SDRAM 调试版本的 ELF 文件;
  3. 验证产物:编译完成后,在armgccdebug目录下生成hello_world_demo_cm7.elf文件,即为目标镜像文件。

步骤 4:提取 XMCD 文件(SDRAM 初始化配置)

SDRAM 需先初始化才能加载代码,XMCD 文件包含初始化参数,可通过 SPT 工具从编译产物中提取:
  1. 找到 SPT 工具路径:SDK 自带 SPT 工具(Serial Programming Tool),位于SDK_2_15_000_MIMXRT1170-EVKtoolsspt
  2. 执行提取命令:在 GCC Command Prompt 中运行以下命令,从 ELF 文件中提取 XMCD 信息并生成 DCD bin 文件:
    spt.exe -i hello_world_demo_cm7.elf -o xmcd.bin -t dcd
    
  3. 保存文件:提取成功后,当前目录生成xmcd.bin文件,即为所需的 XMCD 配置文件(记录路径,后续烧录使用)。

步骤 5:使用 MCUBootUtility 烧录镜像到外部 Flash

(1)硬件准备与模式配置

  1. 将 RT1170-EVK 的 BOOT 模式设置为 Serial Download 模式(通过板上拨码开关配置);
  2. 用 USB 线连接开发板与 PC,确保设备被 PC 识别(设备管理器显示 NXP USB-HID 设备)。

(2)MCUBootUtility 配置与镜像加载

  1. 打开 MCUBootUtility v5.2.1,配置目标设备:
    • MCU Series:选择i.MXRT
    • MCU Device:选择i.MXRT117x-LFBGA289
    • Boot Device:选择FLEXSPI NOR(外部 Flash 类型);
  2. 加载 XMCD 文件:
    • 切换到「DCD Option」标签页;
    • 选择「Use DCD bin file」,点击「Browse」选择步骤 4 生成的xmcd.bin
    • 确认 DCD Purpose 为「SDRAM Initialization」,SDRAM Base Address 为0x80000000(与 LD 文件一致);
  3. 加载 ELF 文件并生成完整镜像:
    • 切换到「Image Generation」标签页;
    • 点击「Browse」选择步骤 3 生成的hello_world_demo_cm7.elf
    • 无需修改其他参数(默认生成适配外部 Flash 的镜像);
  4. 开始烧录:点击「Burn」按钮,等待烧录完成(日志显示 “Burn successfully” 即成功)。

步骤 6:切换启动模式,验证启动

  1. 烧录完成后,断开 USB 连接,将开发板 BOOT 模式切换为 Internal Boot(从外部 Flash 启动);
  2. 重新上电开发板,观察串口输出(需提前配置串口工具,波特率与 SDK 例程一致,默认 115200);
  3. 验证结果:串口输出 “hello world”,说明代码已从外部 Flash 加载到 SDRAM 并成功执行。

3. 注意事项

  1. LD 文件偏移配置:起始地址偏移0x2000是为预留 IVT 空间,偏移过小会导致头部数据覆盖,需根据实际 Image 大小调整;
  2. XMCD 文件提取:必须从 SDRAM 版本的 ELF 文件中提取,否则缺少 SDRAM 初始化配置,启动时会卡死;
  3. 烧录工具选择:需使用 MCUBootUtility v5.2.1 及以上版本,确保支持 RT1170 的 FLEXSPI NOR Flash 烧录;
  4. 启动模式切换:烧录时为 Serial Download 模式,启动时需切换为 Internal Boot 模式,否则无法从 Flash 启动;
  5. 编译脚本选择:需运行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 容量),兼顾调试效率与量产需求,可直接复用本文步骤快速落地。

相关推荐