<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于Linux系統實(shí)現DragonBoard 410c GPIO的控制

基于Linux系統實(shí)現DragonBoard 410c GPIO的控制

作者: 時(shí)間:2017-10-11 來(lái)源:網(wǎng)絡(luò ) 收藏
通過(guò)芯片的GPIO口輸出電平去控制外部設備,如繼電器、LED或者觸發(fā)某些模塊進(jìn)行工作是嵌入式控制系統常用的功能,也是實(shí)現許多復雜控制系統的基礎,本文將教大家基于DragonBoard 410c GPIO開(kāi)發(fā)板在的環(huán)境下完成對DragonBoard 410c GPIO的控制,并且通過(guò)控制按鍵和點(diǎn)亮LED等進(jìn)行實(shí)例測試以熟悉整個(gè)GPIO操作過(guò)程。

一、 DragonBoard 410c GPIO口分布情況及測試硬件連線(xiàn)

如圖1所示,在 DragonBoard 410c 開(kāi)發(fā)板上,其GPIO口通過(guò)接口進(jìn)行了預留,用戶(hù)在開(kāi)發(fā)測試過(guò)程中可以方便的通過(guò)排針或者排線(xiàn)接入到 DragonBoard 410c 的GPIO口,實(shí)現與外設的連接,對外設進(jìn)行控制,同時(shí)也可以通過(guò)下載 DragonBoard 410c GPIO PDF和使用說(shuō)明文檔查看其GPIO詳細信息,在410c資料包中的SchemaTIcas_DragonBoard.pdf文件中對410c板子的GPIO口設計有詳細的說(shuō)明,如下圖1給出了開(kāi)發(fā)板的GPIO硬件接口J8的詳細設計,通過(guò)該圖可以知道整個(gè)410c開(kāi)發(fā)板的GPIO外部接口連接情況。

本文引用地址:http://dyxdggzs.com/article/201710/365557.htm

圖1 DragonBoard 410c外部GPIO口引出接口J8的連接原理圖

根據上述原理圖,可以在板子上用杜邦線(xiàn)連接,本文在測試過(guò)程中選取的是GPIO_36和GPIO_12兩個(gè)GPIO口作為控制,其中GPIO12控制LED燈,GPIO_36用于接收按鍵信號,檢測開(kāi)關(guān)是否被按下,開(kāi)關(guān)每次按下LED燈狀態(tài)改變一次,整個(gè)控制電路硬件連接如圖2所示。

圖2 DragonBoard 410c按鍵控制LED燈硬件連接示意圖

二、程序設計

1)在環(huán)境下用vim編輯器建立工程程序文件key_led_test.c,該文件是測試工程的主文件,起命令如下:

mkdir key_led_test

vim key_led_test.c

通過(guò)GPIO口控制LED和檢測按鍵信號的基本原理如下:

首先需要對使用的GPIO口進(jìn)行導入,完成導入后的GPIO口才可以進(jìn)讀寫(xiě),起導入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口進(jìn)行讀寫(xiě)數據,其中讀寫(xiě)的實(shí)現函數及代碼如下:

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(fd0)

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(fd0)

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(fd0)

return -1;

// Read the GPIO value

read(fd, val, 1);

*value = atoi(val);

close(fd); return 0;

}

最后,完成GPIO的讀寫(xiě)操作后,需要導出GPIO口,起實(shí)現函數及代碼如下:

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口的核心函數及實(shí)現過(guò)程,接著(zhù)利用這些核心函數的調用和設計簡(jiǎn)單的邏輯就可以完成對連接410c板子上的按鍵進(jìn)行檢測同事控制LED等的狀態(tài),其中按鍵檢測的實(shí)現函數如下:

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; //按下時(shí)間超過(guò)1s,表示完成一次按動(dòng)作,退出檢測。

}

}while(!tmp)

if(time>=50){ //大于0.5s認為按鍵按下,不是干擾或者誤按

return KEY_DOWN;

}

else return KEY_UP;

}

完成按鍵檢測后,就可以根據按鍵來(lái)實(shí)現對LED的控制,其中LED的控制是通過(guò)輸出高電平來(lái)點(diǎn)亮LED,輸出低電平來(lái)熄滅LED,其實(shí)現函數如下:

int set_led_status(int Led,int status){

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

return 0;

}

else return -1;

}

基于對GPIO的讀寫(xiě)函數完成上述KEY的狀態(tài)讀取和LED的狀態(tài)控制函數后,就可以利用這兩個(gè)函數方便的構建按鍵控制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 statusn”);

while(1) {

KeyStatus=get_key_status(GPIO_A);

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

else{

printf(“get_key_status erro!n”);

return -1;

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

printf(“set_led_status erro!n”);

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;

}

以上就是整個(gè)利用410c開(kāi)發(fā)板在操作系統環(huán)境下實(shí)現對GPIO的操作,通過(guò)GPIO口讀取按鍵信息實(shí)現對LED的控制。

三、程序編譯和運行

在linux環(huán)境下,可以通過(guò)arm-linux-gcc交叉編譯工具來(lái)編譯平臺的程序,生成可執行的程序文件,然后下載到開(kāi)發(fā)板上運行,其中編譯命令參考如下:

arm-linux-gcc -o key_led_test key_led_test.c

完成編譯后生成key_led_test文件,執行下面命令改變其權限,使得其成為可執行文件:

chmod 777 key_led_test

最后執行key_led_test即可在板子上通過(guò)按按鍵控制LED燈。



關(guān)鍵詞: DragonBoard410c linux

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>