export gpio 中断_[Linux应用]通过sysfs在用户空间使用GPIO中断

本文详细介绍了如何在Linux用户空间通过sysfs接口配置和使用GPIO中断,包括GPIO的导出、设置输入输出、边沿触发方式以及利用poll和select进行中断事件监听。通过对GPIO的配置和操作,实现中断功能。
摘要由CSDN通过智能技术生成

通过使用sysfs,Linux GPIO可以支持在用户空间进行GPIO的控制或获取状态。这样可以使用简单的工具,比如“echo”来设置输出GPIO的电平或使用“cat”来读取输入GPIO的当前值。

1、配置内核中sysfs下的GPIO支持

要想在用户空间访问GPIO,需要在sysfs中使能GPIO支持。

Symbol: GPIO_SYSFS [=n]

Type  : boolean

Prompt: /sys/class/gpio/... (sysfs interface)

Defined at drivers/gpio/Kconfig:51

Depends on: GPIOLIB [=y] && SYSFS [=y] && EXPERIMENTAL [=y]

Location:

-> Device Drivers

-> GPIO Support (GPIOLIB [=y])

2、在用户空间使能GPIO

即将GPIO导出到用户空间之中。

------------------------------------

GPIO = 22

cd = /sys/class/gpio

ls

echo $GPIO > export

ls

------------------------------------

注意:开始ls时,gpio22并不存在,第二个ls时,gpio22才存在。

设置为输入并获取当前值:

------------------------------------

cd /sys/class/gpio/gpio$GPIO

echo "in" > direction

cat value

------------------------------------

设置为输出并设置值:

------------------------------------

cd /sys/class/gpio/gpio$GPIO

echo "out" > direction

echo 1 > value 或 echo 0 > value

------------------------------------

3、用作中断:

edge 表示中断的触发方式,edge文件有如下四个值:"none", "rising", "falling","both"。

// none表示引脚为输入,不是中断引脚

// rising表示引脚为中断输入,上升沿触发

// falling表示引脚为中断输入,下降沿触发

// both表示引脚为中断输入,边沿触发

// 这个文件节点只有在引脚被配置为输入引脚的时候才存在。 当值是none时可以通过如下方法将变为中断引脚

// echo "both" > /sys/class/gpio/gpioN/edge;对于是both,falling还是rising依赖具体硬件的中断的触发方式。

// 此方法即用户态gpio转换为中断引脚的方式

先将GPIO配置为输入,然后使用poll()来阻塞程序直到GPIO的输入电平发生改变,关键是使用POLLPRI而不是POLLIN来侦听事件;或者使用select()。

4、查看GPIO配置

配置内核来使能debugfs

Symbol: DEBUG_FS [=y]

Type  : boolean

Prompt: Debug Filesystem

Defined at lib/Kconfig.debug:77

Location:

-> Kernel hacking

启动目标硬件并挂载debugfs

mount -t debugfs none /sys/kernel/debug

查看引脚配置

cat /sys/kernel/debug/gpio

poll示例:

memset((void *)xfds, 0, sizeof(xfds));

xfds[0].fd = fd;

xfds[0].events = POLLPRI;

ret = poll(xfds, 1, -1);

if(ret <= 0)

ERREXIT("poll value");

if(xfds[0].revents & POLLPRI)

{

/* get value */

ret = lseek(fd, 0, SEEK_SET);

if(ret < 0)

ERREXIT("lseek value");

ret = read(fd, buf, 2);

buf[1] = '\0';

printf("read ret = %d, value = %s\n", ret, buf);

if(ret != 2)

ERREXIT("read value");

}

select示例:

FD_ZERO(&exceptfds);

FD_SET(fd, &exceptfds);

ret = select(fd+1,NULL,NULL,&exceptfds,NULL);

if(ret < 0)

ERREXIT("select value");

//else if(ret > 0)

if(ret > 0)

{

/* get value */

ret = lseek(fd, 0, SEEK_SET);

if(ret < 0)

ERREXIT("lseek value");

ret = read(fd, buf, 2);

buf[1] = '\0';

printf("read ret = %d, value = %x\n", ret, buf[0]);

if(ret != 2)

ERREXIT("read value");

}

良心货,有学习MSP430程序的网友拿去,各种例题,源码,可以直接拿来用的例程。 程序目录: MSP430F149+1602数码显示和实时时钟 MSP430F149,IAR,ADC采样之后对太阳点光源进行跟踪 MSP430F149 AD7705程序 MSP430 BH1750测量光强(已测试) Launch Pad NOKIA5110 Clock 使用MSP430单片机控制超声波测距并使用5110显示 基于MSP430的MP3 源码+电路图+PCB+字库+SD卡 基于MSP430单片机控制坦克打靶C语言源程序代码 MSP430F149 GSM基本控制,初始化接收短息,解读短信 ADXL重力加速度传感器实现计步器程序(利用MSP430F135实现) 利用MSP430的PWM功能实现电机的调速(可实现精确调速) TI公司MSP430芯片评估板lantchpad的电容式触摸板的源码 基于MSP430F149单片机的1602程序代码 基于MSP430F149单片机的nRF24L01无线通信程序 基于MSP430F149单片机的串口0驱动程序 基于MSP430F149单片机的温湿度传感器SHT1X驱动程序 基于MSP430F149的12864的显示图片 基于MSP430F149的AD转换,在液晶1602上显示 基于MSP430F149的触摸手写程序 基于MSP430F149为主芯片下的红外线解码资料源程序 基于MSP430F249的GPS+GPRS车载GPS 基于MSP430单片机的电子式互感器采集器的程序 基于MSP430单片机的智能电表 基于MSP430的触摸屏校正程序 基于MSP430的温度传感器DS18B20对温度的检测和显示 基于单片机MSP430的DS1302的时钟芯片编程,实现时钟显示 利用MSP430实现的超低功耗触摸屏 使用MSP430低功耗微处理器制作的斜度计(开发平台是IAR) 通过MSP430(149)单片机控制DHT11温湿度传感器 MSP430F149单片机与RF2401硬件SPI无线通信 MSP430f149控制LCD12864显示汉字、字母 MSP430F149通过SPI接口控制ADS1216 MSP430F449实现频率测量,呼吸灯,自己写的,调试OK MSP430x13x, MSP430F14x, MSP430F15x, MSP430F16x Code Examples MSP430x14x读写FM25L256程序 MSP430x14x模糊逻辑马达控制-源程序,已通过测试 MSP430单片机短息收发程序 MSP430平台 AM2301测量光强(已测试) MSP430热电偶开发程序,高精度测量,带标定 MSP430热电阻开发,高精度测量,带标定,修正 MSP430小车解决方案含Protel和源代码 MSP430与指纹识别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值