扫码加入

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

RT1170 SD 卡启动 + SDRAM 运行 + DCD 扩频实现流程:EMC 合规实操

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

NXP RT1170 实现 “SD 卡启动 + 程序运行在 SDRAM + 电磁兼容(EMC)达标” 的核心方案,是通过 Non-XIP 模式加载镜像、DCD(Device Configuration Data)配置时钟扩频,既满足大容量应用的内存需求,又能分散电磁辐射(EMI)峰值。本文详解从 DCD 扩频配置、Non-XIP 镜像编译到 SD 卡烧录的完整步骤,适用于工业和消费电子中需通过严格 EMC 测试的场景。

1. 核心目标与硬件基础

1.1 技术目标

  • 启动模式:SD 卡启动,Non-XIP 模式(镜像加载到 SDRAM 执行);
  • 运行环境:程序稳定运行在外部 SDRAM(通过 SEMC 接口连接);
  • 核心功能:通过 DCD 配置 SYS_PLL2 扩频,降低 EMI 辐射,满足 EMC 测试;
  • 交付成果:完整的开发、编译、烧录流程,确保系统稳定性。

1.2 硬件清单

  • 主控:NXP RT1170 EVKB 开发板(Cortex-M7 内核);
  • 存储:SD 卡(存储 Non-XIP 镜像)、外部 SDRAM(SEMC 接口);
  • 辅助工具:SEC 烧录工具、EMC 测试仪器(验证扩频效果)。

2. 关键技术背景

2.1 RT1170 启动与运行模式

  • XIP 模式:程序直接在 FlexSPI 外挂 Nor Flash 中执行,无需搬运;
  • Non-XIP 模式:镜像存储在 SD 卡,BootROM 启动时将其搬运到 RAM(SRAM 或 SDRAM)中执行;
  • 本方案选择:Non-XIP+SDRAM 运行,适配大容量应用,需通过 DCD 提前初始化 SDRAM。

2.2 扩频技术原理(EMC 合规核心)

  • 目的:通过周期性调制系统时钟频率,分散 EMI 能量,降低特定频率点辐射峰值;
  • 支持对象:RT1170 的 SYS_PLL2、AUDIO_PLL、VIDEO_PLL(本方案用 SYS_PLL2);
  • 关键参数:
    • 扩频范围(Range):PLL 向下扩展的频率幅度,公式为Range = STOP / B * 24 MHz
    • 频率步长(Step):频率变化的最小单位,公式为Step = STEP / B * 24 MHz
    • 示例:STOP=0x4B0、B=0x960、STEP=0x6 时,Range=12MHz、Step=60kHz,SYS_PLL2 在 528MHz~516MHz 间循环调制。

3. 核心配置:DCD 中添加扩频功能

DCD 是 BootROM 启动时执行的二进制配置数据,优先级高于主程序,需在其中添加扩频配置,确保启动阶段即生效。

3.1 DCD 原有核心操作(SDRAM 初始化)

DCD 默认通过一系列寄存器写指令,完成 SDRAM 启动准备,顺序如下:
  1. 配置 SEMC 时钟:选择 SYS_PLL3_PFD0 为时钟源,分频系数 4(低频率初始化,后续再提速);
  2. 配置 IOMUX:将 GPIO_EMC_B1_xx、GPIO_EMC_B2_xx 引脚设为 ALT0 功能(SEMC 接口);
  3. 管脚电气属性:设置驱动强度、压摆率等,保证 SDRAM 信号质量;
  4. 初始化 SEMC 控制器:配置 SDRAM 类型、列宽、时序参数(tRAS、tRP 等);
  5. 发送 SDRAM 初始化命令:Precharge All、Auto-Refresh、Mode Register Set 等,使 SDRAM 进入就绪状态。

3.2 新增扩频配置(关键步骤)

需在 DCD 的 SEMC 时钟配置前,添加 SYS_PLL2 扩频寄存器配置,确保扩频先于 SDRAM 初始化生效:

(1)需配置的寄存器与值

寄存器地址 配置值 作用
0x40C84260(ANADIG_PLL_SYS_PLL2_SS) 0x04B08006 配置 STOP(0x4B0)、STEP(0x6)
0x40C842A0(ANADIG_PLL_SYS_PLL2_CTRL) 0x00000960 配置 B 值(0x960)

