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