当前位置: 首页 > news >正文

IM6ULL芯片

介绍

这个芯片很火,被广泛应用于工业领域PLC,工业网关,HMI。其次在消费电子和医疗等其他领域特=也占有一席之地。

表格

项目规格亮点
核心架构单核 ARM Cortex-A7相比 Cortex-A9 功耗降低约 50%,性能满足轻量级 Linux 应用
主频最高 900MHz(常见 800MHz)平衡性能与功耗,工业场景稳定运行
缓存128KB L1(I/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 ~ ...... ] 用户代码 → 你的裸机程序

IVT(Image 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:固定为0x000000D1,Boot ROM 通过这个值识别 IVT 的位置,写错的话镜像直接无法启动。
entry:你的裸机程序_start函数的地址,必须是DDR 中的物理地址(比如0x87801000,程序加载到 DDR 的位置)。
self:IVT 自身在 DDR 中的地址,比如0x87800000,Boot ROM 会校验这个地址,确认镜像加载正确。
dcd/boot_data:指向 DCD 和 BOOT DATA 的 DDR 地址,必须和实际位置对应。

时钟树

时钟来源

时钟来源

IMX6ULL 的时钟系统采用 "晶振输入 → 主 PLL 倍频 → PFD 精细分频 → 总线选择器 → 外设分频" 的四级架构。你这张图展示的是前两级:从 24MHz 晶振到各个 PLL 及 PFD 分支的输出,是整个时钟树的根。

序号 PLL 名称 默认输出频率 核心用途 对应图中标号。

  1. ARM_PLL 792MHz 给 ARM Cortex-A7 内核提供时钟。
  2. 528_PLL (System PLL) 528MHz 系统总线主时钟源,所有 AXI/AHB/IPG 时钟都来自它。
  3. USB1_PLL (480_PLL) 480MHz USB1 控制器、SDIO、CAN 等外设。
  4. USB2_PLL 480MHz USB2 控制器 。
  5. ENET_PLL 500MHz 以太网控制器 。
  6. VIDEO_PLL 650MHz LCD 显示、CSI 摄像头接口 。
  7. AUDIO_PLL 650MHz I2S、SAI 音频接口 。

IMX6ULL 的所有 7 个主 PLL 的主输出频率都是固定的,没有一个是软件可编程倍频的。这是 IMX6 系列时钟系统的一个重要设计特点。所有 PLL 都可以通过 bypass_sel 选择这三个输入源中的任意一个。OSC24M:芯片外部的 24MHz 无源晶振,是系统默认的主时钟源。
CLK1/CLK2:外部输入时钟引脚,用于特殊场景(比如外接高精度时钟)。

时钟去向

时钟去向

然后528_PLL,480_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_CLK:AHB总线的时钟,其下面挂载了。USB/以太网/Can控制器。此外,其另一个功能是作为IPG和PERCLK的时钟源。

PERCLK:只给特定的低速外设提供功能工作时钟,以下外设的功能工作时钟(用于计数、波特率生成、位时钟生成等)来自 PERCLK_CLK_ROOT:

  1. 定时器:EPIT1/EPIT2、GPT(计数时钟)
  2. 串口:UART1~UART8(波特率生成时钟)
  3. I2C:I2C1~I2C4(位时钟生成时钟)
  4. SPI:ECSPI1~ECSPI4(SPI 时钟生成)
  5. PWM:PWM1~PWM8(PWM 计数时钟)
  6. KPP 键盘控制器(按键扫描时钟)
  7. TSC 触摸屏控制器(触摸检测时钟)

IPG_CLK:所有外设的寄存器访问时钟(100% 覆盖),不管这个外设的功能工作时钟来自哪里(USB、以太网、音频、显示等),只要你读写它的控制寄存器、数据寄存器、状态寄存器,就必须用到 IPG 时钟,没有 IPG 时钟,CPU 根本无法与任何外设通信。 部分外设的功能工作时钟 除了寄存器访问,以下几个外设的核心工作时钟也直接使用 IPG_CLK_ROOT:GPIO1~GPIO5(输入输出检测、电平翻转),ADC1/ADC2(模数转换时钟)。

Cortext_A中断原理

GIC中断控制器

Distributor:全局中断总控单元

Distributor 是整个 GIC 的全局中枢,全系统只有一套逻辑实例(多核下共享),负责收集所有中断源、管理中断状态、完成优先级排序CPU 目标路由,最终将合格的中断转发给对应 CPU 的 CPU Interface 单元。

核心职责

  1. 全类型中断统一管理:覆盖 SGI(软件生成中断)、PPI(私有外设中断)、SPI(共享外设中断)三类中断。
  2. 全局中断开关:按分组控制所有中断是否向 CPU Interface 转发。
  3. 中断状态维护:管理每个中断的「未生效 - 挂起 - 激活 - 激活且挂起」全生命周期状态。
  4. 中断属性配置:优先级、触发方式(电平 / 边沿)、目标 CPU 核。
  5. 软件中断触发:提供寄存器直接触发 SGI 核间中断。
  6. 系统能力查询:提供硬件实现的中断线数量、CPU 接口数量、版本、厂商等信息。

寄存器组织

GICD_CTLR(分发器控制寄存器)
全局中断转发的总开关,支持按分组独立控制,GICv1 无安全扩展:仅 bit0 Enable 全局控制所有中断转发。GICv2 / 带安全扩展的 GICv1:EnableGrp0(bit0)控制 Group 0 中断转发,EnableGrp1(bit1)控制 Group 1 中断转发;两组独立开关,关闭时对应分组的中断不会递交给 CPU Interface。

GICD_TYPER(中断控制器类型存器)
只读,反映硬件实现规格:ITLinesNumber(bit4:0):最大支持中断数 = 32*(N+1),上限 1020 个。CPUNumber(bit7:5):CPU 接口数量 = N+1,最多 8 个。SecurityExtn(bit10):是否实现安全扩展。LSPI(bit15:11):支持锁定的共享中断数量,安全扩展下的配置锁定功能。

状态类寄存器(按 32 个中断一组组织)
每类寄存器都有多组(n 为组号),对应 32 个中断,每个中断占 1 位:

GICD_IGROUPRn:中断分组配置,0=Group0,1=Group1;安全态下可写,非安全态读零。

中断状态转移图

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 表示该中断路由到对应 CPU;SGI 和 PPI 的目标寄存器只读,固定指向当前 CPU。
GICD_ICFGRn:每个中断 2 位配置,其中高位控制触发方式:0 = 电平触发,1 = 边沿触发;SGI 固定为边沿触发,对应位只读。
GICD_SGIR(软件生成中断寄存器):只写寄存器,用于核间通信触发 SGI。SGIINTID(bit3: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 的中断应答、结束操作,维护当前运行时优先级。

核心职责

  1. 中断掩码过滤:屏蔽低于优先级阈值的中断,不递交给 CPU。
  2. 抢占裁决:拆分优先级为「组优先级 + 子优先级」,仅组优先级更高的中断才能触发嵌套。
  3. 中断应答:CPU 读取中断号时,自动完成中断状态从挂起到激活的切换
  4. 中断结束处理:CPU 处理完成后,清除激活状态、恢复运行优先级。
  5. 运行时优先级维护:跟踪当前 CPU 的最高激活中断优先级,作为抢占判断基准。

寄存器架构


CPU Interface 寄存器地址偏移相对于 CPU 接口基地址,每个 CPU 拥有独立的寄存器基地址(或通过硬件路由自动访问本核副本)。

GICC_CTLR | CPU 接口控制寄存器(总开关 + 模式配置)
这是 GICC 的总控制寄存器,用于配置接口整体工作模式,日常初始化必配。
核心功能
分组使能:单独开启 / 关闭 Group0、Group1 两类中断,可整组屏蔽中断;
FIQ 路由:选择 Group0 中断使用快速 FIQ 还是普通 IRQ(Group1 固定走 IRQ);
EOI 模式:中断结束的工作模式,绝大多数裸机、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 | 最高挂起中断寄存器
只读寄存器,用于查询当前优先级最高的待处理中断。
特点:读取该寄存器不会触发中断应答,仅做状态查询;
用途:调试、轮询式中断处理场景。

http://www.zskr.cn/news/1514960.html

相关文章:

  • 大模型对齐与价值观安全深度解析:从RLHF到Constitutional AI的可扩展对齐攻防实战
  • 2026年TC4钛饼选材指南:行业格局、关键参数与供应商能力解析 - 优质品牌商家
  • AI写教材工具实测:低查重产出,快速生成高质量教材书稿!
  • Sqribble文档自动化:面向内容结构的确定性排版系统
  • 2026年上海劳动纠纷律师哪家好?5位实战派律师详细推荐 冯婉律师值得信赖 - 本地品牌推荐
  • 小红书数据采集架构深度解析:5大高性能设计策略与企业级实战指南
  • 2026年电话营销外呼工具排行榜:高接通率品牌深度解析
  • 告别点不准!手把手优化el-cascader单选体验:扩大点击区域与自动加载子节点
  • AutoJs6安卓自动化脚本开发完整指南:从入门到实战
  • 浙江大学毕业论文LaTeX模板:从零到专业排版的完整指南
  • 终极Obsidian导出指南:3步轻松将笔记迁移到标准Markdown格式
  • Sqribble文档操作系统:模板即代码的自动化排版原理与实战
  • 计算机毕业设计之医疗大数据分析与管理平台
  • 数据科学三问法:What How Why驱动业务价值落地
  • 5分钟掌握语雀文档批量导出:免费工具完全指南
  • 知识融合潜在空间模型(KELP)在高维稀疏数据分析中的应用
  • MuleSoft AI编排:用连接确定性驯服LLM推理不确定性
  • Agents(角色制衡)
  • 踩坑实录:在React项目里用pptx.js预览PPT,我遇到的3个坑和解决方案
  • Transformer注意力机制代码级解析:QKV、缩放因子与因果掩码
  • 避坑指南:YOLOv8转RKNN(RV1109/1126)时,为什么你的模型检测不到目标?
  • Layerdivider:5分钟将单张图片转换为可编辑PSD图层的终极指南
  • 保姆级教程:InVEST 3.13.0中文版从下载到跑通第一个模型(附样例数据下载避坑指南)
  • 魔兽争霸III终极兼容方案:WarcraftHelper一键解决现代系统六大兼容性问题
  • 2026年比较好的东莞高频电容/低阻电容/东莞长寿命电容厂家精选合集 - 行业平台推荐
  • 从原理图到驱动代码:MTK DWS中GPIO配置的完整工作流解析(以UART/I2C为例)
  • 保姆级教程:在RK3588开发板上用RGA库实现YUV转RGB,CPU占用率实测不到30%
  • 终极AMD处理器调校指南:如何用SMU调试工具解锁Ryzen隐藏性能
  • Python+Bootstrap 5.3快速原型开发:零前端基础搭建可交互反馈页
  • 2026年热门的低阻电容/东莞电源电容/东莞低阻电容/高分子电容厂家综合对比分析 - 品牌宣传支持者