IMX6ULL的GPIO操作方法

文章目录

    • 1 IMX6ULL的GPIO模块结构
    • 2 CCM用于设置是否向GPIO模块提供时钟
    • 3 IOMUXC:引脚的模式(Mode、功能)
    • 4 GPIO模块内部
    • 5 如何编程
      • 5.1 读GPIO
      • 5.2 写GPIO

CCM: Clock Controller Module (时钟控制模块)。
IOMUXC : IOMUX Controller,IO 复用控制器。
GPIO: General-purpose input/output,通用的输入输出口。

1 IMX6ULL的GPIO模块结构

参考资料:芯片手册《Chapter 26: General Purpose Input/Output (GPIO)》。
有 5 组 GPIO(GPIO1~GPIO5),每组引脚最多有 32 个,但是可能实际上并没有那么多。
GPIO1 有 32 个引脚:GPIO1_IO0~GPIO1_IO31;
GPIO2 有 22 个引脚:GPIO2_IO0~GPIO2_IO21;
GPIO3 有 29 个引脚:GPIO3_IO0~GPIO3_IO28;
GPIO4 有 29 个引脚:GPIO4_IO0~GPIO4_IO28;
GPIO5 有 12 个引脚:GPIO5_IO0~GPIO5_IO11;

GPIO 的控制涉及 3 大模块:CCM、IOMUXC、GPIO 模块本身,框图如下:
IMX6ULL的GPIO操作方法_第1张图片


2 CCM用于设置是否向GPIO模块提供时钟

参考资料:芯片手册《Chapter 18: Clock Controller Module (CCM)》。

GPIOx 要用 CCM_CCGRy 寄存器中的 2 位来决定该组 GPIO 是否使能。哪组 GPIO用哪个 CCM_CCGR 寄存器来设置,请看上图红框部分。

CCM_CCGR 寄存器中某 2 位的取值含义如下:
IMX6ULL的GPIO操作方法_第2张图片
① 00:该 GPIO 模块全程被关闭。
② 01:该 GPIO 模块在 CPU run mode 情况下是使能的;在 WAIT 或 STOP 模式下,关闭。
③ 10:保留。
④ 11:该 GPIO 模块全程使能。

GPIO2 时钟控制:
IMX6ULL的GPIO操作方法_第3张图片
GPIO1、GPIO5 时钟控制:
IMX6ULL的GPIO操作方法_第4张图片
GPIO3 时钟控制:
IMX6ULL的GPIO操作方法_第5张图片
GPIO4 时钟控制:
IMX6ULL的GPIO操作方法_第6张图片


3 IOMUXC:引脚的模式(Mode、功能)

参考资料:芯片手册《Chapter 32: IOMUX Controller (IOMUXC)》。

IMX6ULL的GPIO操作方法_第7张图片
对于某个/某组引脚,IOMUXC 中有 2 个寄存器用来设置它:
① 选择功能:
IOMUXC_SW_MUX_CTL_PAD_ :Mux pad xxx,选择某个 pad 的功能。
IOMUXC_SW_MUX_CTL_GRP_:Mux grp xxx,选择某组引脚的功能。

某个引脚,或是某组预设的引脚,都有 8 个可选的模式(alternate (ALT) MUX_MODE)。

IMX6ULL的GPIO操作方法_第8张图片
比如:
IMX6ULL的GPIO操作方法_第9张图片
② 设置上下拉电阻等参数:
IOMUXC_SW_PAD_CTL_PAD_:pad pad xxx,设置某个 pad 的参数。
IOMUXC_SW_PAD_CTL_GRP_:pad grp xxx,设置某组引脚的参数。

IMX6ULL的GPIO操作方法_第10张图片
比如:
IMX6ULL的GPIO操作方法_第11张图片


4 GPIO模块内部

框图如下:
IMX6ULL的GPIO操作方法_第12张图片
我们暂时只需要关心 3 个寄存器:
① GPIOx_GDIR:设置引脚方向,每位对应一个引脚,1-output,0-input。

IMX6ULL的GPIO操作方法_第13张图片
② GPIOx_GDIR:设置输出引脚的电平,每位对应一个引脚,1-高电平,0-低电平。

IMX6ULL的GPIO操作方法_第14张图片
③ GPIOx_PSR:读取引脚的电平,每位对应一个引脚,1-高电平,0-低电平。
IMX6ULL的GPIO操作方法_第15张图片


5 如何编程

5.1 读GPIO

IMX6ULL的GPIO操作方法_第16张图片
翻译一下:
① 设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的,上图省略了。
② 设置 IOMUX 来选择引脚用于 GPIO。
③ 设置 GPIOx_GDIR 中某位为 0,把该引脚设置为输入功能。
④ 读 GPIOx_DR 或 GPIOx_PSR 得到某位的值(读 GPIOx_DR 返回的是 GPIOx_PSR 的值)。

5.2 写GPIO

IMX6ULL的GPIO操作方法_第17张图片
翻译一下:
① 设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的,上图省略了。
② 设置 IOMUX 来选择引脚用于 GPIO。
③ 设置 GPIOx_GDIR 中某位为 1,把该引脚设置为输出功能。
④ 写 GPIOx_DR 某位的值。

需要注意的是,你可以设置该引脚的 loopback 功能,这样就可以从 GPIOx_PSR 中读到引脚的有实电平;你从 GPIOx_DR 中读回的只是上次设置的值,它并不能反应引脚的真实电平,比如可能因为硬件故障导致该引脚跟地短路了,你通过设置 GPIOx_DR让它输出高电平并不会起效果。


参考资料:

  1. 韦东山全系列视频第1季快速入门

你可能感兴趣的:(所学所思所想)