嵌入式Linux下使用GPIO中斷功能
1). 簡介
本文引用地址:http://2s4d.com/article/201703/344828.htmGPIO應(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), 也就是點(diǎ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). 運(yùn)行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)的功能要點(diǎ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” 變量的判定排除程序運(yùn)行第一次默認(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” 的主程序代碼羅列如下, 其思路和上面是一致的, 就不贅述.
評論