I.MX6U 的 GPIO 一共有 5 组:GPIO1、GPIO2、GPIO3、GPIO4 和 GPIO5, 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_MUX_CTL_PAD_GPIO1_IO00主要配置IO复用为什么功能,或是IIC或是普通IO或者其它 如图所示:此寄存器的低四位决定IO复用的功能 接下来是IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00寄存器,先上图 此寄存器低16位需要我们配置 HYS(bit16)用来使能迟滞比较器 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整形的话可以使 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 输出驱动关闭 (bit2:1):保留 该字段保留 SRE(bit0) :设置压摆率 当此位为 0 的时候是低压摆率,当为 1的时候是高压摆率。这里的压摆率就是 IO 电平跳变所需要的时间,比如从 0 到 1 需要多少时间,时间越小波形就越陡,说明压摆率越高;反之,时间越多波形就越缓,压摆率就越低。如 如果我们要使用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), 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 控制着 00 所有模式下都关闭外设时钟。 如果我们要打开 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 使用,我们需要一下 |
|