IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)

一、GPIO简介

i.MX6ULL 芯片的 GPIO 被分成 5 组,并且每组 GPIO 的数量不尽相同,例如 GPIO1 拥有 32 个引脚, GPIO2 拥有 22 个引脚, 其他 GPIO 分组的数量以及每个 GPIO 的功能请参考 《i.MX 6UltraLite Applications Processor Reference Manual》 第26章General Purpose Input/Output (GPIO)(P1133)

IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)
i.MX6ULL 的 IO 分为两类:SNVS 域的和通用的,这两类 IO 本质上都是一样的。

“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00”的就是 GPIO 命名,命名形式就是“IOMUXC_SW_MUC_CTL_PAD_”,后面的“”就是 GPIO 命名,比如:GPIO1_IO01、UART1_TX_DATA、JTAG_MOD 等等。他是 根据某个 IO 所拥有的功能来命名的。比如我们一看到 GPIO1_IO01 就知道这个肯定能做 GPIO,看到 UART1_TX_DATA 肯定就知道这个 IO 肯定能做为 UART1 的发送引脚。

IO 复用功能。 i.MX6ULL 除了 GPIO1_IO00~GPIO1_IO09 引脚外,其它 IO 也是可以复用为 GPIO 功能。同样的,GPIO1_IO00~GPIO_IO09 也是可以复用为其它外设引脚。

1.2 IO复用

IOMUX 译为 IO 复用选择器。i.MX6ULL 的芯片每个 GPIO 都通过 IOMUX 支持多种功能, 例如一个 IO 可用于网络外设 ENET 的数据接收引脚,也可以被配置成 PWM 外设的输出引脚, 这样的设计大大增加了芯片的适用性,这样可选的功能就是由 IOMUX 实现的。IOMUX 相当于增加了多根内部信号线与 IO 引脚相连,。

以“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00”这个 IO 为例,打开参考手册的 1568 页。

IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)

在 IOMUXC 外设中关于 MUX Mode 和 Pad Settings 寄存器命名格式如下:

IOMUXC控制类型 寄存器名称
MUX Mode IOMUXC_SW_MUX_CTL_PAD_XXXX
Pad Settings IOMUXC_SW_PAD_CTL_PAD_XXXX

每个引脚都包含这两个寄存器,表中的XXXX表示引脚的名字

1.3.1 MUX Mode配置

MUX Mode 就是用来,即选择引脚具体是用于网络外设 ENET 的数据接收, 还是用于 PWM 外设的输出引脚,当然,也可以配置成普通的 IO 口,仅用于控制输出高低电平。

以 GPIO1_IO04 引脚为例对 MUX 寄存器进行说明,该引脚相应的 MUX 寄存器在参考手册中的描述如下:

该寄存器主要有两个配置域,分别是 SIONMUX_MODE

  • SION: 用于设置引脚在输出模式下同时开启输入通道。
  • MUX_MODE: 使用 4 个寄存器位表示可选的 ALT0~ALT7 这 8 个模式。
    • 如 ALT2 模式就是用于 USB 外设的 USB_OTG1_PWR 信号;
    • 若配置为 ALT5 则引脚会用作普通的 GPIO 功能, 用于输出高、低电平。

IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)

1.3.3 PAD(可跳过不看)

PAD 代表了一个 i.MX6ULL 的 GPIO 引脚。在它的左侧是一系列信号通道及控制线,如 input_on 控制输入开关,Dir 控制引脚的输入输出方向,Data_out 控制引脚输出高低电平,Data_in 作为信号输入,这些信号都经过一个 IOMUX 的器件连接到左侧的寄存器。

IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)
IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)

1.4.1 GDIR方向寄存器

控制一个 GPIO 引脚时,要先用 GDIR 方向寄存器配置该引脚用于输出电平信号还是用作输入检测。 典型的例子是使用输出模式可以控制LED灯的亮灭,输入模式时可以用来检测按键是否按下。

GDIR 寄存器的每一个数据位代表一个引脚的方向,对应的位被设置为0时该引脚为输入模式,被设置为1时该引脚为输出模式。

