1).?簡介
GPIO應用是嵌入式設備最基本的應用之一,?本文就基于Embedded Linux系統演示開發GPIO中斷以及輸出相關的基本應用示例.
本文所采用的硬件平臺來自與Toradex發布的基于NXP iMX7 SoC的Colibri iMX7 ARM計算機模塊配合Colibri Eva Board.
2).?準備
a). ToradexColibri iMX7S?(基于NXP iMX7SSoC)計算機模塊配合Colibri Eva Board開發載板.
b). Embedded Linux使用Toradex官方發布的Linux release V2.6.1,?更新方法請見這里.
3).?軟硬件安裝
a).?本文所實現的GPIO應用原理為使用兩個GPIO接口,?一個作為按鍵輸入使用,?另外一個作為輸出驅動載板上面的LED.?每次按鍵后,?會將LED狀態翻轉,?也就是點亮和熄滅交替.
b).?硬件連接,將Colibri Eva載板X3連接器C19和X21連接器SW6連接,作為按鍵輸入端;?將X3連接器A19和X21連接器LED1連接,?用于驅動LED1.
c).?在Ubuntu 14.04?開發主機配置開發環境,?這里使用Eclipse作為開發IDE,?具體配置可以參考這里的Linux開發上手指南.
4). GPIO應用示例
a).?運行Eclipse,?創建一個新項目,?命名?”gpiointtest” ,?配置為?”Empty Project”?和?“Cross GCC”.
b).?在?”gpiointtest”?項目下首先新建GPIO操作相關的header和source文件
./ Header?文件?” gpioconfig.h”?代碼如下,?主要定義一些全局環境變量和聲明GPIO基本的操作函數
https://github.com/simonqin09/gpiointtest/blob/master/gpioconfig.h
./ source文件?“gpioconfig.c”?代碼如下,主要是GPIO基本操作函數
https://github.com/simonqin09/gpiointtest/blob/master/gpioconfig.c
c).?主函數文件為?“gpiointtest.c”,?源代碼如下,?其主要實現的功能要點下面會逐一列出.
https://github.com/simonqin09/gpiointtest/blob/master/gpiointtest.c
./?參考Colibri iMX7數據手冊以及這里的GPIO號碼定義規則,?本文所使用的C19和A19引腳對應的GPIO為GPIO-53和GPIO-52,?因此主程序在最開始就做了定義,?對應變量gpio2和gpio1.
./?變量定義完成后第二部分就是GPIO的export和配置,?將gpio1配置為輸出, gpio2?配置為中斷輸入,?上升沿觸發.
./?這里我們采用?”poll”?函數作為中斷事件處理函數,?使用的也是其標準用法,?這里就不贅述.
./?這里詳細說明下在觸發事件后的處理,?也就是?” if (fdset[1].revents & POLLPRI)”?里面的內容.?首先通過“lseek”?函數將文件還原以便處理下一次中斷觸發;?然后通過?”cnt”?變量的判定排除程序運行第一次默認觸發的中斷;?最后在有效中斷觸發情況下,?再通過?“usleep”?和?gpio2?當前value的讀取來排除機械按鍵抖動,?這樣在每次確定按鍵的前提下,?將gpio1?的輸出做反轉,?對應也就是LED亮和滅.
d).?編譯項目,?然后將可執行文件scp下載到colibri imx7執行,?執行情況如下.?在測試中也可以發現當出現按鍵抖動的時候,?按鍵次數統計輸出會跳過抖動的那次計數,?同樣LED控制也不會被干擾.
?
e).?當在所需要同時控制的GPIO數量比較多的情況下,?采用?”epoll”?函數效率會高于?“poll”,?因此這里也將基于“epoll”?的主程序代碼羅列如下,?其思路和上面是一致的,?就不贅述.
https://github.com/simonqin09/gpiointtest/blob/master/gpiointtest_epoll.c
?
評論
查看更多