嵌入式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

相关推荐
如若123几秒前
《在 Ubuntu 22.04 上安装 CUDA 11.8 和 Anaconda,并配置环境变量》
linux·运维·ubuntu
zyx没烦恼1 小时前
Linux 下 日志系统搭建全攻略
linux·服务器·开发语言·c++
Tee xm1 小时前
清晰易懂的 Flutter 开发环境搭建教程
linux·windows·flutter·macos·安装
不摆烂选手1 小时前
Ubuntu之Makefile入门
linux·ubuntu·makefile·正点原子imx6ull学习笔记
码上飞扬2 小时前
深入探索 Linux Top 命令:15 个实用示例
linux·运维·服务器
zkyqss2 小时前
OpenStack Yoga版安装笔记(十七)安全组笔记
linux·笔记·openstack
愚润求学4 小时前
Linux开发工具——gcc
linux·服务器·开发语言
照书抄代码4 小时前
Linux中用gdb查看coredump文件
linux·运维·服务器
一大Cpp4 小时前
随笔1 认识编译命令
linux·opencv·ubuntu
ℳℓ白ℳℓ夜ℳℓ4 小时前
Linux网络应用层自定义协议与序列化
linux·运维·服务器