韦东山《ARM 架构与编程》3-3 IMX6ULL 的 GPIO 操作方法 · 学习笔记
所属课程 :ARM 架构与编程 · 基于 I.MX6ULL
所在章节 :第三章 第一个程序(点亮 LED)· 第 3 节
原视频 :https://video.100ask.net/p/t_pc/course_pc_detail/video/v_5f869f28e4b0e95a89c3f933
整理日期:2026-09-28
目录
- 摘要
- 一、本节在课程中的位置
- [1.1 课程坐标](#1.1 课程坐标)
- [1.2 课程讲授方法](#1.2 课程讲授方法)
- 二、研读一款新芯片的正确姿势
- [2.1 思路概览](#2.1 思路概览)
- [2.2 框图透露的三件事](#2.2 框图透露的三件事)
- [三、CCM:GPIO 时钟门控](#三、CCM:GPIO 时钟门控)
- [3.1 模块定位](#3.1 模块定位)
- [3.2 时钟寄存器清单](#3.2 时钟寄存器清单)
- [3.3 检索建议](#3.3 检索建议)
- 四、IOMUXC:引脚复用与电气属性
- [4.1 复用与功能选择](#4.1 复用与功能选择)
- [4.2 PAD 寄存器不是装饰](#4.2 PAD 寄存器不是装饰)
- [4.3 PAD 配置的副作用](#4.3 PAD 配置的副作用)
- [五、GPIO 模块:方向与数据](#五、GPIO 模块:方向与数据)
- [5.1 核心寄存器](#5.1 核心寄存器)
- [5.2 输出 / 输入寄存器路径](#5.2 输出 / 输入寄存器路径)
- [5.3 与 STM32F103 的横向对比](#5.3 与 STM32F103 的横向对比)
- [六、I.MX6ULL 的 5 组 GPIO](#六、I.MX6ULL 的 5 组 GPIO)
- 七、从手册到代码:寄存器寻址
- 八、本节结论与延伸
- [附录 A:术语速查](#附录 A:术语速查)
- [附录 B:读完本节后的自查清单](#附录 B:读完本节后的自查清单)
摘要
本节把通用框架落到 I.MX6ULL 三块外设:CCM 开通 GPIO 组电源;IOMUXC 的 MUX_CTL/PAD_CTL 完成复用与电气属性;GPIO 模块的 GDIR/DR/PSR 负责方向与电平。同时给出芯片手册检索法与 5 组 GPIO 分布,是从模板迈向具体芯片的衔接课。
一、本节在课程中的位置
1.1 课程坐标
3-3 是把 3-2 的"通用 GPIO 操作框架"落到具体芯片上的第一站:
text
3-1 硬件知识_LED 原理图 ← 硬件层
3-2 GPIO 引脚操作方法概述 ← 通用框架:使能 / 模式 / 方向 / 数值
3-3 IMX6ULL 的 GPIO 操作 ← 本节:把四要素塞到 I.MX6ULL 的三个外设模块里
3-4 IMX6ULL 的 LED 寄存器操作
3-5 IMX6ULL 的 LED 编程
本节同款在 STM32F103 / STM32MP157 版本里也有(IMX6ULL 版多 3-4 寄存器操作、3-5 编程两步;STM32 版只有 3-4 编程)。
1.2 课程讲授方法
课程的切入方式很工程师范:
- 先把"裸机笔记怎么写在硅胶上"的认知方法摆出来------第一步看 datasheet、看芯片手册的框图;
- 再对照 3-2 的四要素,逐模块填进真实寄存器名;
- 最后给出一份"拿到一款新任不记得的芯片也照着能做"的检索清单。
二、研读一款新芯片的正确姿势
2.1 思路概览
拿到一款芯片,首先需要看的是 datasheet。写得好的芯片手册,一般都会有个框图。
本节的认知训练不局限在 I.MX6ULL,而是要建立**"用手册框架图定位 GPIO 操作链路"**的能力------今后换 ARM-A、RISC-V 还是别的厂商芯片,照此方法即可上手。
2.2 框图透露的三件事
芯片手册的框图会立刻回答本节关心的三个问题:
| 框图线索 | 指向 | 应对寄存器 |
|---|---|---|
| 时钟从哪里来 | CCM(Clock Controller Module,时钟控制模块) | 哪一组 GPIO 走 CCM 的哪一位时钟开关 |
| 引脚功能归谁管 | IOMUXC(IOMUX Controller,IO 复用控制器) | 每一个引脚对应的 MUX/PAD 寄存器 |
| 引脚电平由谁驱动 | GPIO 模块 | 方向寄存器 GDIR、数据寄存器 DR、读寄存器 PSR |
换言之,3-2 中的"使能""模式""方向""数值"四要素,在 I.MX6ULL 上分别归属 CCM、IOMUXC、GPIO 三块外设。
三、CCM:GPIO 时钟门控
3.1 模块定位
CCM 是整个芯片的时钟与电源开关中心 ,默认关闭所有外设时钟以省电。GPIO 模块的寄存器在未使能时写入无效,因此本节把它放在链路第一步。
3.2 时钟寄存器清单
IMX6ULL 的时钟门控寄存器共 7 个 ,命名为 CCM_CCGR0~CCM_CCGR6:
- 每组 GPIO 的时钟门控分散在 CCGR0、CCGR1、CCGR6 中(典型分配示例):
| GPIO 组 | 所属 CCM 寄存器 | 备注 |
|---|---|---|
| GPIO1 | CCM_CCGR1 的 bit26~27 |
写 11 开启 |
| GPIO2 | CCM_CCGR0 |
视手册具体位 |
| GPIO3 | CCM_CCGR0 |
视手册具体位 |
| GPIO4 | CCM_CCGR1 |
视手册具体位 |
| GPIO5 | CCM_CCGR6 |
视手册具体位 |
工程上最稳妥的兜底写法是:
CCM_CCGR0~CCM_CCGR6全部写0xFFFFFFFF,把外设时钟一次全开,调试用非常方便;正式发布时再按需精确开启,减小功耗。
3.3 检索建议
要确定 GPIO 组究竟在 CCM 的哪一个寄存器的哪一位,需要:
- 打开芯片手册 → 找到 CCM 章节;
- 在 CCM 的子模块总览里寻找"x GPIO 子模块";
- 顺着子模块描述得到具体寄存器名与位域。
这一步是"看手册"能力的具体演练------芯片可能不同,但检索路径是一样的。
四、IOMUXC:引脚复用与电气属性
4.1 复用与功能选择
IOMUXC 是IOMUX Controller,每个引脚都对应两个寄存器:
| 寄存器 | 作用 | 类比 3-2 |
|---|---|---|
IOMUXC_SW_MUX_CTL_PAD_<引脚名> |
选择引脚的功能:GPIO 还是 UART/I²C 等 | "模式(Mode)"要素 |
IOMUXC_SW_PAD_CTL_PAD_<引脚名> |
配置引脚的电气属性:上下拉电阻阻值、驱动能力、速率等 | 通用模板里没有,但实际工程必做 |
把对应位填成对应的 MUX 值,引脚就工作在目标模式(如 GPIO)。
4.2 PAD 寄存器不是装饰
PAD 寄存器看似次要,却是工程出问题的常见源头。常见字段:
- 上下拉电阻:是否启用、阻值多大;
- 压摆率(Slew Rate):高压摆率=曲线陡、适配高速场景;低压摆率=曲线平缓、适合低速低 EMI;
- 驱动强度 、开漏 、施密特等开关。
例如手册里给出的一个常用 PAD 值 0x10B0:下拉、100 MHz 速率、典型驱动强度、关闭开漏、关闭 HYS。先拷贝常用经验值把灯点起来,再按项目要求微调,是工程上高效的做法。
4.3 PAD 配置的副作用
PAD 配错不一定让 LED 不亮,但可能引发:
- 上拉过强→静态电流偏大;
- 速率过高→EMI 干扰(与 3-2 "输出速率越高 EMI 越大"是同一原理);
- 开漏未关→总线无法拉高。
因此 PAD 配置也要进入"点灯程序",不能漏。
五、GPIO 模块:方向与数据
5.1 核心寄存器
每组 GPIOx 都有一组寄存器,本节最关心:
| 寄存器 | 偏移(参考) | 作用 |
|---|---|---|
GPIOx_GDIR |
0x00 | 方向寄存器:1=输出,0=输入 |
GPIOx_DR |
0x04 | 数据寄存器:输出模式写 0/1 控制电平;输入模式可读 |
GPIOx_PSR |
0x08 | 引脚状态寄存器:只读,读取输入电平 |
GPIOx_ICR / GPIOx_IMR / GPIOx_ISR / GPIOx_EDGE_SEL |
后续章节 | 中断相关 |
注:偏移量与具体位定义以 NXP《I.MX6ULL 参考手册》为准;本表只承担"看哪几个名字"的索引功能。
5.2 输出 / 输入寄存器路径
- 输出方向 :
- 在
GDIR把对应位置 1(设为输出); - 在
DR写1或0,引脚立即输出高 / 低电平。
- 在
- 输入方向 :
- 在
GDIR把对应位置 0(设为输入); - 读
PSR取得当前引脚电平。
- 在
读写注意要点与 3-2 一致:多个引脚共用 DR 寄存器,操作某位不得殃及其他位------可使用读-改-写,或借助寄存器数较少时直接定义专用宏以减少误操作。
5.3 与 STM32F103 的横向对比
| 维度 | STM32F103(参考) | I.MX6ULL |
|---|---|---|
| 时钟使能 | RCC_APB2ENR |
CCM_CCGRx |
| 复用与电气属性 | 简化为 CRL/CRH 配置 |
IOMUXC_SW_MUX_CTL_PAD_* + IOMUXC_SW_PAD_CTL_PAD_* |
| 方向 | CRL/CRH 中的 MODE/CNF 位 |
GPIOx_GDIR(独立寄存器) |
| 输出数据 | GPIOx_ODR,配套 BSRR/BRR |
GPIOx_DR,无独立 set/clr |
| 读输入 | GPIOx_IDR |
GPIOx_PSR |
核心规律一致,差异在寄存器的拆分粒度 和复用与电气属性是否拆成两个寄存器。
六、I.MX6ULL 的 5 组 GPIO
I.MX6ULL 的 GPIO 分 5 组,每组最多 32 个引脚,但实际焊接出来的引脚数因封装而异:
| GPIO 组 | 引脚数 | 引脚范围 |
|---|---|---|
| GPIO1 | 32 | GPIO1_IO0 ~ GPIO1_IO31 |
| GPIO2 | 22 | GPIO2_IO0 ~ GPIO2_IO21 |
| GPIO3 | 29 | GPIO3_IO0 ~ GPIO3_IO28 |
| GPIO4 | 29 | GPIO4_IO0 ~ GPIO4_IO28 |
| GPIO5 | 12 | GPIO5_IO0 ~ GPIO5_IO11 |
命名方式:
GPIO<组号>_IO<组内编号>,例如GPIO1_IO03表示 GPIO1 组的第 3 号引脚,3-1 阶段看原理图时记下的"PC13"在这里就是"GPIOx_IO04"的另一种说法。
七、从手册到代码:寄存器寻址
本节的后半段把"看手册"落到了"找地址":
- 手册的"存储器映射"章节:给出每个外设的基地址;
- 手册的"GPIO 章节"或"IOMUXC 章节":给出寄存器偏移地址;
- 真实地址 = 基地址 + 偏移地址;
- C 语言中 :用宏
((volatile unsigned int *)0x0209C000)之类的写法把地址映射成可读写的寄存器变量。
课程给出了一个工程化的小贴士:
IMX6ULL 有官方 SDK 包,可以直接拿过来用,不用自己写每个寄存器的宏定义。但仅限 IMX6ULL------其他芯片没有,所以要习惯自己写头文件、定义寄存器宏。
这是从"复用到位的脚手架"到"不依赖脚手架"的关键一步,也是后面 RTOS / U-Boot / Linux 驱动的入门基本功。
八、本节结论与延伸
把本节内容再压成一张链路图:
text
+-----------------------+
| 3-1 已解决 |
| 控制引脚 = PC13 |
| 高 / 低电平点亮 |
+----------+------------+
|
v
+----------+ CCM +---------+ IOMUXC +-----------+
| 通用框架 |------->| CCGRx |---------->| MUX_CTL |
| 3-2 四要素| 时钟 | GPIO 组| 复用选择 | PAD_CTL |
+----------+ +---------+ +-----------+
| |
| v
| +-------------+
+-----> GPIO 模块 | GDIR 方向 |
| DR 数据 |
| PSR 读 |
+-------------+
三点延伸:
- "看手册"是嵌入式工程师的第一生产力:本节显式把"读框图 → 找子模块 → 查寄存器"这条检索链路交给你;
- 3-2 模板与本节寄存器名字一一对应,换芯片时只要把右栏寄存器名换一下,模板依旧成立;
- 官方 SDK 是甜的、但不是生产力的根 :建议在裸机学习阶段手动写一遍寄存器宏,为后续的 Linux 驱动 / U-Boot 学习打基础。
附录 A:术语速查
| 术语 | 含义 |
|---|---|
| CCM | Clock Controller Module,IMX6ULL 的时钟控制模块 |
| IOMUXC | IOMUX Controller,IO 复用控制器 |
| MUX_CTL | 选定引脚功能(是 GPIO 还是其他外设)的寄存器 |
| PAD_CTL | 配置引脚电气属性的寄存器(上下拉、速率、驱动强度等) |
| GDIR | GPIO Direction 寄存器,1=输出 / 0=输入 |
| DR | Data Register,GPIO 数据寄存器(输出写、输入读) |
| PSR | Pad Status Register,输入电平只读寄存器 |
| CCGRx | CCM 时钟门控寄存器(CCM_CCGR0~CCM_CCGR6) |
| 压摆率 | 信号边沿的陡峭程度,高速通信场景才需要 |
| 基地址 + 偏移 | IMX6ULL 寄存器寻址的固定套路 |
附录 B:读完本节后的自查清单
- 能用一句话说明 CCM、IOMUXC、GPIO 三块外设各自承担 3-2 通用框架的哪个要素。
- 能说出 I.MX6ULL 的 5 组 GPIO 及其引脚范围。
- 能解释为什么 CCM 全部写
0xFFFFFFFF是调试利器,但生产环境不推荐。 - 能写出"MUX_CTL、PAD_CTL、GDIR、DR、PSR"这五个寄存器各自的作用。
- 能解释为什么 PAD_CTL 漏配会让 LED "看似亮"但留有隐患。
- 拿到一款没学过的芯片,知道先看手册框图,再按 CCM/IOMUX/GPIO 三步检索 GPIO 配置。
本文档依据课程公开目录、原视频页信息及公开学习笔记整理,配合原视频 3-3 使用。