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 间循环调制。
- 扩频范围(Range):PLL 向下扩展的频率幅度,公式为
3. 核心配置:DCD 中添加扩频功能
DCD 是 BootROM 启动时执行的二进制配置数据,优先级高于主程序,需在其中添加扩频配置,确保启动阶段即生效。
3.1 DCD 原有核心操作(SDRAM 初始化)
DCD 默认通过一系列寄存器写指令,完成 SDRAM 启动准备,顺序如下:
- 配置 SEMC 时钟:选择 SYS_PLL3_PFD0 为时钟源,分频系数 4(低频率初始化,后续再提速);
- 配置 IOMUX:将 GPIO_EMC_B1_xx、GPIO_EMC_B2_xx 引脚设为 ALT0 功能(SEMC 接口);
- 管脚电气属性:设置驱动强度、压摆率等,保证 SDRAM 信号质量;
- 初始化 SEMC 控制器:配置 SDRAM 类型、列宽、时序参数(tRAS、tRP 等);
- 发送 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 数据修改
- 插入指令:在 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配置 - 更新长度字段:
- 合并写命令长度:原 0x040C(1036 字节)→ 新增 16 字节 → 0x041C(1052 字节);
- DCD 总长度:原 0x04B8(1208 字节)→ 新增 16 字节 → 0x04C8(1224 字节)。
4. Non-XIP 镜像编译(MCUXpresso IDE)
4.1 链接脚本修改
需手动添加 Boot Header,确保 SD 卡启动时 BootROM 能识别镜像:
- 取消 IDE “Manage linker script” 勾选,手动编辑链接脚本;
- 添加 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 工具烧录配置
- 打开 SEC 工具,选择 RT1170 目标设备;
- 配置启动设备为 SD 卡,优先选择 4-bit 总线宽度(避免 1-bit 宽度导致启动失败);
- 加载编译生成的 Non-XIP 镜像,执行烧录操作。
5.2 功能验证
- 启动验证:开发板从 SD 卡成功启动,程序运行在 SDRAM(地址 0x80000000 起);
- 扩频验证:通过 EMC 测试仪器观察,特定频率点 EMI 辐射峰值降低,符合测试标准;
- 稳定性验证:长时间运行无崩溃、无数据错乱,SDRAM 读写正常。
6. 关键注意事项
- DCD 配置顺序:扩频配置必须在 SEMC 时钟配置前,否则 SDRAM 初始化时扩频未生效;
- 函数存储位置:
UpdateSemcClock()需在 SRAM 中执行,不可放在 SDRAM; - SD 卡总线宽度:优先 4-bit 模式,部分厂家 SD 卡 1-bit 模式可能启动失败;
- 扩频参数适配:根据 EMC 测试结果调整 STOP、B、STEP 值,平衡辐射抑制与系统性能;
- 寄存器地址:RT1170 的 SYS_PLL2 扩频寄存器地址为 0x40C84260 和 0x40C842A0,不可混淆其他 PLL 寄存器。
7. 技术优势总结
阅读全文
172