BeagleBone的GPIO控制
阅读原文时间:2021年04月20日阅读:1

经过近1个月的折腾总算熟悉BeagleBone(狗骨头)的开发流程了,作为一个月的总结按照惯例首先写个GPIO点亮LED程序。由BeagleBone System Reference Manual可知每个GPIO有8中工作模式,分别为MODE0-MODE7,不同的工作模式GPIO具有不同的功能。通常情况下,默认的工作模式为MODE7,但不是所有的GPIO都设置为MODE7。所以要通过GPIO点亮LED需要三个步骤:1.选定具体GPIO口;2.设置GPIO口的工作模式;3.编写控制程序。下面由这三个方面分别描述。

一. 选定具体的GPIO口

这一步非常简单,任何一个GPIO口都可以满足要求。在此为了方便电路的连接选了扩展插排P8的Pin3,而Pin1与GND相连接,在Pin1和Pin3之间串联一个510欧姆左右的电阻和LED就完成了电路。注意:电阻不要太小,GPIO的拉电流最大只有8mA。

二. 设定GPIO的工作模式

BeagleBone的引脚工作模式设置比较方便,在/sys/kernel/debug/omap_mux文件下有每个引脚的模式设定文件。在终端输入:# ls /sys/kernel/debug/omap_mux就可以查看到。扩展插排P8的Pin3对应GPIO1_6,由下表可知对应设置文件为gpmc_ad6。同理,GPIO1_7对应的文件为gpmc_ad7,TIMER4对应的文件为gprnc_advn_ale。


    首先查看GPIO1_6引脚的工作模式,在中断输入:# cat /sys/kernel/debug/omap_mux/gpmc_ad6回车后可以看到如下内容:

 

由上图可知GPIO1_6工作模式为OMAP_MUX_MODE0(MODE0),寄存器的数据为0x0000,而作为普通I/O口工作模式为MODE7,所以需要更改工作模式。查询AM335X的Technical Reference Manual的表Table 9-58(如下图),使能上拉电阻,工作模式为MODE7寄存器需要设置为0x0007。

在终端内输入:# echo 7 > /sys/kernel/debug/omap_mux/gpmc_ad6,即可通过管道设置GPIO1_6的寄存器值为0x0007,再次输入:#cat /sys/kernel/debug/omap_mux/gpmc_ad6可以看到如下内容:

可以看到工作模式已经更改为MODE7,至此就完成了GPIO的工作模式设置。

3. 编写控制程序

GPIO的配置文件在/sys/class/gpio目录下,控制程序可以分为四个步骤:

  • 配置GPIO:在/sys/class/gpio目录下可以看到文件export,调用该文件以实现配置。该文件对所有GPIO编号,从0开始。GPIOn_x的编号为32*n+x,例如此处用的GPIO1_6的编号为32*1+6=38。在终端输入:# echo "38" > /sys/class/gpio/export,在此回到目录/sys/class/gpio下,可以看到产生了一个新的目录./gpio38,里面包含了该IO口的输入输出设置等配置文件。注意:export文件只有root写权限,执行上述命令或者以后用C编写的可执行文件要以ROOT身份执行。

  • 设置GPIO的方向(输入输出):在终端输入:# echo "out" > /sys/class/gpio/gpio38/direction,即设置该GPIO为输出。

  • 设置GPIO的输出电平:在终端输入:#echo "1" > /sys/class/gpio/gpio38/value,即设置GPIO输出高电平,输入echo "0" > /sys/class/gpio/gpio38/value设置GPIO输出低电平。

  • 关闭GPIO:在终端输入:#echo "38" > /sys/class/gpio/unexport,即删除GPIO配置文件,可以看到目录gpio38已经被删除。

    下面是C语言编写的GPIO控制例程,实现LED的每隔一秒闪烁一次。

    #include
    #include
    #include
    #include
    int main(void)
    {
      FILE *p=NULL;
      int i=0;
      p = fopen("/sys/class/gpio/export","w");
      fprintf(p,"%d",38);
      fclose(p);
      p = fopen("/sys/class/gpio/gpio38/direction","w");
      fprintf(p,"out");
      fclose(p);
      for(i=0;i<100;i++)
      {
        p = fopen("/sys/class/gpio/gpio38/value","w");
        fprintf(p,"%d",1);
        sleep(1);
        fclose(p);
        p = fopen("/sys/class/gpio/gpio38/value","w");
        fprintf(p,"%d",0);
        sleep(1);
        fclose(p);
      }
      p = fopen("/sys/class/gpio/unexport","w");
      fprintf(p,"%d",38);
      fclose(p);
      return 0;
    }

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章