基于Linux系统实现DragonBoard 410c GPIO的控制

处理器/DSP

892人已加入

描述

通过芯片的GPIO口输出电平去控制外部设备,如继电器、LED或者触发某些模块进行工作是嵌入式控制系统常用的功能,也是实现许多复杂控制系统的基础,本文将教大家基于DragonBoard 410c GPIO开发板在linux的环境下完成对DragonBoard 410c GPIO的控制,并且通过控制按键和点亮LED等进行实例测试以熟悉整个GPIO操作过程。

一、 DragonBoard 410c GPIO口分布情况及测试硬件连线

如图1所示,在 DragonBoard 410c 开发板上,其GPIO口通过接口进行了预留,用户在开发测试过程中可以方便的通过排针或者排线接入到 DragonBoard 410c 的GPIO口,实现与外设的连接,对外设进行控制,同时也可以通过下载 DragonBoard 410c GPIO PDF和使用说明文档查看其GPIO详细信息,在410c资料包中的Schematicas_DragonBoard.pdf文件中对410c板子的GPIO口设计有详细的说明,如下图1给出了开发板的GPIO硬件接口J8的详细设计,通过该图可以知道整个410c开发板的GPIO外部接口连接情况。

Linux

图1 DragonBoard 410c外部GPIO口引出接口J8的连接原理图

根据上述原理图,可以在板子上用杜邦线连接,本文在测试过程中选取的是GPIO_36和GPIO_12两个GPIO口作为控制,其中GPIO12控制LED灯,GPIO_36用于接收按键信号,检测开关是否被按下,开关每次按下LED灯状态改变一次,整个控制威廉希尔官方网站 硬件连接如图2所示。

图2 DragonBoard 410c按键控制LED灯硬件连接示意图

二、程序设计

1)在linux环境下用vim编辑器建立工程程序文件key_led_test.c,该文件是测试工程的主文件,起命令如下:

mkdir key_led_test

vim key_led_test.c

通过GPIO口控制LED和检测按键信号的基本原理如下:

首先需要对使用的GPIO口进行导入,完成导入后的GPIO口才可以进读写,起导入GPIO口的函数机代码如下:

int Export_GPIO(int gpio) {

int fd;

char buf[MAX_BUF];

sprintf(buf, “%d”, gpio);

fd = open(“/sys/class/gpio/export”, O_WRONLY);

if(fd < 0)

return -1;

write(fd, buf, strlen(buf));

close(fd); return 0; }

}

然后对GPIO口进行读写数据,其中读写的实现函数及代码如下:

int Write_GPIO(int gpio, int value) {

int fd; char buf[MAX_BUF]; //Set the direction of the GPIO to output

sprintf(buf, “/sys/class/gpio/gpio%d/direction”, gpio);

fd = open(buf, O_WRONLY); if(fd<0)

return -1;

write(fd, “out”, 3);// Set out direction

close(fd);

sprintf(buf, “/sys/class/gpio/gpio%d/value”, gpio);

fd = open(buf, O_WRONLY);

if(fd<0)

return -1; // Write the GPIO value

sprintf(buf, “%d”, value);

write(fd, buf, strlen(buf));

close(fd); return 0;

}

int Read_GPIO(int gpio, int *value) {

int fd; char val;

char buf[MAX_BUF];

sprintf(buf, “/sys/class/gpio/gpio%d/value”, gpio);

fd = open(buf, O_RDONLY);

if(fd<0)

return -1;

// Read the GPIO value

read(fd, &val, 1);

*value = atoi(&val);

close(fd); return 0;

}

最后,完成GPIO的读写操作后,需要导出GPIO口,起实现函数及代码如下:

int UnExport_GPIO(int gpio) {

int fd; char buf[MAX_BUF];

sprintf(buf, “%d”, gpio);

fd = open(“/sys/class/gpio/unexport”, O_WRONLY);

if(fd < 0)

return -1;

write(fd, buf, strlen(buf));

close(fd); return 0;

}

以上就是操作GPIO口的核心函数及实现过程,接着利用这些核心函数的调用和设计简单的逻辑就可以完成对连接410c板子上的按键进行检测同事控制LED等的状态,其中按键检测的实现函数如下:

int get_key_status(int Key){

int tmp=1;

int time=0;

Write_GPIO(Key, 1) ;

do{

delay_ms(10);

if(Read_GPIO(Key, &tmp)==0){

time++;

}

else return -1;

if(time>=100){

break; //按下时间超过1s,表示完成一次按动作,退出检测。

}

}while(!tmp)

if(time>=50){ //大于0.5s认为按键按下,不是干扰或者误按

return KEY_DOWN;

}

else return KEY_UP;

}

完成按键检测后,就可以根据按键来实现对LED的控制,其中LED的控制是通过输出高电平来点亮LED,输出低电平来熄灭LED,其实现函数如下:

int set_led_status(int Led,int status){

if(Write_GPIO(led, status)==0){

return 0;

}

else return -1;

}

基于对GPIO的读写函数完成上述KEY的状态读取和LED的状态控制函数后,就可以利用这两个函数方便的构建按键控制LED的程序,其中.c中的部分核心代码如下:

#include

#include

#include

#include

#include

#define MAX_BUF 10

#define GPIO_A 36

#define GPIO_B 12

#define KEY_DOWN 1;

#define KEY_UP 0;

#define LED_LIGHT;

#define LED_EXTING;

int Export_GPIO(int gpio);

int UnExport_GPIO(int gpio);

int Write_GPIO(int gpio, int value);

int Read_GPIO(int gpio, int *value);

int get_key_status(int Key);

int set_led_status(int Led,int status);

int main(void) {

int KeyStatus=KEY_UP;

int LedStatus=LED_EXTING;

ret = Export_GPIO(GPIO_A);

if(ret != 0)

printf(“Error exporting GPIO_%d”, GPIO_A);

ret = Export_GPIO(GPIO_B);

if(ret != 0)

printf(“Error exporting GPIO_%d”, GPIO_B);

printf(“you can press key to change LED status ”);

while(1) {

KeyStatus=get_key_status(GPIO_A);

if(keyStatus!=-1) LedStatus=KeyStatus;

else{

printf(“get_key_status erro! ”);

return -1;

if(-1== set_led_status(GPIO_B, LedStatus)) {

printf(“set_led_status erro! ”);

return -1;

}

}

ret = UnExport_GPIO(GPIO_A);

if(ret != 0)

printf(“Error UnExporting GPIO_%d”, GPIO_A);

ret = UnExport_GPIO(GPIO_B);

if(ret != 0)

printf(“Error UnExporting GPIO_%d”, GPIO_B); return 0;

}

以上就是整个利用410c开发板在linux操作系统环境下实现对GPIO的操作,通过GPIO口读取按键信息实现对LED的控制。

三、程序编译和运行

在linux环境下,可以通过arm-linux-gcc交叉编译工具来编译平台的程序,生成可执行的程序文件,然后下载到开发板上运行,其中编译命令参考如下:

arm-linux-gcc -o key_led_test key_led_test.c

完成编译后生成key_led_test文件,执行下面命令改变其权限,使得其成为可执行文件:

chmod 777 key_led_test

最后执行key_led_test即可在板子上通过按按键控制LED灯。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
yinghuan 2017-02-23
0 回复 举报
不错!!!!! 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分