硬件环境:MinnowBoard Turbot(英特尔嵌入式大赛指定开发板)
软件环境:Linux MinnowBoard 4.2.0-27-generic #32~14.04.1-Ubuntu(内核版本:4.2.0,Ubuntu14.04)
注意:根据官方WIKI上讲的,在内核版本为3.18之后才有gpio对应的驱动,所以本文只对应内核版本>=3.18的系统,
如果板子的内核版本太低,可网上检索相关升级方法。
关于GPIO的使用:网上有很多开源的库,但大多是要用Python的,还有些事在Windows平台上的,所以在Linux上用C控制IO口的文章很少。
板子的IO口排列如图:
控制原理:以文件写入的方式控制Linux"/sys"下的设备类。
命令行控制IO:
经过下面的过程编号为GPIO_0的IO口将输出高电平(必须以root身份运行)
cd /sys/class/gpio
su root
echo 338 > export
echo out > gpio338/direction
echo 1 > gpio338/value
在了解了控制原理后,我们就可以写一个简单的控制LED闪烁的小程序;
硬件连接如图:
源代码:
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#define GPIO_EXPORT "/sys/class/gpio/export"
#define GPIO_338_DIR "/sys/class/gpio/gpio338/direction"
#define GPIO_339_DIR "/sys/class/gpio/gpio339/direction"
#define GPIO_338_VALUE "/sys/class/gpio/gpio338/value"
#define GPIO_339_VALUE "/sys/class/gpio/gpio339/value"
static char* gpio338 = "338";
static char* gpio339 = "339";
static char* gpioOut = "out";
static char* gpioH = "1";
static char* gpioL = "0";
static FILE *gpioFd1;
static FILE *gpioFd2;
void gpioInit()
{
FILE *gpioDir1;
FILE *gpioDir2;
FILE *gpioExport;
gpioExport = fopen(GPIO_EXPORT,"w");
if(gpioExport == NULL)
{
printf("Please run as root!\n");
exit(0);
}
fwrite(gpio338,sizeof(gpio338),1,gpioExport);
fwrite(gpio339,sizeof(gpio339),1,gpioExport);
gpioDir1 = fopen(GPIO_338_DIR,"w");
gpioDir2 = fopen(GPIO_339_DIR,"w");
gpioFd1= fopen(GPIO_338_VALUE,"w");
gpioFd2= fopen(GPIO_339_VALUE,"w");
fwrite(gpioOut,sizeof(gpioOut),1,gpioDir1);
fwrite(gpioOut,sizeof(gpioOut),1,gpioDir2);
}
void gpioSet(unsigned int io,char* value)
{
if(io == 1)
{
fseek(gpioFd1,0L,SEEK_SET);
fwrite(value,sizeof(value),1,gpioFd1);
}
else if(io == 2)
{
fseek(gpioFd2,0L,SEEK_SET);
fwrite(value,sizeof(value),1,gpioFd2);
}
else
{}
}
int main()
{
gpioInit();
while(1)
{
gpioSet(1,gpioH);
usleep(500000);
gpioSet(1,gpioL);
usleep(500000);
}
return 0;
}
编译运行后,会看到LED的闪烁。
因为我的作品中只用到了两个IO口,所以没有写一些通用的代码,但可以在此基础上根据你的需求来扩展。