65.9K
CodeProject 正在变化。 阅读更多。
Home

闪烁 LED – 使用 IoT 开发工具包操作 Intel® Galileo 板上的数字 GPIO

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014年10月17日

CPOL

2分钟阅读

viewsIcon

18172

此示例代码使用物联网开发工具包的Live USB镜像来运行一个主机系统,该系统可以使用Yocto应用程序开发工具和Eclipse*控制英特尔® Galileo板。

引言

此示例代码使用物联网开发工具包的Live USB镜像来运行一个主机系统,该系统可以使用Yocto应用程序开发工具和Eclipse*控制英特尔® Galileo板。此示例假定英特尔 Galileo板使用SD镜像启动,该镜像也包含在物联网开发工具包中。可以直接在板上使用此代码,但这将是未来论文的主题。

英特尔 Galileo板是一款Arduino*认证的板卡,它为创建项目和实现物联网创意提供了无限的可能性。下图显示了如何从操作系统访问数字GPIO的控制。

每个GPIO的逻辑表示都可以在/sys/class/gpio目录中找到。Sergey的博客对模块和GPIO的映射进行了出色的介绍,包括上述映射,解释了系统中GPIO背后的硬件。

对于此示例,我们将使用引脚编号5、6和7,因为它们直接映射到硬件,并且没有其他输入(例如,与引脚#3不同)。我们将一个LED连接到这些引脚中的每一个。由于每个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值到01,从而有效地启用或禁用端口中的电压,并使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);
        }

完整的代码可以在这里找到。要执行它,请在物联网开发工具包的Live USB镜像中打开Hello World示例,并将那里的代码替换为BlinkingLEDs.c文件的代码。它应该可以正常运行。

Intel 和 Intel 标志是 Intel Corporation 在美国和/或其他国家/地区的商标。
版权所有 © 2014 英特尔公司。保留所有权利。
*其他名称和品牌可能被声明为他人的财产。

© . All rights reserved.