I.MX6U 的 GPIO 一共有 5 组:GPIO1、GPIO2、GPIO3、GPIO4 和 GPIO5,
GPIO1 有 32 个 IO,
GPIO2 有 22 个 IO,
GPIO3 有 29 个 IO、
GPIO4 有 29 个 IO,
GPIO5有 12 个 IO,
这样一共有 124 个 GPIO
重要寄存器:以GPIO1_IO00举例
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00//复用寄存器
IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00
其中IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00主要配置IO复用为什么功能,或是IIC或是普通IO或者其它
如图所示:此寄存器的低四位决定IO复用的功能
接下来是IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00寄存器,先上图
此寄存器低16位需要我们配置
HYS(bit16)用来使能迟滞比较器
IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整形的话可以使
能此位。此位为 0 的时候禁止迟滞比较器,为 1 的时候使能迟滞比较器。
PUS(bit15:14) :选择上拉或下拉电阻阻值
00-100k下拉
01-47K上拉
10-100K上拉
11-22K上拉
PUE(bit13):设置 IO 使用上下拉还是状态保持器
当为 0 的时候使用状态保持器,当为 1 的时候使用上下拉,状态保持器在IO 作为输入的时候才有用,故名思意,就是当外部电路断电以后此 IO 口可以保持住以前的状态。
PKE(bit12) :使能或者禁止上下拉/状态保持器功能
为0 时禁止上下拉/状态保持器,为 1 时使能上下拉和状态保持器。
ODE(bit11):禁止或者使能开路输出
此位为 0 的时候禁止开路输出,当此位为 1 的时候就使能开路输出功能,输出模式有效
(bit10:8):保留
该字段保留
SPEED(bit7:6) :设置 IO 速度
00-低速50M
01-中速100M
10-中速100M
11-高速20M
DSE(bit5:3):设置 IO 的驱动能力
000 输出驱动关闭
001 R0(3.3V 下 R0 是 260Ω,1.8V 下 R0 是 150Ω,接 DDR 的时候是 240Ω)
010 R0/2
011 R0/3
100 R0/4
101 R0/5
110 R0/6
111 R0/7
(bit2:1):保留
该字段保留
SRE(bit0) :设置压摆率
当此位为 0 的时候是低压摆率,当为 1的时候是高压摆率。这里的压摆率就是 IO 电平跳变所需要的时间,比如从 0 到 1 需要多少时间,时间越小波形就越陡,说明压摆率越高;反之,时间越多波形就越缓,压摆率就越低。如
果你的产品要过 EMC 的话那就可以使用小的压摆率,因为波形缓和,如果你当前所使用的 IO
做高速通信的话就可以使用高压摆率。
如果我们要使用IO来点亮一个LED,设置完复用功能和一些电气配置后还要对IO进行输入输出配置,先上图
由图可知当 IO 用作 GPIO 的时候需要设置的寄存器,一共有八个:DR、GDIR、PSR、ICR1、ICR2、EDGE_SEL、IMR 和 ISR。
DR:数据寄存器
此寄存器是 32 位的,一个 GPIO 组最大只有 32 个 IO,因此 DR 寄存器中的每个位都对应一个 GPIO。当 GPIO 被配置为输出功能以后,向指定的位写入数据那么相应的 IO 就会输出相应的高低电平,比如要设置 GPIO1_IO00 输出高电平,那么就应该设置 GPIO1.DR=1。当 GPIO被配置为输入模式以后,此寄存器就保存着对应 IO 的电平值,每个位对对应一个 GPIO,例如,当 GPIO1_IO00 这个引脚接地的话,那么 GPIO1.DR 的 bit0 就是 0。
GDIR:方向寄存器
如果要设置 GPIO 为输入的话就设置相应的位为 0,如果要设置为输出的话就设置为 1。比如要设置 GPIO1_IO00 为输入,那么 GPIO1.GDIR=0;
PSR:状态寄存器
读取相应的位即可获取对应的 GPIO 的状态,也就是 GPIO 的高低电平值。功能和输入状态下的 DR 寄存器一样。
ICR1&ICR2:中断控制寄存器
ICR1和ICR2这两个寄存器,都是中断控制寄存器,ICR1用于配置低16个GPIO,ICR2 用于配置高 16 个 GPIO
00-高电平触发中断
01-低电平触发中断
10-上升沿触发中断
11-下降沿触发中断
以GPIO1_IO15为例,如果要设置GPIO1_IO15为上升沿触发中断,那么GPIO1.ICR1=2<<(15*2),
如果要设置 GPIO1 的 IO16~31 的话就需要设置 ICR2 寄存器了
IMR:中断屏蔽寄存器
如果使能某个 GPIO 的中断,那么设置相应的位为 1 即可,反之,如果要禁止中断,那么就设置相应的位为 0 即可。例如,要使能 GPIO1_IO00 的中断,那么就可以设置 GPIO1.MIR=1 即可。
ISR:中断状态寄存器
只要某个 GPIO 的中断发生,那么ISR 中相应的位就会被置 1。所以,我们可以通过读取 ISR 寄存器来判断 GPIO 中断是否发生,相当于 ISR 中的这些位就是中断标志位。当我们处理完中断以后,必须清除中断标志位,清除方法就是向 ISR 中相应的位写 1,也就是写 1 清零。
EDGE_SEL:边沿选择寄存器
EDGE_SEL 寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样是一个 GPIO 对应一个位。如果相应的位被置 1,那么就相当与设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。例如,我们设置 GPIO1.EDGE_SEL=1,那么就表示 GPIO1_IO01 是双边沿触发中断,无论 GFPIO1_CR1 的设置为多少,都是双边沿触发。
配置完输入输出寄存器后还需要使能相应的时钟
CMM 有 CCM_CCGR0~CCM_CCGR6 这 7 个寄存器,这 7 个寄存器控制着 I.MX6U 的所有外设时钟开关,我们以 CCM_CCGR0 为例来看一下如何禁止或使能一个外设的时钟,CCM_CCGR0 结构体如图 8.1.6.1 所示:
CCM_CCGR0 是个 32 为寄存器,其中每 2 位控制一个外设的时钟,比如 bit31:30 控制着
GPIO2 的外设时钟,两个位就有 4 中操作方式。
00 所有模式下都关闭外设时钟。
01 只有在运行模式下打开外设时钟,等待模式和停止模式下均关闭外设时钟。
10 未使用(保留)。
11 除了停止模式以外,其他所有模式下时钟都打开。
如果我们要打开 GPIO2 的外设时钟,那么只需要设置CCM_CCGR0 的 bit31 和 bit30 都为 1 即可,也就是 CCM_CCGR0=3 << 30。反之,如果要关闭GPIO2 的 外 设 时 钟 , 那 就 设 置 CCM_CCGR0 的 bit31 和 bit30 都 为 0 即 可 也就是CCM_CCGR0=0 << 30。CCM_CCGR0~CCM_CCGR6 这 7 个寄存器操作都是类似的,只是不同的寄存器对应不同的外
设时钟而已。
总结一下,要将 I.MX6U 的 IO 作为 GPIO 使用,我们需要一下
几步:
①、使能 GPIO 对应的时钟。
②、设置寄存器 IOMUXC_SW_MUX_CTL_PAD_XX_XX,设置 IO 的复用功能,使其复用
为 GPIO 功能。
③、设置寄存器 IOMUXC_SW_PAD_CTL_PAD_XX_XX,设置 IO 的上下拉、速度等等。
④、第②步已经将 IO 复用为了 GPIO 功能,所以需要配置 GPIO,设置输/输出、是否使用
中断、默认输出电平等。