嵌入式Linux下使用GPIO中斷功能
1). 簡介
本文引用地址:http://www.j9360.com/article/201703/344828.htmGPIO應用是嵌入式設備最基本的應用之一, 本文就基于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” 的主程序代碼羅列如下, 其思路和上面是一致的, 就不贅述.
評論