i.MX6ULL配置GPIO一共需要几步?

原创 2022-08-04 20:16:00 i.MX6ull
 

正如学习C语言时写的第一段代码都是“HelloWorld!”,接触一款新的处理器时往往是从点亮一个LED开始;而点亮一个LED,则需要操作这款芯片GPIO外设。

那么作为广受欢迎的i.MX6ULL处理器,它的GPIO外设应该如何配置呢?今天小编就将通过飞凌嵌入式OKMX6ULL-S开发板来为大家详细介绍。


一、i.MX6ULL处理器的GPIO配置


i.MX6ULL运行的是Linux系统,众所周知Linux下一切皆文件。在Linux系统当中,有一个文件专门用于配置处理器的各个外设,包括GPIO,这个文件被称为 “设备树”,i.MX6ULL的设备树在内核源码中的路径为: arch/arm/boot/dtbs/

在这个路径下我们可以看到很多设备树文件,我们要使用的设备树是: okmx6ull-s-emmc.dts以及 okmx6ull-s-nand.dts。打开以上任意一个设备树文件,可以看到二者均引用了 imx6ull-14x14-evk.dts,因此对设备树的修改都是基于imx6ull-14x14-evk.dts。


找到其中的 &iomuxc 节点,可以看到在  pinctrl_hog_1:hoggrp-1 节点下已有部分GPIO复用,内容如下:



1 硬件原理分析 

查看硬件原理图,6ULL-S底板上有两个LED,以LED2为例,LED2的阴极接在了GPIO9引脚上,当GPIO9为低时,LED点亮。


打开硬件资料/用户手册/FETMX6ULx-S核心板管脚功能分配表20200624.xlsx,通过查表得知GPIO9对应的是i.MX6ULL的GPIO1_IO09。


2设置引脚复用


前面我们提到了&iomuxc节点下增加引脚复用,参数我们先设置为0x17059,后面会解释配置方法。配置如下:


3注释掉冲突部分

接下来打开内核源码中的:

arch/arm/boot/dts/imx6ull-14x14-evk.dts

因接下来要对GPIO进行操作,为防止该节点影响,需要注释掉设备树中的LED节点,如下图红框中所示:


4更新设备树

重新编译设备树,命令如下:

/opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi //执行环境变量

make dtbs 这条命令会编译所有的设备树,编译后再次查看确认已经生成新的dtb文件。

接下来,我们将刚刚生成的设备树文件拷贝到OKMX6ULL-S开发板——可以通过U盘,也可以通过TFTP、NFS、FTP这样的网络服务将生成的dtb文件拷贝到开发板上。

以eMMC版本为例,我们可以直接将设备树文件:okmx6ull-s-emmc.dtb拷贝到/run/media/mmcblk1p1/路径下,替换掉该路径下的同名文件,之后重启开发板。


5操作GPIO

1. 计算对应sys/class/gpio的值GPIOn_IOx= (n-1)*32 + x

GPIO1_IO09=(1- 1)*32 + 9 = 9

2. 将GPIO1_IO09=设置为输出


echo9 > /sys/class/gpio/export 用于通知系统需要导出控制的GPIO引脚编号

echo"out" > /sys/class/gpio/gpio9/direction 控制为输出

echo"1" > /sys/class/gpio/gpio9/value 输出为高电平,LED熄灭

或者echo"0" > /sys/class/gpio/gpio9/value输出为低电平,LED点亮

echo9  > /sys/class/gpio/unexport 通知系统取消导出


6GPIO参数详解

现在我们转过头来了解一下刚刚都用到了哪些参数:

MX6UL_PAD_GPIO1_IO09__GPIO1_IO09这一长串,是一个宏定义,可以在 imx6ul-pinfunc.h文件当中查看,细心的小伙伴可能已经注意到了imx6ul-pinfunc.h这个文件是6UL的,这是因为 imx6ull-pinfunc.h引用了imx6ul-pinfunc.h,并且增加了部分内容

打开arch/arm/boot/dtbs/imx6ul-pinfunc.h文件,找到MX6UL_PAD_GPIO1_IO09的宏定义如下:

这些宏定义就是GPIO1_IO09这个引脚可以复用的功能。每一个宏定义后面都有5个参数,再加上刚刚我们在&iomuxc节点下配置的0x17059一共是6个参数,通过它们就可以完成一个GPIO的配置了,这6个参数分别为:

    mux_ctrl_ofs:MUX寄存器偏移地址

    pad_ctrl_o fs:PAD寄存器偏移地址

    sel_input_ofs:输入选择寄存器偏移地址

    mux_mode:MUX寄存器值

    sel_input:输入选择寄存器值

    pad_ctrl:PAD寄存器值

以上6个参数对应了3个寄存器的偏移地址和寄存器值。我们接下来重点介绍一下MUX寄存器和PAD寄存器。


1. MUX寄存器

