1. IMX6ULL启动方式概述
作为嵌入式开发者,第一次接触NXP的i.MX6ULL处理器时,最让人困惑的就是其复杂的启动流程。正点原子推出的IMX6ULL开发板以其完善的资料和稳定的性能,成为许多工程师学习该平台的首选。今天我们就来深入解析这颗处理器的启动机制,帮助大家避开我当年踩过的那些坑。
IMX6ULL支持从多种存储设备启动,包括SD卡、eMMC、NAND Flash、NOR Flash等。但无论从哪种设备启动,其核心流程都遵循NXP定义的启动架构。在实际项目中,我曾遇到因为不理解启动流程而导致系统无法正常加载的情况,后来通过分析参考手册和实际测试,终于理清了其中的关键环节。
提示:IMX6ULL的启动流程分为ROM阶段和用户阶段,ROM代码是固化在芯片内部的,用户无法修改,但必须理解其工作逻辑才能正确配置自己的系统。
2. IMX6ULL启动流程详解
2.1 ROM代码执行阶段
当IMX6ULL上电或复位后,首先运行的是芯片内部ROM中的代码。这个阶段会完成以下关键操作:
- 初始化最基本的硬件环境,包括时钟、存储控制器等
- 根据BOOT_MODE[1:0]引脚的电平状态确定启动方式
- 从选定的启动设备中读取Image Vector Table(IVT)和Boot Data
- 验证镜像的完整性和有效性
- 将用户代码加载到指定内存地址并跳转执行
在实际调试中,我经常使用正点原子提供的ATK-XCOM串口助手观察启动日志。当看到"Boot from SD"或"Boot from NAND"等提示时,就说明ROM代码已经正确识别了启动设备。
2.2 IVT和Boot Data结构解析
IVT(Image Vector Table)是启动过程中最关键的数据结构,它包含了程序入口地址、DCD数据地址等重要信息。以下是IVT的典型布局:
| 偏移量 | 字段名 | 描述 |
|---|---|---|
| 0x00 | header | IVT头部标识 |
| 0x04 | entry | 程序入口地址 |
| 0x08 | dcd | DCD数据地址 |
| 0x0C | boot_data | Boot Data地址 |
| 0x10 |
