嵌入式 > 嵌入式开发 > 详情

嵌入式Linux下使用GPIO中断功能

发布时间:2025-01-22 发布时间:
|

1).简介

GPIO应用是嵌入式设备最基本的应用之一,本文就基于EmbeddedLinux系统演示开发GPIO中断以及输出相关的基本应用示例.

本文所采用的硬件平台来自与Toradex发布的基于NXPiMX7SoC的ColibriiMX7ARM计算机模块配合ColibriEvaBoard.

2).准备

a).ToradexColibriiMX7S(基于NXPiMX7SSoC)计算机模块配合ColibriEvaBoard开发载板.

b).EmbeddedLinux使用Toradex官方发布的LinuxreleaseV2.6.1,更新方法请见这里.

3).软硬件安装

a).本文所实现的GPIO应用原理为使用两个GPIO接口,一个作为按键输入使用,另外一个作为输出驱动载板上面的LED.每次按键后,会将LED状态翻转,也就是点亮和熄灭交替.

b).硬件连接,将ColibriEva载板X3连接器C19和X21连接器SW6连接,作为按键输入端;将X3连接器A19和X21连接器LED1连接,用于驱动LED1.

c).在Ubuntu14.04开发主机配置开发环境,这里使用Eclipse作为开发IDE,具体配置可以参考这里的Linux开发上手指南.

4).GPIO应用示例

a).运行Eclipse,创建一个新项目,命名”gpiointtest”,配置为”EmptyProject”和“CrossGCC”.

b).在”gpiointtest”项目下首先新建GPIO操作相关的header和source文件

./Header文件”gpioconfig.h”代码如下,主要定义一些全局环境变量和声明GPIO基本的操作函数

/zixunimg/eepwimg/github.com/simonqin09/gpiointtest/blob/master/gpioconfig.h

./source文件“gpioconfig.c”代码如下,主要是GPIO基本操作函数

/zixunimg/eepwimg/github.com/simonqin09/gpiointtest/blob/master/gpioconfig.c

c).主函数文件为“gpiointtest.c”,源代码如下,其主要实现的功能要点下面会逐一列出.

/zixunimg/eepwimg/github.com/simonqin09/gpiointtest/blob/master/gpiointtest.c

./参考ColibriiMX7数据手册以及这里的GPIO号码定义规则,本文所使用的C19和A19引脚对应的GPIO为GPIO-53和GPIO-52,因此主程序在最开始就做了定义,对应变量gpio2和gpio1.

./变量定义完成后第二部分就是GPIO的export和配置,将gpio1配置为输出,gpio2配置为中断输入,上升沿触发.

./这里我们采用”poll”函数作为中断事件处理函数,使用的也是其标准用法,这里就不赘述.

./这里详细说明下在触发事件后的处理,也就是”if(fdset[1].revents&POLLPRI)”里面的内容.首先通过“lseek”函数将文件还原以便处理下一次中断触发;然后通过”cnt”变量的判定排除程序运行第一次默认触发的中断;最后在有效中断触发情况下,再通过“usleep”和gpio2当前value的读取来排除机械按键抖动,这样在每次确定按键的前提下,将gpio1的输出做反转,对应也就是LED亮和灭.

d).编译项目,然后将可执行文件scp下载到colibriimx7执行,执行情况如下.在测试中也可以发现当出现按键抖动的时候,按键次数统计输出会跳过抖动的那次计数,同样LED控制也不会被干扰.

e).当在所需要同时控制的GPIO数量比较多的情况下,采用”epoll”函数效率会高于“poll”,因此这里也将基于“epoll”的主程序代码罗列如下,其思路和上面是一致的,就不赘述.



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Linux SDIO总线驱动