GPIO那些事兒-----中斷處理
分類:IT技術 時間:2017-03-06
當然玩過單片機的人,或者arm開發板的人,最容易入手的就是gpio了吧,雖然看似是一個小事情,但是這裏還是要說下,gpio的應用最多就是來操作led燈了. 當然它還可以處理中斷,我們再看88F6500 ARM sOC的時候,這裏看它的cpu模塊裏引腳,會發現全部引腳都是MPP引腳,通過cpu相關寄存器我們可以配置單個引腳或者一組引腳來完成N多功能,包括各種總線.
GPIO故名思議輸入輸出,也就是高低電平.這裏我不參考2410或者其他就拿我工作的感想來簡單說一說吧.
或者有些soc裏把GPIO單獨列了出來,通過專有的寄存器來控制各個引腳.當然不論哪種方式我們都是通過控制相關寄存器來實現的.
首先要找到怎麽去操作gpio控制寄存器,看看cpu相關寄存器的映射地址在哪裏,這裏可以從cpu相關的datasheet裏找到,還有就是通過相關soc廠商提供的sdk代碼裏獲取.
下面我就對應相關寄存器來,說下如何操作gpio來控制led燈.
一般我們開始會把所有的gpio(和led相連的)把它首先設置為輸出,即可以點亮等,並把data out設置為0.把所有燈熄滅.
1.set GPIO Data Out Enable Control Register
2.set led on /off /blink
<1> set GPIO Data Out Register (for led on/off)
<2>set GPIO Blink Enable Register (for led blink)
這裏我們可以寫好操作gpio驅動層的函數接口.供內核裏相關模塊來調用. 如果想直接在用戶空間來控制,也是一件十分容易的事情,那麽我們可以通過/proc來實現,這裏就不具體說實現過程.
也許我說了這麽久和主題沒有多大關系啊?O(∩_∩)O,這裏先給上盤小菜,讓我們從全局對gpio有個認識.我個人認為gpio中斷是一個很棒的事情,至少感覺很cool.現如今我們一般不會從零來開發(如果有時間和精力是提高技術的不錯的手段),系統會首先初始化各個irq.我們可以找到相關的代碼來參考.我在做gpio中斷的時候,感覺最難的點就是怎麽找到相應gpio對於的中斷號.這裏其實我沒有太深入的研究哈,在sdk裏一般已經會把相關gpio作為中斷號的哪部分中斷號給分配好,至少會給出一個base+idx. gpio也有interrupt regs,當然有時候事情並不是那麽簡單,或許我們還要用到cpu 相關的interrupt regs.這個就需要我們看cpu datasheet啦.萬般皆調試!
這裏簡單說一下:
GPIO interrupt Level Mask Reg設置gpio int 的電平觸發.
GPIO interrupt Mask Reg 設置gpio int邊沿觸發.
GPIO interrupt Cause Reg 引發int,默認為0,觸發會變成1.
當然還有cpu int相關部分,自己參考datasheet. 下面說說如何來實現.
1.初始化gpio int regs
2.調用request_irq()來註冊中斷例程.
int request_irq(unsigned int irq,
irqreturn_t (*handler)(int, void *, struct pt_regs *),
unsigned long irqflags, const char * devname, void *dev_id)
註冊成功後,我們可以通過cat /proc/interrupts 來查看.
事情到這裏還沒有完工,因為雖然我們可以用中斷例程來實現我們想要做的工作,可是也許我們想要把這個觸發事情通知給用戶層.那麽這裏我們需要借助netlink機制.
1.在用戶空間創建一個socket (AF_NETLINK, SOCK_RAW, NETLINK_CTRL);
2.守護線程 recvmsg()來接觸來自底層的消息
3.底層來發送消息.
netlink機制本來就是一塊大的東西,需要專門來研究.
Tags:
那些事兒 單片機 寄存器 led燈 主題
文章來源:
ads
ads