IM6ULL芯片

IM6ULL芯片 介绍这个芯片很火被广泛应用于工业领域PLC工业网关HMI。其次在消费电子和医疗等其他领域特也占有一席之地。表格项目规格亮点核心架构单核 ARM Cortex-A7相比 Cortex-A9 功耗降低约 50%性能满足轻量级 Linux 应用主频最高 900MHz常见 800MHz平衡性能与功耗工业场景稳定运行缓存128KB L1I/D 256KB L2多级缓存提升指令执行效率内存接口16 位 LPDDR2/DDR3/DDR3L降低硬件成本满足基础内存需求存储支持NAND/NOR/eMMC/Quad SPI灵活适配不同存储方案集成 PMU内置电源管理单元简化外部供电设计降低系统 BOM 成本工业温度-40℃~105℃适应恶劣工业环境可靠性高封装MAP BGA-289小型化设计适合嵌入式设备关键外设接口工业开发必备通信接口双千兆以太网、CAN 总线、多路 UART/USB/I2C/SPI显示与图像并行 LCD支持 1366×768、摄像头接口CSI工业总线RS485、Modbus 协议支持安全特性硬件加密引擎、安全启动启动方式与头文件启动方式核心底层片内 Boot ROM i.MX6ULL 芯片内部出厂固化了一段 Boot ROM无法修改、擦除是芯片上电后第一个运行的程序所有启动方式都由它调度- 上电先检测 BOOT_MODE、BOOT_CFG 两组引脚电平 - 根据引脚配置选择启动方式- 初始化基础硬件、解析镜像的 IVT/DCD 头部你之前裸机 .imx 文件的头部就是给 Boot ROM 识别的- 把外部镜像加载到 DDR 并跳转执行。两组关键启动引脚开发板上的启动拨码本质就是拉高/拉低这两组芯片引脚- BOOT_MODE[1:0] (2 个引脚)决定三大顶层启动模式最核心分类- BOOT_CFG[7:0] (8 个引脚)仅在「正常外部启动模式」下生效用来选择具体启动介质SD/eMMC/NAND 等。头部文件i.MX6ULL 的启动镜像.imx格式必须遵循固定的顺序Boot ROM 上电后会按这个顺序解析完成硬件初始化、镜像加载和跳转。[ 0x0000 ~ 0x001F ] IVT (32字节) → 镜像向量表Boot ROM的第一个入口[ 0x0020 ~ 0x002B ] BOOT DATA (12字节) → 镜像加载信息[ 0x0030 ~ 0x00AF ] DCD (最多176字节) → DDR/时钟初始化命令[ 0x0100 ~ ...... ] 用户代码 → 你的裸机程序IVTImage Vector Table镜像向量表IVT 是 Boot ROM 识别的第一个结构必须位于镜像的0x0偏移处是整个启动流程的 “导航表”告诉 Boot ROM 程序的入口地址在哪里。告诉 Boot ROM DCD、BOOT DATA 等关键结构的位置。提供魔数校验让 Boot ROM 确认这是一个合法的启动镜像。typedef struct { uint32_t header; // 0x00: 魔数固定为 0x000000D1 uint32_t entry; // 0x04: 程序入口地址DDR中的物理地址 uint32_t reserved1; // 0x08: 保留必须为0 uint32_t dcd; // 0x0C: DCD结构的DDR地址 uint32_t boot_data; // 0x10: BOOT DATA结构的DDR地址 uint32_t self; // 0x14: IVT自身的DDR地址校验用 uint32_t csf; // 0x18: 安全启动CSF地址非安全模式设为0 uint32_t reserved2; // 0x1C: 保留必须为0 } ivt_t;header固定为0x000000D1Boot ROM 通过这个值识别 IVT 的位置写错的话镜像直接无法启动。entry你的裸机程序_start函数的地址必须是DDR 中的物理地址比如0x87801000程序加载到 DDR 的位置。selfIVT 自身在 DDR 中的地址比如0x87800000Boot ROM 会校验这个地址确认镜像加载正确。dcd/boot_data指向 DCD 和 BOOT DATA 的 DDR 地址必须和实际位置对应。时钟树时钟来源时钟来源IMX6ULL 的时钟系统采用 晶振输入 → 主 PLL 倍频 → PFD 精细分频 → 总线选择器 → 外设分频 的四级架构。你这张图展示的是前两级从 24MHz 晶振到各个 PLL 及 PFD 分支的输出是整个时钟树的根。序号 PLL 名称 默认输出频率 核心用途 对应图中标号。ARM_PLL 792MHz 给 ARM Cortex-A7 内核提供时钟。528_PLL (System PLL) 528MHz 系统总线主时钟源所有 AXI/AHB/IPG 时钟都来自它。USB1_PLL (480_PLL) 480MHz USB1 控制器、SDIO、CAN 等外设。USB2_PLL 480MHz USB2 控制器 。ENET_PLL 500MHz 以太网控制器 。VIDEO_PLL 650MHz LCD 显示、CSI 摄像头接口 。AUDIO_PLL 650MHz I2S、SAI 音频接口 。IMX6ULL 的所有 7 个主 PLL 的主输出频率都是固定的没有一个是软件可编程倍频的。这是 IMX6 系列时钟系统的一个重要设计特点。所有 PLL 都可以通过 bypass_sel 选择这三个输入源中的任意一个。OSC24M芯片外部的 24MHz 无源晶振是系统默认的主时钟源。CLK1/CLK2外部输入时钟引脚用于特殊场景比如外接高精度时钟。时钟去向时钟去向然后528_PLL480_PLL经过PDF形成了时钟池后面的外设通过分频器和多路选择器从时钟池中选择自己的时钟源。ARM_CLK用于ARM Cortex_A内核的运行也就是我们常说的主频。其只有唯一条通路从PLL1二分频后得到。CARR[ARM_PODF]用于配置分频系数。AXI_CLK:AXI总线的时钟其下面挂载了DDR/MMDC 控制器 OCRAM 片内高速 RAM PXP 像素处理加速器 CSI 摄像头接口 LCD 显示控制器(eLCDIF) SD/MMC 卡控制(uSDHC)其可直接来源于PLL2或PLL1的分频。也可与AHB时钟共享时钟来源。AHB_CLKAHB总线的时钟其下面挂载了。USB/以太网/Can控制器。此外其另一个功能是作为IPG和PERCLK的时钟源。PERCLK:只给特定的低速外设提供功能工作时钟以下外设的功能工作时钟用于计数、波特率生成、位时钟生成等来自 PERCLK_CLK_ROOT定时器EPIT1/EPIT2、GPT计数时钟串口UART1~UART8波特率生成时钟I2CI2C1~I2C4位时钟生成时钟SPIECSPI1~ECSPI4SPI 时钟生成PWMPWM1~PWM8PWM 计数时钟KPP 键盘控制器按键扫描时钟TSC 触摸屏控制器触摸检测时钟IPG_CLK:所有外设的寄存器访问时钟100% 覆盖,不管这个外设的功能工作时钟来自哪里USB、以太网、音频、显示等只要你读写它的控制寄存器、数据寄存器、状态寄存器就必须用到 IPG 时钟,没有 IPG 时钟CPU 根本无法与任何外设通信。 部分外设的功能工作时钟 除了寄存器访问以下几个外设的核心工作时钟也直接使用 IPG_CLK_ROOTGPIO1~GPIO5输入输出检测、电平翻转ADC1/ADC2模数转换时钟。Cortext_A中断原理GIC中断控制器Distributor全局中断总控单元Distributor 是整个 GIC 的全局中枢全系统只有一套逻辑实例多核下共享负责收集所有中断源、管理中断状态、完成优先级排序与CPU 目标路由最终将合格的中断转发给对应 CPU 的 CPU Interface 单元。核心职责全类型中断统一管理覆盖 SGI软件生成中断、PPI私有外设中断、SPI共享外设中断三类中断。全局中断开关按分组控制所有中断是否向 CPU Interface 转发。中断状态维护管理每个中断的「未生效 - 挂起 - 激活 - 激活且挂起」全生命周期状态。中断属性配置优先级、触发方式电平 / 边沿、目标 CPU 核。软件中断触发提供寄存器直接触发 SGI 核间中断。系统能力查询提供硬件实现的中断线数量、CPU 接口数量、版本、厂商等信息。寄存器组织GICD_CTLR分发器控制寄存器全局中断转发的总开关支持按分组独立控制GICv1 无安全扩展仅 bit0 Enable 全局控制所有中断转发。GICv2 / 带安全扩展的 GICv1EnableGrp0bit0控制 Group 0 中断转发EnableGrp1bit1控制 Group 1 中断转发两组独立开关关闭时对应分组的中断不会递交给 CPU Interface。GICD_TYPER中断控制器类型存器只读反映硬件实现规格ITLinesNumberbit4:0最大支持中断数 32*(N1)上限 1020 个。CPUNumberbit7:5CPU 接口数量 N1最多 8 个。SecurityExtnbit10是否实现安全扩展。LSPIbit15:11支持锁定的共享中断数量安全扩展下的配置锁定功能。状态类寄存器按 32 个中断一组组织每类寄存器都有多组n 为组号对应 32 个中断每个中断占 1 位GICD_IGROUPRn中断分组配置0Group01Group1安全态下可写非安全态读零。中断状态转移图GICD_ISENABLERn / GICD_ICENABLERn中断使能置位 / 清除写 1 生效读返回当前使能状态。GICD_ISPENDRn / GICD_ICPENDRn中断挂起置位 / 清除软件可手动模拟中断挂起电平触发中断的挂起同时受硬件信号和软件写操作影响。GICD_ISACTIVERn / GICD_ICACTIVERn中断激活状态置位 / 清除GICv1 仅只读GICv2 支持读写用于低功耗下状态保存恢复。配置类寄存器GICD_IPRIORITYRn每个中断 8 位优先级数值越小优先级越高硬件可实现 3~8 位有效优先级未实现低位读零。GICD_ITARGETSRn每个中断 8 位目标 CPU 掩码bit0~bit7 对应 CPU0~CPU7置 1 表示该中断路由到对应 CPUSGI 和 PPI 的目标寄存器只读固定指向当前 CPU。GICD_ICFGRn每个中断 2 位配置其中高位控制触发方式0 电平触发1 边沿触发SGI 固定为边沿触发对应位只读。GICD_SGIR软件生成中断寄存器:只写寄存器用于核间通信触发 SGI。SGIINTIDbit3:0指定触发的 SGI 号0~15。中断分发逻辑Distributor 持续扫描所有挂起中断按优先级从高到低排序结合中断使能、目标 CPU 掩码将每个 CPU 对应的最高优先级挂起中断转发给其 CPU Interface。若某分组全局关闭则该分组所有中断不参与分发。多核系统中与 SGI、PPI中断 ID 0~31相关的所有寄存器均按 CPU 独立 Bank每个 CPU 只能操作自己私有中断的状态互不影响SPI 相关寄存器为全局共享所有 CPU 访问同一份。CPU Interface CPU接口CPU Interface 是每个 CPU 核一对一绑定的本地单元是中断进入处理器的最后一道关卡。它接收 Distributor 转发来的中断完成优先级过滤、抢占裁决最终向 CPU 输出 IRQ/FIQ 异常信号同时负责响应 CPU 的中断应答、结束操作维护当前运行时优先级。核心职责中断掩码过滤屏蔽低于优先级阈值的中断不递交给 CPU。抢占裁决拆分优先级为「组优先级 子优先级」仅组优先级更高的中断才能触发嵌套。中断应答CPU 读取中断号时自动完成中断状态从挂起到激活的切换。中断结束处理CPU 处理完成后清除激活状态、恢复运行优先级。运行时优先级维护跟踪当前 CPU 的最高激活中断优先级作为抢占判断基准。寄存器架构CPU Interface 寄存器地址偏移相对于 CPU 接口基地址每个 CPU 拥有独立的寄存器基地址或通过硬件路由自动访问本核副本。GICC_CTLR CPU 接口控制寄存器总开关 模式配置这是 GICC 的总控制寄存器用于配置接口整体工作模式日常初始化必配。核心功能分组使能单独开启 / 关闭 Group0、Group1 两类中断可整组屏蔽中断FIQ 路由选择 Group0 中断使用快速 FIQ 还是普通 IRQGroup1 固定走 IRQEOI 模式中断结束的工作模式绝大多数裸机、Linux 系统使用传统模式值 0无需修改常规配置默认开启两组中断、IRQ 模式即可工程中一般初始化后不再改动。GICC_PMR 优先级掩码寄存器临时中断门槛最常用寄存器之一用于动态屏蔽低优先级中断进入临界区必用。基础规则GIC 统一约定中断数值越小优先级越高判定逻辑只有中断优先级 PMR 设置值CPU 才会响应反之直接拦截典型使用场景全开中断配置为 0xFF默认状态所有中断均可响应全关中断临界区配置为 0x00所有中断全部拦截部分屏蔽配置中间值仅放行高优先级中断补充区分该寄存器是临时拦截中断不会丢失只是暂时不响应而 GICD 侧寄存器是永久禁用中断源。GICC_IAR 中断应答寄存器读取中断号CPU 响应中断时的入口寄存器只读属性。作用CPU 进入中断异常后读取该寄存器就能拿到当前触发的中断编号联动行为读取的同时硬件自动将该中断标记为「正在处理激活态」同时更新当前运行优先级注意无有效中断时会返回固定虚假中断号软件可据此判断。GICC_EOIR 中断结束寄存器中断收尾只写寄存器中断服务函数执行完毕后必须写入对应中断号告知 GIC 中断处理完成。传统模式下主流配置写入后硬件自动完成两项工作降低当前运行优先级清除中断激活状态强制规则中断嵌套场景必须按 “后响应、先结束” 的顺序写入否则会引发异常。GICC_RPR 运行优先级寄存器抢占判断依据只读寄存器硬件自动维护软件一般只读取、不手动修改。作用实时记录当前 CPU 上所有正在处理中断里的最高优先级核心用途作为中断抢占的判断基准举例当前运行优先级为 0x30新中断优先级 0x10更高→ 允许嵌套抢占新中断优先级 0x40更低→ 排队等待。GICC_HPPIR 最高挂起中断寄存器只读寄存器用于查询当前优先级最高的待处理中断。特点读取该寄存器不会触发中断应答仅做状态查询用途调试、轮询式中断处理场景。