本文自己学习+记录
一、介绍
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;
}