linux 操作GPIO

本文自己学习+记录

一、介绍

GPIO(General Purpose Input/Output)通用输入输出引脚,是计算机芯片上一类用于输入输出的通用引脚。它们可以被编程为输入或输出,并且可以被用于连接各种外设。

GPIO后面跟的数字称引脚号,引脚号和管脚号并非一一对应,具体对应关系还要看驱动手册。

  • 启用GPIO口

        向 /sys/class/gpio/export 文件写入 GPIO编号 即可启用对应GPIO口,即export 用途就是把某个GPIO引脚导出到用户空间。启用成功后会生成 /sys/class/gpio/gpio编号/ 目录,之后通过该目录中的文件对该特定的GPIO口进行操作;

        在编程时,都需要先检查下对应的gpio引脚好文件夹是否存在,不存在都需要先试用export 导出,再进行后续操作。

echo 100 > /sys/class/gpio/export 
  • 设置GPIO口方向(输入或输出)

        向 /sys/class/gpio/gpioX/direction 文件写数据可以设置端口方向, in 表示输入、 out 表示输出;

echo out  > /sys/class/gpio/gpio100/direction
  • 设置或读取GPIO口电平

        /sys/class/gpio/gpioX/value 文件可以设置或者读取端口电平值,默认情况下 0 表示低电平、 1 表示高电平;

 echo 0 > /sys/class/gpio/gpio100/value
  • 设置GPIO口外部中断触发方式

        向 /sys/class/gpio/gpioX/edge 文件写数据可以设置外部中断触发方式, none 无、 rising 上升沿触发、 falling 下降沿触发、 both 双边触发;(有没有对应方式还得看硬件和设置等)

echo  both > /sys/class/gpio/gpio100/edge
  • 取消使用GPIO口

        向 /sys/class/gpio/unexport 文件写入 GPIO编号 即可取消使用对应端口;

echo 100 > /sys/class/gpio/unexport

二、代码举例

在代码中,可以直接使用系统操作函数system实现:

system("echo 100 > /sys/class/gpio/export");
system("echo 0 > /sys/class/gpio/gpio100/value");
system("echo out > /sys/class/gpio/gpio100/direction");

也可以对文件进行操作:


#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#define GPIO_BASE_PATH    "/sys/class/gpio"

int GPIOInit(const char* nGPIOIndex)
{
    int ret = -1;
    FILE *fp = NULL;
    
    char gpio_path[100]={0};

    sprintf(gpio_path,"%s/gpio%s",GPIO_BASE_PATH,nGPIOIndex);
    printf("path :%s\n",gpio_path);

    if(0==access(gpio_path,F_OK))
    {
        printf("gpio %s exist!!!",nGPIOIndex);
        ret =0;
        return ret;
    }

    fp = fopen("/sys/class/gpio/export","w+");
	if(NULL == fp)
	{
		printf("fopen error\n");
		return ret;
	}
	
	fseek(fp,-1,SEEK_END);
	fwrite(nGPIOIndex,sizeof(char),strlen(nGPIOIndex),fp);
	
	if(fp!=NULL)
	{
		fclose(fp);
		fp = NULL;
	}
    ret = 0;
    return ret;
}

int SetGPIOValue(const char* nGPIOIndex,const char* nValue)
{
    int ret = -1;
    FILE *fp = NULL;
    
    char gpio_path[100]={0};

    sprintf(gpio_path,"%s/gpio%s/value",GPIO_BASE_PATH,nGPIOIndex);
    printf("path :%s\n",gpio_path);

    fp = fopen(gpio_path,"w+");
	if(NULL == fp)
	{
		printf("fopen error\n");
		return ret;
	}
	
	fseek(fp,-1,SEEK_END);
	fwrite(nValue,sizeof(char),strlen(nValue),fp);
	
	if(fp!=NULL)
	{
		fclose(fp);
		fp = NULL;
	}
    ret = 0;
    return ret;
}

int main()
{
    if(0 ==GPIOInit("35"))
    {
        SetGPIOValue("35","1");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值