笔者今天来讲讲Linux下IO口的使用。用的硬件是三大开源器件之一的BeagleBone(狗骨头)。
(PS 三大开源器件:树莓派、Arduino和Beagle Bone)
使用的 Eclipse C/C++ 来进行操作。
如果不懂如何利用Eclipse操作的话,推荐看这两篇博客介绍。
Eclipse 进行Linux远程开发
Eclipse 远程Debug调试C程序
在使用GPIO的时候,首先需要查看一下当前哪些IO口可以直接使用。在 /sys/class/gpio下面,
引脚分配图如下:
如果要使用的IO口没有找到,则需要使用export指令将IO口导成用户可以使用的状态,这个时候就可以发现多了一个要使用的IO口的目录。
在这个目录里面就可以直接操作IO口,设置输入输出,查看当前值。
之前听到过一句很经典的话,Linux下一切皆文件,所以IO设备也当文件处理即可。
编写思路同上文讲的一样,注意的一点是操作的IO口的路径要写正确。
a. 首先要export对应的端口,现在用fopen fwrite函数来写入对应的端口名。
b. 设置输出还是输入模式。同样使用文件操作函数进行,写入out/in即可。
//头文件定义设备路径
#ifndef _IO_H_
#define _IO_H_
#include "stdio.h"
#include "string.h"
#include "time.h"
#include "unistd.h"
#define GPIO_DIR "/sys/class/gpio/"
void GPIOInit(int PinName,int InOrOut);
void SetGPIO(int PinName);
void ResetGPIO(int PinName);
unsigned char ReadGPIO(int PinName);
#endif
//.c文件函数实现
void GPIOInit(int PinName,int InOrOut) //1代表输出,0代表输入
{
FILE *stream = NULL;
char Path[50];
char Temp[20];
stream = fopen(GPIO_DIR"export","w");
sprintf(Temp,"%d",PinName);
fwrite(Temp,sizeof(int),2,stream);
fclose(stream);
if(InOrOut==1)
{
sprintf(Path,"%s%s%d%s",GPIO_DIR,"gpio",PinName,"/direction");
stream = fopen(Path,"r+"); //已存在文件并且可以读写
fwrite("out",sizeof(char),3,stream);
fclose(stream);
}
else
{
sprintf(Path,"%s%s%d%s",GPIO_DIR,"gpio",PinName,"/direction");
stream = fopen(Path,"w+"); //新建文件并且读写
fwrite("in",sizeof(char),2,stream);
fclose(stream);
}
}
设置IO口 高低电平
void SetGPIO(int PinName)
{
FILE *stream = NULL;
char Path[50];
sprintf(Path,"%s%s%d%s",GPIO_DIR,"gpio",PinName,"/value");
stream = fopen(Path,"w+");
fwrite("1",sizeof(char),1,stream);
printf("On\n");
fclose(stream);
}
void ResetGPIO(int PinName)
{
FILE *stream = NULL;
char Path[50];
sprintf(Path,"%s%s%d%s",GPIO_DIR,"gpio",PinName,"/value");
stream = fopen(Path,"w+");
fwrite("0",sizeof(char),1,stream); //设置GPIO高低电平
printf("Off\n");
fclose(stream);
}
读IO口 电平状态 使用fread函数或者fscanf函数都可以
unsigned char ReadGPIO(int PinName)
{
FILE *stream = NULL;
char Path[50];
char Temp;
sprintf(Path,"%s%s%d%s",GPIO_DIR,"gpio",PinName,"/value");
stream = fopen(Path,"w+"); //w+,新建文件并且读写,r+存在文件,且读写
//fscanf(stream,"%s",Temp);
fread(&Temp,sizeof(char),1,stream); //扫描或者读端口数据都可以
fclose(stream);
return Temp;
}