基於QT的arm板GPIO的檢測系統的設計

        General Purpose Input Output (通用輸入/輸出)簡稱爲GPIO,或總線擴展器,人們利用工業標準I2C、SMBus或SPI接口簡化了I/O口的擴展。當微控制器或芯片組沒有足夠的I/O端口,或當系統需要採用遠端串行通信或控制時,GPIO產品能夠提供額外的控制和監視功能。

在嵌入式開發中,arm越來越普及,GPIO的擴展和使用也越來越多,因此它是否能正常工作對於我們使用的重要性不言而喻,因此我們在使用前必須得先判斷GPIO是否正常,鑑於傳統的檢測方案,操作複雜而且效率低,檢測的成本大,數據分析也不精確,因此開發一款操作方便的GPIO檢測系統迫在眉睫。

本系統是基於LINUX環境開發的,主要的開發工具是QT,因爲QT不但可以直接設計界面,而且還很方便。

         在我的這個系統中,其中最主要的功能就是GPIO的讀寫,相對功能比較明確也比較簡單,只要將GPIO的讀寫搞清楚了,其餘的設計就看自己設計,我主要設計的是讀15個GPIO的值,本來有16個GPIO的,但是有一個是電源的GPIO,沒有用來傳輸數據,所以在這裏只用到了15個,當然這個是核心板外設的接口,每個板的設計和原理圖也都不一樣,所以這裏就不做簡單的介紹了,我們直接來看一下讀取GPIO代碼的實現。

      如果想要讀取GPIO的數據,首先我們得打開GPIO所在的文件,然後進行操作。這裏就以我的爲列,

       cd     /sys/class/gpio/        打開文件所在的目錄 

       echo 165 > export        輸入165到GPIO3    我的165是電源接口

       cd  gpio165/       打開gpio165目錄

     echo out > direction   輸出out到direction裏面

     echo 1 > value       給165口高電平 讓他處於打開狀態

     echo 0 > value       給他低電平   讓他處於關閉狀態

    這是操作GPIO的代碼 ,在QT中的代碼的主要實現是

        fd = open(EXPORT,O_WRONLY);
        if(fd == -1)
        {
            printf("open fail\n");
            return;
        }
        ret = write(fd,GPIO[i],sizeof(“165”));
        if(ret == -1)
        {
            printf("write gpio[%s] fail\n",165);
        }
        fd = open( "/sys/class/gpio/gpio165/direction",O_RDWR);
        if(fd == -1)
        {
            printf("open file error.\n");
            return ;
        } 
            memset(buf,0,SIZE);
            ret = read(fd,buf,SIZE);
            if(buf != OUT)
            {
                ret = write(fd,"out",sizeof("out"));
                if(ret == -1)
                {
                    printf("write out fail\n");
                }
            }
        }

這就是我操作GPIO的代碼的實現,雖然這個只是165一個電源GPIO的實現,但是呢其他的也都差不多,就只是將輸出“out”改爲“in”就OK了。

最後就是再此功能的基礎上的擴展了,我數據主要是讀到GPIO所用的時間,然後將時間進行各種處理,比如最大值,最小值,將數據寫入sqlite數據庫,還有就是當地的時間,我的時間使用ntp實現的,所以時間比較準確,當然也還有其他的方法,時間準確的好處是在做掉電處理的時候計算的掉電時間準確,丟失的數據就知道了。GPIO這個項目的大體功能就是這樣,希望對有需要的人有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章