韦东山《ARM 架构与编程》3-3 IMX6ULL 的 GPIO 操作方法 · 学习笔记

韦东山《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 课程讲授方法

课程的切入方式很工程师范:

  1. 先把"裸机笔记怎么写在硅胶上"的认知方法摆出来------第一步看 datasheet、看芯片手册的框图;
  2. 再对照 3-2 的四要素,逐模块填进真实寄存器名;
  3. 最后给出一份"拿到一款新任不记得的芯片也照着能做"的检索清单。

二、研读一款新芯片的正确姿势

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 的哪一个寄存器的哪一位,需要:

  1. 打开芯片手册 → 找到 CCM 章节;
  2. 在 CCM 的子模块总览里寻找"x GPIO 子模块";
  3. 顺着子模块描述得到具体寄存器名与位域。

这一步是"看手册"能力的具体演练------芯片可能不同,但检索路径是一样的。


四、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 输出 / 输入寄存器路径

  • 输出方向 :
    1. 在 GDIR 把对应位置 1(设为输出);
    2. 在 DR 写 1 或 0,引脚立即输出高 / 低电平。
  • 输入方向 :
    1. 在 GDIR 把对应位置 0(设为输入);
    2. 读 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"的另一种说法。


七、从手册到代码:寄存器寻址

本节的后半段把"看手册"落到了"找地址":

  1. 手册的"存储器映射"章节:给出每个外设的基地址;
  2. 手册的"GPIO 章节"或"IOMUXC 章节":给出寄存器偏移地址;
  3. 真实地址 = 基地址 + 偏移地址;
  4. 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  读    |
                                                  +-------------+

三点延伸:

  1. "看手册"是嵌入式工程师的第一生产力:本节显式把"读框图 → 找子模块 → 查寄存器"这条检索链路交给你;
  2. 3-2 模板与本节寄存器名字一一对应,换芯片时只要把右栏寄存器名换一下,模板依旧成立;
  3. 官方 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 使用。

相关推荐
浩瀚地学1 小时前
deepagents学习打卡day07
经验分享·笔记·python·学习·agent
2601_962219011 小时前
操作日志全留存架构:万象生鲜系统生鲜业务合规审计底层实现方案
微服务·云原生·架构
Awh-1 小时前
ARM 裸机开发 DAY5 学习笔记
arm开发·笔记·学习
张彦峰ZYF1 小时前
查询接口调优:无缓存、强实时约束下的系统化性能工程
架构·业务缓存与数据库缓冲机制·强一致、读己之写·读己之写和有界陈旧语义·端到端延迟分段·一致性路由
海宇数据1 小时前
零信任架构实战:基于海宇车型识别精准构建自动化违章处理网关
运维·人工智能·架构·自动化
CubeSandbox2 小时前
沙箱是选项,不是标配:花椒 Agent 平台的架构思考与 Cube 实践
大数据·人工智能·架构
Eloudy2 小时前
全文 - 第 01 章 CHI Issue.B specification
arm开发·issue
李游Leo2 小时前
HarmonyOS 7 + ArkUI + Adaptive Layout 学习笔记:折叠屏多形态布局适配与窗口状态响应机制【鸿蒙心迹】
笔记·学习·harmonyos
Dawson Zhu2 小时前
一种多Agent权限管控与风险控制架构
人工智能·语言模型·架构·aigc·agi