<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于Linux系統(tǒng)實(shí)現(xiàn)DragonBoard 410c GPIO的控制

          基于Linux系統(tǒng)實(shí)現(xiàn)DragonBoard 410c GPIO的控制

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201710/365557.htm

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

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

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

          二、程序設(shè)計(jì)

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

          mkdir key_led_test

          vim key_led_test.c

          通過GPIO口控制LED和檢測(cè)按鍵信號(hào)的基本原理如下:

          首先需要對(duì)使用的GPIO口進(jìn)行導(dǎo)入,完成導(dǎo)入后的GPIO口才可以進(jìn)讀寫,起導(dǎo)入GPIO口的函數(shù)機(jī)代碼如下:

          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; }

          }

          然后對(duì)GPIO口進(jìn)行讀寫數(shù)據(jù),其中讀寫的實(shí)現(xiàn)函數(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的讀寫操作后,需要導(dǎo)出GPIO口,起實(shí)現(xiàn)函數(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ù)及實(shí)現(xiàn)過程,接著利用這些核心函數(shù)的調(diào)用和設(shè)計(jì)簡(jiǎn)單的邏輯就可以完成對(duì)連接410c板子上的按鍵進(jìn)行檢測(cè)同事控制LED等的狀態(tài),其中按鍵檢測(cè)的實(shí)現(xiàn)函數(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í)間超過1s,表示完成一次按動(dòng)作,退出檢測(cè)。

          }

          }while(!tmp)

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

          return KEY_DOWN;

          }

          else return KEY_UP;

          }

          完成按鍵檢測(cè)后,就可以根據(jù)按鍵來實(shí)現(xiàn)對(duì)LED的控制,其中LED的控制是通過輸出高電平來點(diǎn)亮LED,輸出低電平來熄滅LED,其實(shí)現(xiàn)函數(shù)如下:

          int set_led_status(int Led,int status){

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

          return 0;

          }

          else return -1;

          }

          基于對(duì)GPIO的讀寫函數(shù)完成上述KEY的狀態(tài)讀取和LED的狀態(tài)控制函數(shù)后,就可以利用這兩個(gè)函數(shù)方便的構(gòu)建按鍵控制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開發(fā)板在操作系統(tǒng)環(huán)境下實(shí)現(xiàn)對(duì)GPIO的操作,通過GPIO口讀取按鍵信息實(shí)現(xiàn)對(duì)LED的控制。

          三、程序編譯和運(yùn)行

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

          arm-linux-gcc -o key_led_test key_led_test.c

          完成編譯后生成key_led_test文件,執(zhí)行下面命令改變其權(quán)限,使得其成為可執(zhí)行文件:

          chmod 777 key_led_test

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



          關(guān)鍵詞: DragonBoard410c linux

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();