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