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