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