MinnowBoard Turbot/Max GPIO使用

硬件环境: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口排列如图:

MinnowBoard Turbot/Max GPIO使用_第1张图片


控制原理:以文件写入的方式控制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闪烁的小程序;

硬件连接如图:

MinnowBoard Turbot/Max GPIO使用_第2张图片

源代码:

#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口,所以没有写一些通用的代码,但可以在此基础上根据你的需求来扩展。

你可能感兴趣的:(嵌入式硬件相关)