(2)DCD 数据修改

  1. 插入指令:在 DCD 合并写命令头(0xCC, 0x04, 0x0C, 0x04)后、原有 SEMC 时钟配置前,添加 16 字节指令(2 条 4 字节地址 + 4 字节值):
    0x40, 0xC8, 0x42, 0x60, 0x04, 0xB0, 0x80, 0x06,  // 第一条指令:PLL2_SS配置
    0x40, 0xC8, 0x42, 0xA0, 0x00, 0x00, 0x09, 0x60   // 第二条指令:PLL2_CTRL配置
    
  2. 更新长度字段:
    • 合并写命令长度:原 0x040C(1036 字节)→ 新增 16 字节 → 0x041C(1052 字节);
    • DCD 总长度:原 0x04B8(1208 字节)→ 新增 16 字节 → 0x04C8(1224 字节)。

4. Non-XIP 镜像编译(MCUXpresso IDE)

4.1 链接脚本修改

需手动添加 Boot Header,确保 SD 卡启动时 BootROM 能识别镜像:
  1. 取消 IDE “Manage linker script” 勾选,手动编辑链接脚本;
  2. 添加 Boot Header 段(包含 IVT、DCD 数据等):
    .boot_hdr : ALIGN(4) {
      FILL(0xff);
      KEEP(*(.boot_hdr.conf));
      .=0x400;
      boot_hdr_start_ = ABSOLUTE(.);
      .=0x1000;
      boot_hdr_ivt_loadaddr_ = ABSOLUTE(.);
      KEEP(*(.boot_hdr.ivt));
      .=0x1020;
      boot_hdr_boot_data_loadaddr_ = ABSOLUTE(.);
      KEEP(*(.boot_hdr.boot_data));
      .=0x1030;
      boot_hdr_dcd_loadaddr_ = ABSOLUTE(.);
      KEEP(*(.boot_hdr.dcd_data));
      .=0x2000;
      boot_hdr_end_ = ABSOLUTE(.);
    } >BOARD_SDRAM
    

4.2 宏定义配置

在 IDE 中添加以下宏,启用 DCD 和 Non-XIP 模式:
XIP_BOOT_HEADER_ENABLE=1
XIP_BOOT_HEADER_DCD_ENABLE=1
USE_SDRAM
CPU_MIMXRT1176DVMAA_cm7

4.3 SEMC 时钟切换注意事项

  • SDK 会调用UpdateSemcClock()函数,将 SDRAM 时钟从初始化的低频率切换到高性能频率(如 200MHz);
  • 该函数必须放在 SRAM 中执行(添加AT_QUICKACCESS_SECTION_CODE修饰),避免切换时钟时 SDRAM 取指错误。

5. 烧录与验证流程

5.1 SEC 工具烧录配置

  1. 打开 SEC 工具,选择 RT1170 目标设备;
  2. 配置启动设备为 SD 卡,优先选择 4-bit 总线宽度(避免 1-bit 宽度导致启动失败);
  3. 加载编译生成的 Non-XIP 镜像,执行烧录操作。

5.2 功能验证

  • 启动验证:开发板从 SD 卡成功启动,程序运行在 SDRAM(地址 0x80000000 起);
  • 扩频验证:通过 EMC 测试仪器观察,特定频率点 EMI 辐射峰值降低,符合测试标准;
  • 稳定性验证:长时间运行无崩溃、无数据错乱,SDRAM 读写正常。

6. 关键注意事项

  1. DCD 配置顺序:扩频配置必须在 SEMC 时钟配置前,否则 SDRAM 初始化时扩频未生效;
  2. 函数存储位置:UpdateSemcClock()需在 SRAM 中执行,不可放在 SDRAM;
  3. SD 卡总线宽度:优先 4-bit 模式,部分厂家 SD 卡 1-bit 模式可能启动失败;
  4. 扩频参数适配:根据 EMC 测试结果调整 STOP、B、STEP 值,平衡辐射抑制与系统性能;
  5. 寄存器地址:RT1170 的 SYS_PLL2 扩频寄存器地址为 0x40C84260 和 0x40C842A0,不可混淆其他 PLL 寄存器。

7. 技术优势总结

  1. EMC 合规:扩频技术无需额外硬件,即可降低 EMI 辐射,满足严格测试要求;
  2. 内存充足:程序运行在 SDRAM,突破片内 2MB SRAM 限制,适配大容量应用;
  3. 成本可控:SD 卡存储镜像,相比 Nor Flash 降低硬件成本;
  4. 开发高效:基于 MCUXpresso IDE 和 SDK,配置流程可复用,缩短开发周期。

相关推荐