新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于Linux系統(tǒng)實現DragonBoard 410c GPIO的控制

        基于Linux系統(tǒng)實現DragonBoard 410c GPIO的控制

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

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

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

        本文引用地址:http://www.104case.com/article/201710/365557.htm

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

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

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

        二、程序設計

        1)在環(huán)境下用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(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的讀寫操作后,需要導出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等的狀態(tài),其中按鍵檢測的實現函數如下:

        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的狀態(tài)讀取和LED的狀態(tài)控制函數后,就可以利用這兩個函數方便的構建按鍵控制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;

        }

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

        三、程序編譯和運行

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

        arm-linux-gcc -o key_led_test key_led_test.c

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

        chmod 777 key_led_test

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



        關鍵詞: DragonBoard410c linux

        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 宝清县| 德江县| 九龙坡区| 五常市| 定州市| 开鲁县| 和政县| 乐至县| 山东| 绥芬河市| 蒲江县| 精河县| 昌平区| 通州区| 吉木乃县| 房产| 舟曲县| 巴中市| 陇川县| 桂阳县| 阳江市| 肥西县| 海城市| 邳州市| 慈溪市| 米泉市| 永兴县| 广平县| 凭祥市| 阿城市| 高阳县| 洪湖市| 马边| 北安市| 云浮市| 沿河| 南开区| 黄浦区| 柘荣县| 洪雅县| 永济市|