beaglebone C语言编程,BeagleBone的GPIO控制

本文详细介绍了如何使用BeagleBone的GPIO接口来控制LED灯,包括选择GPIO口、设置工作模式以及编写控制程序。通过设置GPIO1_6为MODE7并配置相关寄存器,实现了通过C语言程序控制LED的闪烁,进一步理解了BeagleBone的硬件接口操作。
摘要由CSDN通过智能技术生成

经过近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。

a4c26d1e5885305701be709a3d33442f.png

首先查看GPIO1_6引脚的工作模式,在中断输入:# cat

/sys/kernel/debug/omap_mux/gpmc_ad6回车后可以看到如下内容:

a4c26d1e5885305701be709a3d33442f.png

由上图可知GPIO1_6工作模式为OMAP_MUX_MODE0(MODE0),寄存器的数据为0x0000,而作为普通I/O口工作模式为MODE7,所以需要更改工作模式。查询AM335X的Technical

Reference Manual的表Table

9-58(如下图),使能上拉电阻,工作模式为MODE7寄存器需要设置为0x0007。

a4c26d1e5885305701be709a3d33442f.png

在终端内输入:# echo 7

>

/sys/kernel/debug/omap_mux/gpmc_ad6,即可通过管道设置GPIO1_6的寄存器值为0x0007,再次输入:#cat

/sys/kernel/debug/omap_mux/gpmc_ad6可以看到如下内容:

a4c26d1e5885305701be709a3d33442f.png

可以看到工作模式已经更改为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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值