全名是SW_MUX_CTL_PAD_GPIO1_IO09,意为GPIO复用寄存器,在i.MX6ULL的数据手册有它的详细介绍,我们可以从飞凌官方提供的资料中找到:硬件资料/数据手册/i.MX6ULLRM.pdf。

打开32.6.16小节,可以看到寄存器偏移地址和我们官方提供的文件中是一致的。而ALT0-ALT8则分别对应了这个GPIO可以复用的功能, 0x5对应的就是将GPIO5_IO09复用成GPIO1_IO09


2. PAD寄存器

全称SW_PAD_CTL_PAD_GPIO1_IO09,意为GPIO电气参数配置寄存器,这个是我们需要重点关注的内容,因为无论是刚刚提到的MUX寄存器,还是输入选择寄存器,NXP官方都已经为我们写好了宏定义,但是这个寄存器的值,需要用户根据自身需求来设置,参考的资料依旧是i.MX6ULLRM.pdf,在32.6.162小节,有关于PAD寄存器每一位的详细解释。

HYS(bit16):使能迟滞比较器,当IO作为输入功能的时候有效,开启迟滞比较器可以滤掉一些干扰。这一位为0时禁止迟滞比较器,为1时使能迟滞比较器。

PUS(bit15:14):设置上下拉电阻,一共有四种选项可以选择:


PUE(bit13):当IO作为输入的时候,这一位用来设置IO使用上下拉还是状态保持器。当为0的时候使用状态保持器,当为1的时候使用上下拉。状态保持器在IO作为输入的时候才有用,顾名思义,就是当外部电路断电以后此IO口可以保持住以前的状态。

PKE(bit12):此位用来使能或者禁止上下拉/状态保持器功能,这一位为0时禁止上下拉/状态保持器,为1时使能上下拉和状态保持器。

ODE(bit11):开漏使能,当IO作为输出的时候,用来禁止或者使能开漏输出,这一位为0的时候禁止开漏输出,为1的时候就使能开漏输出功能。

SPEED(bit7:6):当IO用作输出的时候,此位用来设置IO速度。

DSE(bit5:3):当IO用作输出的时候用来设置IO的驱动能力,可以简单理解为IO口上串联的电阻大小,电阻越小驱动能力越强,总共有8个可选项:

SRE(bit0):IO翻转速度,为1时IO电平跳变时间更快,对应波形更陡;为0时IO电平跳变时间要慢一些,波形也更平缓。

介绍完了PAD寄存器的每一位,我们再回头看一下刚刚配置的0x17059,将它展开成二进制为:0001 0111 0000 0101 1001。

bit15:14设置为01,对应的是100K上拉,这是因为LED的阴极接到了GPIO上,保持默认状态下LED为熄灭状态。

bit5:3,这里配置的是R0/6,小伙伴们也可以试一下配置成其他的值,观察LED的亮度会不会有变化。




以上就是为i.MX6ULL处理器配置GPIO的全过程,希望能够对屏幕前的各位工程师小伙伴有所帮助。想要了解更多有关FETMX6ULL-S详情和资料,可点击下方链接进入飞凌嵌入式官网。

>>https://forlinx.com/product/123.html<<


相关产品 >

  • OKMX6ULL-S开发板

    iMX6ULL是飞凌新近推出的一款开发板,iMX6ULL与iMX6UL开发板相比,功能无区别完全兼容,配置升级,性能高,价格低。根据介绍可看出i.MX6ULL参数丰富 ,采用NXP i.MX6ULL处理器芯片,邮票孔封装,支持Linux系统,i.MX6ULL开发板资料丰富,方便二次开发设计。

    了解详情
    OKMX6ULL-S开发板
  • FETMX6ULL-S核心板

    飞凌新出的一款采用NXP高性能、高效、低成本处理器的核心板—FETMX6ULL-S核心板,i.MX6ULL核心板采用邮票孔连接方式,ARM Cortex-A7内核,原生两路网口,两路Can和八路串口,可以和多种设备同时通讯。i.MX6ULL核心板支持工业级和扩展商业级两种配置,并且经过了高低温测试的检验,iMX6ULL核心板采用Linux4.1.15+Qt5.6操作系统,方便开发自己的应用程序。 了解详情
    FETMX6ULL-S核心板
  • FETMX6ULL-C核心板

    FETMX6ULL-C核心板采用NXP i.MX6ULL处理器开发设计,是一款高性能Linux核心板,采用低功耗的ARM Cortex-A7架构,运行速度高达800MHz。iMX6ULL核心板29*40mm  ,iMX6ULL这款处理器功能接口资源丰富,供货周期长。

    了解详情
    FETMX6ULL-C核心板
  • OKMX6ULL-C开发板

    40*29mm,双网双CAN,8路串口| i.MX6ULL开发板是基于NXP i.MX6ULL设计开发的的一款Linux开发板 ,主频800MHz,体积小,其核心板仅40*29mm,采用板对板连接器,适应场景丰富。 了解详情
    OKMX6ULL-C开发板

推荐阅读 换一批 换一批