嵌入式Linux驱动—— 1 GPIO配置

目录

1.GPIO操作

[1.1 IO命名](#1.1 IO命名)

[1.2 GPIO 时钟使能(CCM)](#1.2 GPIO 时钟使能(CCM))

[1.3 IO 复用(IOMUXC)](#1.3 IO 复用(IOMUXC))

[1.4 IO 配置](#1.4 IO 配置)

[1.5 GPIO 配置](#1.5 GPIO 配置)


1.GPIO操作

GPIO操作主要是以下流程:

  1. 使能某组GPIO模块(GPIO1、2、...)(配置CCM寄存器)
  2. 配置 IO 的复用功能和参数(配置 IOMUXC寄存器)
  3. 配置GPIO(配置DR、GDIR、PSR...寄存器)

主要是配置相关寄存器,相关寄存器及其配置如下:

1.1 IO命名

形如 "IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00" 的就是 GPIO 命名,命名形式就是"IOMUXC_SW_MUC_CTL_PAD_XX_XX",后面的 "XX_XX" 就是 GPIO 命名

IMX6ULL 的 GPIO 并不像 STM32 一样以 PA0~15 这样命名,他是根据某个 IO 所拥有的功能来命名的

比如:我们一看到 GPIO1_IO01 就知道这个肯定能做 GPIO,看到 UART1_TX_DATA 肯定就知道这个 IO 肯定能做 为 UART1 的发送引脚。

不过虽然IO的名字不同,但实际上他们都可以复用为GPIO(就是一个引脚多种功能)

1.2 GPIO 时钟使能(CCM)

CMM 有 CCM_CCGR0~CCM_CCGR6 这 7 个寄存器,这 7 个寄存器控制着 IMX6U 的所有外设时钟开关

我们以 CCM_CCGR0 为例来看一下如何禁止或使能一个外设的时钟

CCM_CCGR0 是个 32 位寄存器,其中每 2 位控制一个外设的时钟,比如 bit31:30 控制着 GPIO2 的外设时钟,两个位就有 4 种操作方式:

根据上述,如果我们要打开 GPIO2 的外设时钟,那么只需要设置 CCM_CCGR0 的 bit31 和 bit30 都为 1 即可 ,反之,如果要关闭 GPIO2 的外设时钟 , 那就设置 CCM_CCGR0 的 bit31 和 bit30 都为 0 即可 。

1.3 IO 复用(IOMUXC)

以"IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00"这个 IO 寄存器为例:

可以看出,这是一个32位的寄存器,但是只用到了最低 5 位,地址为 0X020E005C

bit0~bit3 (MUX_MODE) 就是设置 GPIO1_IO00 的复用功能的。GPIO1_IO00 一共可以复用为 9 种功能 IO,分别对应 ALT0~ALT8,其中 ALT5 就是作为 GPIO1_IO00

其实就是配置这个寄存器:

a) IOMUXC_SW_MUX_CTL_PAD_<PAD_NAME>:Mux pad xxx,选择某个 IO 引脚的功能

b) IOMUXC_SW_MUX_CTL_GRP_<GROUP_NAME>:Mux grp xxx,选择某组引脚的功能(这是配置一整组的)

IMX6U的 GPIO 一共有5组:GPIO1、GPIO2、GPIO3、GPIO4 和 GPIO5, 其中 GPIO1 有32个 IO,GPIO2 有22个IO,GPIO3 有29个 IO、GPIO4 有 29 个IO,GPIO5 最少,只有12个IO,这样一共有124个GPIO。

详细复用配置可以查阅手册第 32 章"Chapter 32: IOMUX Controller(IOMUXC)"

1.4 IO 配置

我们会发现在《I.MX6UL 参考手册》第 30 章"Chapter 30: IOMUX Controller(IOMUXC)"的书签中,每一个 IO 会出现两次,它们的名字差别很小,比如 GPIO1_IO00 有如下两个书签:

IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00

IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00

上面两个都是跟 GPIO_IO00 有关的寄存器,名字上的区别就是红色部分

一个是"MUX", 一个是"PAD"。IOMUX_SW_MUX_CTL_PAD_GPIO1_IO00 前面已经说了,是用来配置 GPIO1_IO00 复用功能的

那么 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00 是做什么的呢?

可以看出,IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00 也是个32 位寄存器,地址为 0X020E02E8。只用到了其中的低 17 位

这个寄存器其实就是用来配置引脚参数的:

a) **IOMUXC_SW_PAD_CTL_PAD_<PAD_NAME>:**pad pad xxx,设置某个IO引脚的参数

b) **IOMUXC_SW_PAD_CTL_GRP_<GROUP NAME>:**pad grp xxx,设 置某组引脚的参数

**寄存器不同的位代表了不同的参数,**具体配置了哪些参数可以看正点原子的手册

1.5 GPIO 配置

IOMUXC_SW_MUX_CTL_PAD_XX_XX 和 IOMUXC_SW_PAD_CTL_PAD_XX_XX 这两 种寄存器都是配置 IO 的,注意是 IO!不是 GPIO,GPIO 是一个 IO 众多复用功能中的一种。

将其复用为 GPIO 以后还 需要对其 GPIO 的功能进行配置

PS:关于 I.MX6U 的 GPIO 请参考《IMX6UL 参考手册》的第 26 章"Chapter 26 General Purpose Input/Ouput (GPIO)"

当 IO 用作 GPIO 的时候需要设置的寄存器,一共有八个: DR、GDIR、PSR、ICR1、ICR2、EDGE_SEL、IMR 和 ISR。

DR 寄存器:数据寄存器

此寄存器是 32 位的,一个 GPIO 组最大只有 32 个 IO,因此 DR 寄存器中的每个位都对应 一个 GPIO。

当 GPIO 被配置为输出功能以后,向指定的位写入数据那么相应的 IO 就会输出相 应的高低电平

当 GPIO 被配置为输入模式以后,此寄存器就保存着对应 IO 的电平值,每个位对对应一个 GPIO
GDIR 寄存器:方向寄存器

GDIR 寄存器也是 32 位的,此寄存器用来设置某个 IO 的工作方向,是输入还是输出。

每个 IO 对应一个位,如果要设置 GPIO 为输入的话就设置相应的位为 0,如果要设置为输出的话就设置为 1。

比如要设置 GPIO1_IO00 为输入,那么 GPIO1.GDIR=0;
PSR 寄存器:状态寄存器

PSR 寄存器也是一个 GPIO 对应一个位,读取相应的位即可获取对应的 GPIO 的状 态,也就是 GPIO 的高低电平值。功能和输入状态下的 DR 寄存器一样。

ICR1、ICR2、EDGE_SEL、IMR 和 ISR都是跟中断相关的寄存器,详细可以看正点原子手册P313

相关推荐
Doro再努力15 分钟前
Vim 快速上手实操手册:从入门到生产环境实战
linux·编辑器·vim
wypywyp21 分钟前
8. ubuntu 虚拟机 linux 服务器 TCP/IP 概念辨析
linux·服务器·ubuntu
Doro再努力37 分钟前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene41 分钟前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
忧郁的橙子.1 小时前
02-本地部署Ollama、Python
linux·运维·服务器
醇氧1 小时前
【linux】查看发行版信息
linux·运维·服务器
No8g攻城狮2 小时前
【Linux】Windows11 安装 WSL2 并运行 Ubuntu 22.04 详细操作步骤
linux·运维·ubuntu
XiaoFan0122 小时前
免密批量抓取日志并集中输出
java·linux·服务器
souyuanzhanvip2 小时前
ServerBox v1.0.1316 跨平台 Linux 服务器管理工具
linux·运维·服务器
HalvmånEver3 小时前
Linux:线程互斥
java·linux·运维