簡要復(fù)習(xí)一下ARM9中斷控制器的控制過程:
1.首先能識別觸發(fā)的中斷(對應(yīng)中斷源必須打開,然后查詢當(dāng)前中斷狀態(tài)寄存器),硬件會操控PC跳到中斷向量入口(IRQ_HANDLE,硬件控制的只要是IRQ中斷類型就會進(jìn)入),在中斷跳轉(zhuǎn)函數(shù)里面保存現(xiàn)場(保存R0等等工作寄存器)--跳到服務(wù)函數(shù)(里面進(jìn)行中斷源判斷和處理)---恢復(fù)現(xiàn)場,基本流程是這樣。
2.中斷的觸發(fā):高低電平,上升下降沿等等,具體的設(shè)置寄存器實(shí)現(xiàn)。
3.中斷能否傳到CPU?觸發(fā)以后還要通過許多開關(guān)(寄存器設(shè)置使能與否)確保到達(dá)CPU,這樣CPU才能識別(有的中斷源是不需要的),有些中斷是二級中斷,需要開關(guān)比較多,注意芯片手冊說明
4.
比如我們要觸發(fā)的是INT_TC這個二級中斷信號。好,那么我們要打開的開關(guān)是什么呢?在二級中斷信號里,INTSUBMSK是二級中斷信號的開關(guān),我們要在里面找到INT_TC這個位并設(shè)置為1即可。二級中斷還得傳到一級中控器處理,那么我們先找出INT_TC是屬于哪個一級中斷信號的,看表里的紫色框起來的是二級屬于同一個一級信號的,一級信號處理那個也有個紫色框,INT_ADC就是我們要找到的對應(yīng)一級信號。而它也有對應(yīng)的開關(guān),那么就是INTMSK這個控制器。我們把INTMSK里的INT_ADC位設(shè)置為1就算成功了。
代碼也就是
INTSUBMSK"=(0x1<<9);//因?yàn)镮NT_TC在INTSUBMSK里的第9位,注意從0開始
INTMSK|=(0x1<<31);//INT_ADC在INTMSK里的第31位。
其他的類似外部中斷也是這樣操作。只是一級中斷的可以直接從一級中控器處理,那么就只設(shè)置一級中控器的相應(yīng)開關(guān)即可。也就是說,我們要用到的設(shè)備接口,我們就把相應(yīng)的開關(guān)打開就可以了,其他的讓ARM來處理就可以了。
5.EIN4_7屬于一級中斷源,但是該中斷源包含EIN4EIN5EIN6EIN7四個子中斷源。
SRCPND源掛起寄存器。
該寄存器在中斷源發(fā)出請求時候,處理器就會自動置位該寄存器的相應(yīng)的位為1.
注意:根據(jù)三星文檔知道,該位不受寄存器影響,這個寄存器是屏蔽寄存器。在則在執(zhí)行服務(wù)程序時候,該位不許進(jìn)行清除,否則會導(dǎo)致連續(xù)中斷。清除方法是往該位寫入1。
INTMOD中斷模式寄存器
該寄存器決定中斷源為FIQ中斷還是IRQ中斷。
注意:根據(jù)三星文檔,INTPND寄存器和INTOFFSET寄存器只對IRQ模式有效
INTMSK中斷屏蔽寄存器
決定是否屏蔽某中斷源
注意:沒有
PRIORITY優(yōu)先級寄存器
決定中斷源優(yōu)先級。
INTPND中斷服務(wù)程序標(biāo)志位
根據(jù)文檔說,在中斷源沒被屏蔽,并且在等待中斷服務(wù),優(yōu)先級也是最最高的置1.啥意思,就是該寄存器對應(yīng)位置1,表示CPU已經(jīng)響應(yīng)該對應(yīng)的中斷請求。
注意:和SRCPND一樣,在中斷服務(wù)程序時候要清除該對應(yīng)位。
INTOFFSET寄存器
該寄存器和INTPND配合使用的。標(biāo)明INTPND寄存器里對應(yīng)IRQ中斷反映在INTOFFSET寄存器的值
注意:也需要清除位
SUBSRCPND寄存器
該寄存器與.SRCPND寄存器配合使用,在子中斷源發(fā)出請求時候,處理器就會自動置位該寄存器的相應(yīng)的位為1.
INTSUBMSK寄存器
該寄存器和INTMSK寄存器一樣,只不過是相對于子中斷而言而已。
6.借用別人網(wǎng)站的圖
其中深黑色的就是編程要用的寄存器,而淺黑色的寄存器時CPU根據(jù)我們配置的寄存器產(chǎn)生的標(biāo)志位寄存器。
7.最后我感覺和51還是比較類似的,設(shè)置引腳為外部中斷(有的是內(nèi)部中斷),使能,確定優(yōu)先級,識別到觸發(fā),保存現(xiàn)場,處理,恢復(fù)現(xiàn)場。嵌入式linux的程序需要和匯編一起組織,目前不是特別熟悉,學(xué)習(xí)ing~