例如,对 GPIO1 的 GDIR 寄存器的 bit3 位被写入为 1,那么 GPIO1.3 引脚的模式即为输出。

IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)

1.4.3 PSR引脚状态寄存器

,也就是 GPIO 的高低电平值。PSR 引脚状态寄存器相当于 DR 寄存器的简化版,它仅在 GDIR 方向寄存器设置为输入模式时有效,它的每个位表示一个引脚当前的输入电平状态。PSR 寄存器的权限是只读的,对它进行写操作是无效的。

特别地,当引脚被配置成输出模式时,若 IOMUXC 中的 MUX 寄存器使能了 SION 功能(输出通道回环至输入), 可以通过 PSR 寄存器读取回引脚的状态值。

IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)
从原理图可看到 RGB 灯的三个阴极 R、G、B 连接分别连接至标号 、、, 这些标号实际上与配套核心板上 i.MX6ULL 芯片的引脚相连。由于引脚功能众多, 绘制原理图时不可避免地无法完全表示引脚信息的所有信息。而无论是具体的引脚名还是复用功能, 我们都无法直接得知这些具体是 i.MX6ULL 芯片的哪个引脚。我们需要知道这些引脚是对应的具体 GPIO,这样我们才能编写程序进行控制。

由于还不清楚标号 、、 的具体引脚名,我们首先要在核心板原理图中查看它与 i.MX6ULL 芯片的关系。打开 《野火_EBF6ULL S1 邮票孔核心板_V1.0_原理图》,在PDF阅读器的搜索框输入前面的 、、 标号。

IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)

查找到了 信号的具体引脚名为 。 但是当我们使用同样的方法查找时发现只能找到 、, 并没有我们熟悉的 GPIOx_IOx 标注的引脚名。这两个引脚默认情况下不用作 GPIO,而是用作摄像头的某一功能引脚,但是它可以复用为 GPIO,我们怎么找到对应的 GPIO 呢/p>

  • 方法一:
    在**《i.MX 6UltraLite Applications Processor Reference Manual》的第4章 External Signals and Pin Multiplexing** 搜索引脚名

    IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)

经查阅,我们把以上连接 LED 灯的各个 i.MX6ULL 芯片引脚总结出如表:

LED灯 原理图的标号 具体引脚名 GPIO端口及引脚编号
R灯 GPIO_4 GPIO1_IO04 GPIO1_IO04
G灯 CSI_HSYNC CSI_HSYNC GPIO4_IO20
B灯 CSI_VSYNC CSI_VSYNC GPIO4_IO19

三、编写启动文件

在 Ubuntu 下创建 文件用于编写启动文件。
在汇编文件中设置并执行跳转命令跳转到执行C代码。

3.1 完整代码

3.2 分析代码

  • 第一部分
    定义代码段。
    设置字节对齐。
    生命全局标号_start。
  • 第二部分
    定义标号_start: ,它位于汇编的最前面,说以会首先被执行。
    使用b指令将程序跳转到reset标号处。
  • 第三部分
    通过 关闭 I Cache 、D Cache、MMU 等等。
    我们暂时用不到的功能,如果开启可能会影响我们裸机运行,为避免不必要的麻烦暂时关闭这些功能。
  • 第四部分
    用于设置栈指针。野火i.MX6ULL开发板标配512M的DDR内存,裸机开发用不了这么多。程序中我们将栈地址设置到DDR的64M地址处。 这个值也可以根据需要自行定义。
    只用跳转指令跳转到main函数中执行。
  • 第五部分
    是“无返回”的跳转指令。正常情况下,不会执行第五部分代码。

四、编程流程

1. 开启GPIO时钟
2. 设置引脚的复用功能以及引脚属性
3. 设置引脚方向以及输出电平

五、编写C语言代码

在 Ubuntu 下创建 文件用于驱动 LED 闪烁。

5.1 完整代码

来源:Leung_ManWah

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年11月27日
下一篇 2022年11月28日

相关推荐