干货丨飞凌嵌入式 i.MX6系列开发板应用笔记:GPIO 功能应用操作讲解

本文主要是介绍干货丨飞凌嵌入式 i.MX6系列开发板应用笔记:GPIO 功能应用操作讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文以飞凌嵌入式OKMX6Q/DL-C开发板为基础讲解,操作系统为Linux3.0.35,主要介绍了飞凌i.MX6Q系列开发板GPIO的操作,写本文章主要是记录工程师用户经常提到的一些问题,为工程师用户提供一些解决思路,以供参考。

▐  通用GPIO的使用

在嵌入式系统中对GPIO的操作是最基本的操作。在Linux中有一个通用的GPIO操作接口。在imx6Q开发板文件系统中会有一个控制GPIO的目录:/sys/class/gpio;Linux-3.0.35内核中Documention文件夹下边有gpio.txt文档可以参考。

 
  1. root@freescale /sys/class/gpio$ ls

  2. export       gpiochip0    gpiochip160  gpiochip32   gpiochip96

  3. gpiochip128   gpiochip192   gpiochip64    unexport

名称描述
export导出GPIO操作接口
unexport撤销GPIO操作接口的导出
gpiochip0GPIO1组
gpiochip32GPIO2组
gpiochip64GPIO3组
gpiochip96GPIO4组
gpiochip128GPIO5组
gpiochip160GPIO6组
gpiochip192GPIO7组

其中,export和unexport为GPIO子系统的属性文件,其余七个文件则为符号链接(gpiochip0,gpiochip32,gpiochip64,gpiochip96,gpiochip128,gpiochip160,gpiochip192),分别指向各自对应的GPIO组。以gpiochip0为例,此目录下的文件有:

 
  1. root@freescale /sys/class/gpio/gpiochip0$ ls

  2. base       label      ngpio      power      subsystem  uevent

名称描述
baseGPIO组的初始编号
labelGPIO组标签
ngpio该组的GPIO总数
power设备供电方面的相关信息
subsystem符号链接,指向父目录
uevent内核与udev(自动设备发现程序)之间的通信接口

当我们操作某个GPIO之前,需要先向export文件写入该GPIO编号以导出它的设备目录。GPIO编号的计算公式如下所示:

           GPIO编号=(BANK-1)*32+N

在公式中BANK为GPIO引脚所在的GPIO组编号,N则为引脚在该个BANK中的序号。以GPIO7-IO03 为例,其BANK值为7,N值为3,因此排列序号为(7-1)*32+3=195。

下面介绍该目录下的一些操作的用法。

1、GPIO编号导出

文件系统中/sys/class/gpio/export文件用于通知系统需要导出要控制的GPIO的编号:echo 195 >/sys/class/gpio/export

命令成功后生成/sys/class/gpio/gpio195目录。如果没有出现相应的目录,说明此引脚不可导出,一般这种情况是驱动中pinmux功能配置不正确,或者配置了多种pinmux功能引起冲突导致。

2、取消GPIO编号导出

文件系统中/sys/class/gpio/unexport文件 用于通知系统取消GPIO编号导出:echo 195  > /sys/class/gpio/unexport

3、 配置GPIO的输入输出方向

echo out >/sys/class/gpio/gpio195/direction

direction可接收的参数:in,out,high,low;其中high,low设置方向为输出并将value值设置为相应的1/0。

4、查看GPIO的输入输出方向:

cat /sys/class/gpio/gpio195/ direction

5、配置GPIO的高低电平(值为1/0)

当gpio配置为输出模式时,可以通过设置value值设置gpio的高低电平。

echo 1 >/sys/class/gpio/value

6、 查看GPIO的输出值

cat /sys/class/gpio/gpio195/value

▐  修改Pinmux配置

驱动中的主要位置:linux3.0.35/drivers/gpio/gpiolib.c

修改文件arch/arm/mach-mx6/board-mx6q_sabresd.h,在其中增加该引脚对应的gpio配置,该引脚如果有其他复用配置,需要将其他复用配置去掉,只保留一种pinmux配置。内核中引脚功能定义在arch/arm/plat-mxc/include/mach/iomux-mx6q.h文件中,该文件对每个引脚的复用功能进行了定义,有兴趣的可以自己看一下。

以释放原SD卡功能占用的部分引脚为例:

修改文件arch/arm/mach-mx6/board-mx6q_c_sabresd.h,在其中增加如下定义:

 
  1. /*GPIO*/3

  2.       MX6Q_PAD_SD3_CLK__GPIO_7_3,

  3.       MX6Q_PAD_SD3_CMD__GPIO_7_2,

  4.       MX6Q_PAD_SD3_DAT2__GPIO_7_6,

  5.       MX6Q_PAD_SD3_DAT3__GPIO_7_7,

  6.       MX6Q_PAD_SD3_DAT4__GPIO_7_1,

  7.       MX6Q_PAD_SD3_DAT5__GPIO_7_0,

  8.       MX6Q_PAD_SD3_DAT6__GPIO_6_18,

  9.       MX6Q_PAD_SD3_DAT7__GPIO_6_17,

  10.       MX6Q_PAD_NANDF_D1__GPIO_2_1,

  11.       MX6Q_PAD_NANDF_D0__GPIO_2_0,

