
该示例代码采用 IoT 开发套件的 Live USB 映像运行主机系统,该系统可通过 Yocto 应用开发工具和 Eclipse* 控制英特尔 Galileo 开发板。 该示例假定英特尔 Galileo 开发板通过 SD 映像启动,IoT 开发套件也提供该映像。 用户也可以在开发板上直接使用该代码,这一话题今后再予以讨论。
英特尔 Galileo 开发板是一款 Arduino* 认证开发板,在项目创建和有关物联网的创意方面提供了无限可能。 下图显示了如何通过操作系统控制数字 GPIO。

各 GPIO 的逻辑表示位于 /sys/class/gpio 目录中。 Sergey 的博客 全面介绍了 GPIO 模块与映射,包括映射系统中 GPIO 下层的硬件。
本示例中,我们将使用 5 号、6 号和 7 号 pin,因为它们可以直接映射到硬件,无需其他输入(与 pin #3 不同)。 我们将 LED 连接到任意一个 pin。 由于每个 LED 都有自己所需的输入电压,我们通过增加电阻来调节电压。 如下图所示。

下列示例代码显示了操控 GPIO 所需的步骤:
(1) 将 GPIO 数输出到/sys/class/gpio/export 文件
(2) 设置方向:in 为输入,out 为输出
上述步骤借助 openGPIO 函数得以完成,该函数打开相应的文件并返回文件标识符,以支持后续读取或写入(取决于设置的方向)。
int openGPIO(int gpio, int direction )
{
char buffer[256];
int fileHandle;
int fileMode;
//Export GPIO
fileHandle = open("/sys/class/gpio/export", O_WRONLY);
if(ERROR == fileHandle)
{
puts("Error: Unable to opening /sys/class/gpio/export");
return(-1);
}
sprintf(buffer, "%d", gpio);
write(fileHandle, buffer, strlen(buffer));
close(fileHandle);
//Direction GPIO
sprintf(buffer, "/sys/class/gpio/gpio%d/direction", gpio);
fileHandle = open(buffer, O_WRONLY);
if(ERROR == fileHandle)
{
puts("Unable to open file:");
puts(buffer);
return(-1);
}
if (direction == GPIO_DIRECTION_OUT)
{
// Set out direction
write(fileHandle, "out", 3);
fileMode = O_WRONLY;
}
else
{
// Set in direction
write(fileHandle, "in", 2);
fileMode = O_RDONLY;
}
close(fileHandle);
//Open GPIO for Read / Write
sprintf(buffer, "/sys/class/gpio/gpio%d/value", gpio);
fileHandle = open(buffer, fileMode);
if(ERROR == fileHandle)
{
puts("Unable to open file:");
puts(buffer);
return(-1);
}
return(fileHandle); //This file handle will be used in read/write and close operations.
}
在主函数中,我们为希望操控的每个针调用 openGPIO:
fileHandleGPIO_5 = openGPIO(GP_5, GPIO_DIRECTION_OUT);
fileHandleGPIO_6 = openGPIO(GP_6, GPIO_DIRECTION_OUT);
fileHandleGPIO_7 = openGPIO(GP_7, GPIO_DIRECTION_OUT);
验证无误后,我们进入有趣的部分,即将 GPIO 值改为0 或 1,从而有效启用或禁用端口的电压,并使 LED 闪烁:
for(i=0; i< 10; i++)
{
//LED ON
writeGPIO(fileHandleGPIO_LED, 1);
writeGPIO(fileHandleGPIO_5, 1);
writeGPIO(fileHandleGPIO_6, 1);
writeGPIO(fileHandleGPIO_7, 1);
sleep(BLINK_TIME_SEC);
//LED OFF
writeGPIO(fileHandleGPIO_LED, 0);
writeGPIO(fileHandleGPIO_5, 0);
writeGPIO(fileHandleGPIO_6, 0);
writeGPIO(fileHandleGPIO_7, 0);
sleep(BLINK_TIME_SEC);
}
如欲获得完整代码,请点击此处。 如欲执行代码,请打开随 IoT 开发套件的 Live USB 映像提供的 Hello World示例,并用 BlinkingLEDs.c 文件中的代码替换示例中的代码。 此时程序可正常运行。
文章来源:英特尔开发人员专区