怎样查看或设置gpio输入输出模式口的工作模式

BeagleBone的GPIO控制
&经过近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文件下有每个引脚的模式设定文件。在终端输入:#
/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
/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 &stdio.h&
#include &stdlib.h&
#include &unistd.h&
#include &string.h&
int main(void)
&FILE *p=NULL;
&p = fopen("/sys/class/gpio/export","w");
&fprintf(p,"%d",38);
&fclose(p);
fopen("/sys/class/gpio/gpio38/direction","w");
&fprintf(p,"out");
&fclose(p);
&for(i=0;i&100;i++)
fopen("/sys/class/gpio/gpio38/value","w");
&&fprintf(p,"%d",1);
&&sleep(1);
&&fclose(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;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 查看硬盘工作模式 的文章

 

随机推荐