初识GPIO及其操作
Posted 行稳方能走远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识GPIO及其操作相关的知识,希望对你有一定的参考价值。
i.MX6ULL GPIO 分析
i.MX6 ULL 终结者开发板使用的cpu 是I.MX6ULL,该cpu 的参考手册我们放到了光盘目录的“i.MX6UL终结者光盘资料\\03_开发板硬件资料\\02_芯片资料\\1、I.MX6ULL 芯片资料.zip ”压缩包里面,如图所示:
打开该手册的32 章节“Chapter 32 IOMUX Controller (IOMUXC)”,我们看到32 章节的目录如图所示:
上图中的“IOMUXC_SW_MUC_CTL_PAD_GPIO1_IO00 ”就是GPIO 的命名。其命名格式是“IOMUXC_SW_MUC_CTL_PAD_XX_XX”,其中的XX_XX 就是GPIO 的命名。例如:JTAG_MOD,GPIO1_IO00,UART4_TX_DATA 等。I.MX6ULL 的GPIO 命名是根据IO 所拥有的功能来命名的,比如我们看到GPIO1_IO00,就可以知道这个是GPIO 功能,看到UART4_TX_DATA 就知道这个是串口4 的发送功能。在参考手册的32 章节列出了i.MX6ULL 的所有IO 引脚,我们可以看到具有GPIO 功能的引脚只有“GPIO1_IO00~GPIO1_IO09”这10 路GPIO,实际上i.MX6ULL 的IO 口都是具有复用功能的(一个IO 口可以配置成好几种功能,如果不做配置,会有一种默认的功能)。下面我们看看i.MX6ULL 的IO 引脚复用功能。
我们以“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00”这个IO 为例,打开手册的32.6.7(1568 页)如图所示:
从上图可以看到该IO 对应的配置寄存器“SW_MUX_CTL_PAD_GPIO1_IO00”,寄存器地址是0X20E005C,寄存器为32 位,其中的bit0-bit3(MUX_MODE)这四位是设置IO 引脚复用功能的。从表中我们可以看到GPIO1_IO00 有9 种复用功能,分别对应ALT0-ALT8,其中ALT5 就是作为GPIO1_IO00,如图所示:
从上图中我们可以看到GPIO1_IO00 这个引脚还可以配置成ENET2_REF_CLK2,I2C2_SDA 等功能,这就是IO 的复用功能。
下面我们再来看下“IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA”这个IO 引脚。这个引脚的描述在32.6.29章节(1590 页),如图所示:
从上图可以看到该引脚可以复用成7 种不同的模式。其中ALT5(0101)表示可以复用为GPIO1_IO28。所以我们可以看到i.MX6ULL 的GPIO 不止GPIO1_IO00-GPIO1_IO09 这10 个,其它的IO 也可以复用为GPIO。
在第四章节我们可以看到i.MX6ULL 的GPIO 一共有5 组:GPIO1、GPIO2、GPIO3、GPIO4、GPIO5,其中GPIO1有32 个IO(IO0-IO31),GPIO2 有22 个IO(IO0-IO21),GPIO3 有29 个IO(IO0-IO28),GPIO4 有29个IO(IO0-IO28),GPIO5 有12 个IO(IO0-IO11),这样i.MX6 ULL 一共有124 个GPIO。如果我们想要查看每个IO 能复用成什么功能,可以查看第4 章,如果我们要设置某个IO 的功能,需要查看第32 章。
IO引脚配置
IO 引脚的配置我们需要参考第32 章节,在9.1 章节我们看到每个IO 都有一个“SW_MUX_CTL_PAD_XX_XX”的寄存器,例如SW_MUX_CTL_PAD_GPIO1_IO00。该寄存器在6.1 章节我们介绍了,主要是用来配置IO 引脚的模式。然后我们在该章节看到还有一个“SW_PAD_CTL_PAD_XX_XX ”的寄存器,例如
“SW_PAD_CTL_PAD_GPIO1_IO00”寄存器,如图所示:
从上图可以看到SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是0X20E02E8,他也是一个32 位的寄存器,我们可以看到该寄存器按照位划分成了几种功能设置,如下:
HYS(bit16):用来使能迟滞比较器,当IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整型的话可以使能此位。此位为0 的时候禁止迟滞比较器,为1的时候使能迟滞比较器。
PUS(bit15-bit14)用来设置上下拉电阻的。
PUE(bit13)当IO 作为输入的时候,这个位用来设置IO 使用上下拉还是状态保持器。状态保持器在IO 作为输入的时候才有用,当外部电路断电以后此IO 口可以保持住以前的状态。
PKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
ODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
SPEED(bit7-bit6)当IO 用作输出的时候,此位用来设置IO 速度。
DSE(bit5-bit3)当IO 用作输出的时候用来设置IO 的驱动能力。
SRE(bit0)设置压摆率。
GPIO 配置
在9.1 和9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”用来配置IO 引脚,在本章我们来学习一下GPIO 功能的配置(GPIO 属于IO 引脚中的一种复用功能)。比如GPIO1_IO00 这个IO 可以复用为I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等9 种复用功能,GPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的硬件设计中这个IO 是作为哪种功能来设计的。如果我们把该引脚用来控制LED 发光二极管,那我们的程序就要把这个IO 配置成GPIO 模式,然后我们还需要对GPIO 的功能进行配置,我们可以参考手册的第28 章“General Purpose Input/Output(GPIO)”。在该章节我们可以看到GPIO 的结构如图所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中1 处里面有两个寄存器,这就是我们9.2 章节介绍的配置IO 复用和IO 功能属性的寄存器。2 处表示当IO 作为GPIO 使用的时候,需要配置的寄存器(共有8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、GPIO.IMR、GPIO.ISR,前面9.2 章节我们介绍了i.MX6 ULL 一共有5 组GPIO,每组GPIO 分别有这8 个寄存器,下面我们分别看下这些寄存器:
首先是GPIOx_DR 寄存器,如图所示:
此寄存器是数据寄存器,32 位,每一位对应一个GPIO,当GPIO 配置成输出以后,向对应的位写1,GPIO就会输出高电平,写0,GPIO 就会输出低电平。如果GPIO 设置成输入,那读取这个寄存器对应的位,就可以获取到对应GPIO 的状态(0 或1)。
然后是GPIOx_GDIR 寄存器,如图所示:
该寄存器也是32 位的,每一位对应一个GPIO,该寄存器是用来设置GPIO 是输入还是输出的。(对应的位设置成0,对应的GPIO 设置成输入模式;对应的位设置成1,对应的GPIO 就配置成输出模式了)。
然后是GPIOx_PSR 寄存器,如图所示:
该寄存器也是32 位的,每一位对应一个GPIO,该寄存器是用来读取对应GPIO 的状态(高低电平)。
然后是GPIOx_ICR1 寄存器,如图所示:
该寄存器是中断控制寄存器,每组GPIO 最多有32 个GPIO,该寄存器用来配置低16 个GPIO,此寄存器是32 位的,每两位表示一个GPIO,这两位用来配置中断的触发方式:
00 低电平出发
01 高电平触发
10 上升沿触发
11 下降沿触发
以GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。
然后是GPIOx_ICR2 寄存器,如图所示:
该寄存器也是中断控制寄存器,每组GPIO 最多有32 个GPIO,该寄存器用来配置高16 个GPIO,此寄存器是32 位的,每两位表示一个GPIO,这两位用来配置中断的触发方式:
00 低电平出发
01 高电平触发
10 上升沿触发
11 下降沿触发
以GPIO1_IO17 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。
然后是GPIOx_IMR 寄存器,如图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个GPIO,如果使能某个GPIO 的中断,那么设置这个寄存器对应的位为1 即可。如果禁止某个GPIO 的中断,那么设置这个寄存器的对应位为0。
然后是GPIOx_ISR 寄存器,如图所示:
该寄存器是中断状态寄存器,共有32 位,每位对应一个gpio,只要某个GPIO 的中断产生,那么对应的位就会被置1,我们可以通过读取该寄存器来判断GPIO 的中断是否产生了。当我们处理完中断后,必须要清除对应的中断标志位(像该寄存器相应的位写1,就是清除中断标志位)。
然后是GPIOx_EDGE_SEL,如图所示:
该寄存器用来设置边沿中断,这个寄存器会覆盖ICR1 和ICR2 的设置,同样一个GPIO 对应一位。相应的位被置1,那么就相当于设置了对应的GPIO 是上升沿和下降沿(双边沿)触发。
至此关于GPIO 的所有寄存器我们就介绍完了。
GPIO 时钟
如果使用GPIO,我们必须要使能GPIO 的时钟。i.MX6 ULL 的每个外设的时钟可以独立的使能,我们可以关闭不使用的外设时钟,可以达到节能的目的。如果使用某个外设,我们必须要打开对应的时钟。《I.MX6ULL参考手册》的第18 章“Clock Controller Module (CCM)”是关于i.MX6ULL 时钟的讲解,我们可以看下该章节里面外设时钟的使能寄存器。跟外设时钟使能相关的寄存器有:
CCM_CCGR0
CCM_CCGR1
CCM_CCGR2
CCM_CCGR3
CCM_CCGR4
CCM_CCGR5
CCM_CCGR6
一共7 个。我们来看下CCM_CCGR0 寄存器如何使能一个外设时钟,该寄存器的描述如图所示:
我们从上图可以看到CCM_CCGR0 寄存器是32 位的,每2 位控制一个外设时钟,比如bit1:bit0 控制aips_tz1 的时钟,两位的操作方式如下:
00 //所有模式下都关闭外设时钟
01 //只有在运行模式下打开外设时钟
10 //保留
11 //除了停止模式以外,其他所有模式下时钟都打开
如果我们要打开aips_tz1 的外设时钟,需要设置CCM_CCGR0 的bit1 和bit0 都为1,也就是CCM_CCGR0=3,如果关闭aips_tz1 的外设时钟,CCM_CCGR0 的bit1 和bit0 都设置为0。CCM_CCGR0-CCM_CCGR6 这7 个寄存器的功能都是类似的,也是每两位控制一种外设的时钟,为了便于开发,我们在后面的例程里把所有的外设时钟都使能了。至此关于GPIO 的操作我们可以总结成下面的步骤:
1.使能GPIO 对应的时钟
2.设置IOMUXC_SW_MUX_CTL_PAD_XX_XX 寄存器,把对应的IO 设置成GPIO 功能
3.设置IOMUXC_SW_PAD_CTL_PAD_XX_XX 寄存器,设置GPIO 的上拉下拉,以及驱动能力
4.设置输入还是输出,是否使用中断,以及默认的输出电平
LED 原理分析
i.MX6ULL 终结者开发板板载了一个LED 灯,打开底板的原理图(光盘资料的“i.MX6UL 终结者光盘资料\\03_开发板硬件资料\\01_开发板原理图\\pdf\\ itopmx6ul_terminator_v1_0.pdf”), 原理图如图所示:
从上图可以看到LED2 一段接到了3.3V 电源,另一端接到了GPIO_3(CPU 的GPIO1_IO03)引脚上,当GPIO1_IO03 引脚输出低电平(0)的时候,LED2 会被点亮,当GPIO1_IO03 引脚输出高电平(1)的时候,LED2 会灭掉。
以上是关于初识GPIO及其操作的主要内容,如果未能解决你的问题,请参考以下文章