IMX6ULL的GPIO共有5组,分别为GPIO1、GPIO2、GPIO3、GPIO4、GPIO5,而每组GPIO下又有多个IO,个中GPIO1有32个IO、GPIO2有22个IO、GPIO3有29个IO、GPIO4有29个IO、GPIO5有12个IO,统共有124个IO。
IMX6ULL的GPIO在利用前须要进行配置,与STM32类似,首先须要使能GPIO的时钟源,其次对付IO的复用功能配置,末了配置GPIO的输入输出功能。

一、使能GPIO时钟源
IMX6ULL的外设时钟设置,在参考手册《i.MX 6ULL Applications Processor Reference Manual》中的“Chapter 18:Clock Controller Module(CCM)”中配置,外设时钟使能干系的寄存器如下7个:CCM_CCGR0~CCM_CCGR6这7个寄存器。
每个CCM_CCGR都是32位寄存器,每2位掌握一个外设的时钟开关,32位可以掌握16个外设(CG0~CG15),如下图的CCM_CCGR寄存器的构造:
对付CCM_CCGR0寄存器,其所掌握的16个外设如下图所示:
由于每2位掌握一个外设,因此共有4种可能的时钟配置,如下图所示:
如上所示,GPIO2由CCM_CCGR0的位(31-30)配置,其它GPIO1~GPIO5也分别在CCM_CCGR1~6中的对应位配置,如下表所示:
二、IO复用与配置
IO复用与配置在参考手册《i.MX 6ULL Applications Processor Reference Manual》中的“Chapter 32:IOMUX Controller(IOMUXC)”中配置。
每个IO引脚都有2个专门的配置寄存器,寄存器名称格式为:
个中“XXXX”表示对应的引脚名称,对应于引脚图中某个引脚所有功能的第一个功能,如下2图所示:
A、如上GPIO1_IO00引脚可以复用为I2C2_SCL、GPT1_CAPTURE等功能,对应的寄存器为:
B、如上ENET1_TX_DATA0引脚可以复用为UART5_CTS、CSI_DATA19等功能,对应的寄存器为:
2.1、IOMUXC掌握器时钟
在配置IOMUXC掌握器前,须要使能该掌握器的时钟源,即CCM_CCGR4(bit3:2)。
2.2、IO的复用
每个IO都可以复用为其它外设功能,最多可配置8种, 通过IOMUXC_SW_MUX_CTL_PAD_XXXX寄存器进行配置,以GPIO1_IO00引脚为例,即以IOMUXC_SW_MUX_CTL_PAD_ GPIO1_IO00寄存器进行配置,如下图所示:
该寄存器地址为0X020E005C,是32位寄存器,只用到低5位,个中bit0~bit3(MUX_MODE)用于配置引脚GPIO1_IO00复用功能的。GPIO1_IO00可以复用ALT0~ALT8这个9个功能。初始默认为ALT5,即GPIO1_IO00功能,如果须要配置为I2C2_SCL时,将bit0~bit3(MUX_MODE)设置为ALT0即可。
其它引脚的复用配置类似。
2.3、IO的配置
IO配置是对IO引脚的参数,比如上/下拉、驱动能力等进行配置,以GPIO1_IO00引脚为例,即以IOMUXC_SW_PAD_CTL_PAD_ GPIO1_IO00寄存器进行配置,如下图所示:
该寄存器地址为0X020E02E8,是32位寄存器,只用到低17位,这些位分别用于配置IO的详细参数,如下图所示:
这些参数所配置的IO对应的功能图如下图所示:
2.3.1、HYS(bit16):迟滞比较器
迟滞比较器使能时,可以对输入的旗子暗记进行防抖,对付波形整形有帮助,其事情事理如下图所示:
比较器的门限范围是Vt-~Vt+,当输入电压Vi从在Vt-~Vt+范围内,输出并不会跳变,因此输入电压Vi从在Vt-~Vt+范围内的抖动,不会影响到输出;当Vi上升到Vt+时,输出Vo才跳到高电平,当Vi低落到Vt-时,输出Vo才跳到低电平,如下整形波形图;
2.3.2、高下拉/保持器(PKE(bit12)、PUE(bit13)、PUS(bit15:14))
2.3.2.1、高下拉功能配置
1、首先使能高下拉/保持器功能,PKE=1;
2、然后将PUE=1,使能高下拉,禁止保持器;
3、通过PUS配置高下拉电阻,如下图所示:
2.3.2.2、保持器功能配置
1、首先使能高下拉/保持器功能,PKE=1;
2、然后将PUE=0,使能保持器,禁止高下拉;
输入保持器:
当外部电路断电时,输入保持器保存断电前的IO状态,内核可以随时读取IO状态;输入保持器始终使能。
输出保持器:当内核休眠断电时,输出保持器保持休眠前的IO状态,能够连续掌握外部电路不受影响,输出保持器由PUE掌握使能。
2.3.3、开漏输出(ODE(bit11))
IO输出时,可以配置为开漏输出,这样就须要内部上拉【PUE(bit13)、PUS(bit15:14)】,或外部上拉,否则无法输出高电平;一样平常在多设备挂在总线通信上利用。
2.3.4、输出驱动能力DSE(bit5:3)
当IO用作输出时,可以设置输出的电流驱动能力,可设为8个等级,如下图所示:
2.3.5、压摆率(SRE(bit0))
压摆率即IO电平跳变所须要的韶光,比如从0到1跳变须要的韶光越小,波形就越陡,则压摆率高;反之,所须要的韶光越多,波形就越缓,压摆率越低;产品须要过EMC时,压摆率则需低一些,如果是高速通信,则压摆率要高一些。
三、GPIO配置
3.1、IO配置为GPIO功能框图
如上图所示IO配置为GPIO须要两步:1、IO复用与IO配置;2、如果将IO复用为GPIO功能,则还须要进行GPIO配置,如GPIO的输入\输出方向、输入\输出电平、中断掌握等。
3.2、GPIO的功能框图
当IO用作GPIO时,GPIO的配置寄存器有8个,分别为:DR、DGIR、PSR、ICR1、ICR2、EDGE_SEL、IMR、ISR,这些寄存器分两组:一组用于IO状态配置,一组用于IO中断配置,如下图所示:
3.2.1、GPIO状态配置
GPIO状态由DR、GDIR、PSR寄存器进行配置。
GDIR寄存器用于配置GPIO的方向:输入/输出。GDIR寄存器32位,每一位对应一个GPIO;如果要设置GPIO为输入时就设置相应位为0,如果要设置为输出时相应位设置为1,如下图所示:
DR寄存器也是32位,每位对应一个GPIO。当GPIO 被配置为输出功能往后,向指定的位写入数据,则相应的 IO输出相应的高低电平,比如要设置 GPIO1_IO00输出高电平,那么就该当设置GPIO1.DR=1;当GPIO被配置为输入功能往后,此寄存器就保存着对应 IO的电平值,每个位对应一个 GPIO;比如当 GPIO1_IO00这个引脚接地的话,那么 GPIO1.DR 的bit0便是0。
PSR 寄存器也是一个 GPIO 对应一个位,读取相应的位即可获取对应的 GPIO 的状
态,也便是GPIO 的高低电平值。功能和输入状态下的DR 寄存器一样
3.2.2、GPIO中断配置
GPIO中断配置寄存器为:ICR1、ICR2、EDGE_SEL、IMR、ISR。
ICR1与ICR2用于选择中断触发电平,个中ICR1用于IO0~15的配置,ICR2 用于IO16~31的配置,也便是说每个GPIO用两位配置,如下图所示:
IMR 寄存器是中断屏蔽寄存器,用来掌握GPIO的中断禁止和使能,如果使能某个GPIO 的中断,那么设置相应的位为1,如果要禁止中断,那么就设置相应的位为0。例如,要使能 GPIO1_IO00 的中断,那么就可以设置 GPIO1.MIR=1,如下图所示:
ISR是中断状态寄存器,只要某个 GPIO 的中断发生,那么ISR 中相应的位就会被置 1。以是,我们可以通过读取 ISR 寄存器来判断GPIO 中断是否发生,相称于ISR 中的这些位便是中断标志位。当我们处理完中断往后,必须打消中断标志位,打消方法便是向ISR 中相应的位写 1清零,如下图所示:
EDGE_SEL寄存器是边沿选择寄存器,会覆盖 ICR1和 ICR2的设置,如果相应的位被置 1,那么就相称与设置了对应的GPIO是上升沿和低落沿(双边沿)触发。例如,我们设置 GPIO1.EDGE_SEL=1,那么就表示 GPIO1_IO01 是双边沿触发中断,无论GFPIO1_CR1 的设置为多少,都是双边沿触发,如下图所示:







