【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0-尝鲜版第八章,感谢原子哥。
一,I.MX6U的IO配置
I.MX6UL 参考手册的第 30 章“Chapter 30: IOMUX Controller(IOMUXC)”
根据 IO 功能命名,GPIO只有GPIO1_IO00~GPIO_IO09,其他为复用IO。
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。
1.0 配置IO为GPIO
- 寄存器“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00”(配置IO功能)
地址为 0X020E005C
可复用9个功能,ALT5为 GPIO1_IO00(GPIO)
2.寄存器"IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00”(配置IO速度等属性的)
存器地址为 0X020E02E8
HYS(bit16):使能迟滞比较器,当 IO 作为输入功能的时候有效,设置输入接收器的施密特触发器是否使能。
PUS(bit15:14) :设置上下拉电阻的
PUE(bit13) :当 IO 作为输入的时候,设置 IO 使用上下拉还是状态保持器。
PKE(bit12) :用来使能或者禁止上下拉/状态保持器功能
ODE(bit11):当 IO 作为输出的时候,用来禁止或者使能开路输出
SPEED(bit7:6) :当 IO 用作输出的时候,此位用来设置 IO 速度
DSE(bit5:3):当 IO 用作输出的时候用来设置 IO 的驱动能力
SRE(bit0) :设置压摆率,压摆率就是 IO 电平跳变所需要的时间.
1.1配置为GPIO后的进一步配置
IO配置为GPIO需要8个寄存器DR、GDIR、PSR、ICR1、ICR2、EDGE_SEL、IMR 和 ISR。
- DR 寄存器,数据寄存器
GPIO 被配置为输出功能以后,向指定的位写入数据那么相应的 IO 就会输出相应的高低电平
比如,要设置 GPIO1_IO00 输出高电平,那么就应该设置 GPIO1.DR=1。
GPIO被配置为输入模式以后,此寄存器就保存着对应 IO 的电平值,每个位对对应一个 GPIO
比如,当 GPIO1_IO00 这个引脚接地的话,那么 GPIO1.DR 的 bit0 就是 0。 - GDIR 寄存器,方向寄存器
用来设置某个 GPIO 的工作方向的,即输入/输出 - PSR 寄存器, GPIO 状态寄存器
一个 GPIO 对应一个位,读取相应的位即可获取对应的 GPIO 的状态,也就是 GPIO 的高低电平值 - ICR1和ICR2寄存器,都是中断控制寄存器
ICR1用于配置低16个GPIO,ICR2 用于配置高 16 个 GPIO
- IMR 寄存器,中断屏蔽寄存器
用来控制 GPIO 的中断禁止和使能 - ISR,ISR 是中断状态寄存器
读取 ISR 寄存器来判断 GPIO 中断是否发生,相当于 ISR 中的这些位就是中断标志位。当我们处理完中断以后,必须清除中断标志位,清除方法就是向 ISR 中相应的位写 1,也就是写 1 清零。 - EDGE_SEL 寄存器,边沿选择寄存器
设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置
二,I.MX6U的时钟配置
I.MX6UL 参考手册的第 18 章“Chapter 18: Clock Controller Module(CCM)”
CMM 有 CCM_CCGR0~CCM_CCGR6 这 7 个寄存器,这 7 个寄存器控制着 I.MX6U 的所有外设时钟开关
以CCM_CCGR0为例:
CCM_CCGR0 是个 32 位寄存器,其中每 2 位控制一个外设的时钟,比如 bit31:30 控制着GPIO2 的外设时钟,两个位就有 4 种操作方式。
打开 GPIO2 的外设时钟: CCM_CCGR0=3 << 30;
关闭GPIO2 的外设时钟,bit31 和 bit30 都 为 0。
三,I.MX6U的配置流程
1 、使能 GPIO1 时钟: CCM_CCGR3
2 、设置 GPIO1_IO03 的复用功能:IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
3 、配置 GPIO1_IO03 :IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
4 、设置 GPIO
5 、控制 GPIO 的 的 输出电平