将原来的SD卡的功能注释掉

 
  1. /* USDHC3 */

  2. /*      MX6Q_PAD_SD3_CLK__USDHC3_CLK_50MHZ,

  3.        MX6Q_PAD_SD3_CMD__USDHC3_CMD_50MHZ,

  4.        MX6Q_PAD_SD3_DAT0__USDHC3_DAT0_50MHZ,

  5.        MX6Q_PAD_SD3_DAT1__USDHC3_DAT1_50MHZ,

  6.        MX6Q_PAD_SD3_DAT2__USDHC3_DAT2_50MHZ,

  7.        MX6Q_PAD_SD3_DAT3__USDHC3_DAT3_50MHZ,

  8.        MX6Q_PAD_SD3_DAT4__USDHC3_DAT4_50MHZ,

  9.        MX6Q_PAD_SD3_DAT5__USDHC3_DAT5_50MHZ,

  10.        MX6Q_PAD_SD3_DAT6__USDHC3_DAT6_50MHZ,

  11.        MX6Q_PAD_SD3_DAT7__USDHC3_DAT7_50MHZ,

  12.        MX6Q_PAD_NANDF_D0__GPIO_2_0,          

  13.        MX6Q_PAD_NANDF_D1__GPIO_2_1,            */

修改前:

图片

修改后:

图片

修改完成后重新编译内核,并将镜像烧写到iMX6Q开发板上进行测试。

测试

 
  1. echo 195 > /sys/class/gpio/export

  2. echo out > /sys/class/gpio/gpio195/direction

  3. echo 1 > /sys/class/gpio/gpio195/value

  4. cat /sys/class/gpio/gpio195/value

▐  Datasheet查看gpio

1、GPIO地址

IMX6DQRM.pdf手册中的第28章描述的是GPIO相关的内容。

手册第二章Memory Maps内存映射大概在215页,有关于GPIO组的映射地址:

2、GPIO寄存器

数据手册第28章中第1429页描述的是GPIO控制的8个32位寄存器。

名称描述

GPIOx_DR

数据寄存器,当GPIO为输出时,可以通过写DR寄存器来驱动gpio引脚

GPIOx_GDIR

控制GPIO引脚方向

GPIOx_PSR

当GPIO为输入时,从PSR寄存器读取数据

GPIOx_ICR1

配置GPIO中断的触发方式,高低电平出发还是沿触发

GPIOx_ICR2

配置GPIO中断的触发方式,高低电平出发还是沿触发

GPIOx_IMR

中断屏蔽寄存器

GPIOx_ISR

中断状态寄存器

GPIOx_EDGR_SEL

设置边沿触发方式

3、引脚复用

i.MX6Q数据手册36章IOMUX Controller这一章节有兴趣的也可以详细看一下或者从网络上找一些相关资料了解,此处不做详述

该章节主要描述引脚的复用配置以及一些功能的配置等,内核代码中关于这一块的配置在linux-3.0.35/arch/arm/plat-mxc/include/mach/iomux-mx6q.h文件中。该文件中的具体配置有兴趣的可以自己看一下,一般这块恩智浦NXP官方是默认配置好的,配置项的具体含义也可以从网上搜搜,并结合iomux-mx6q.h文件自己看看。

4、参数查找配置方法

手册第四章查找EIM_A22,可以看到需要ALT Mode是ALT5,而且Pad Settings需要配置的参数有PKE – ENABLED, 对应的Pad Registers为[SW_PAD_CTL_PAD_EIM_ADDR22]。

图片

手册继续搜索[SW_PAD_CTL_PAD_EIM_ADDR22] 寄存器, 可以看到寄存器的具体配置和具体的偏移地址以及上拉的配置。

图片

手册寻找对应的MUX Control Registers [IOMUXC_SW_MUX_CTL_PAD_EIM_ADDR22]。可以看到具体的配置模式ALT5模式的配置值为0x05UL。

图片

 

附录:常见GPIO调试问题处理参考

常见GPIO调试问题处理参考:

❶ 如果在GPIO导出时出现Device or resource busy的情况

一般都是该引脚在内核中配置为其他功能,需要仔细检查内核中引脚配置,不要被其他功能占用。

❷ GPIO能够导出,但是使用的时候各种功能都不正常的情况

这种情况一般也是引脚在内核中配置为其他功能,需要仔细检查内核中引脚配置,不要被其他功能占用(一般被串口占用会有这种情况);

还有就是检查硬件电路,看硬件上有没有上拉下拉这样的硬件控制。

这篇关于干货丨飞凌嵌入式 i.MX6系列开发板应用笔记:GPIO 功能应用操作讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/191332

相关文章

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