- 相關推薦
中斷寄存器
一.
S3C2440A 中的中斷控制器接受來自60 個中斷源的請求。
提供這些第一文庫網(wǎng)中斷源的是內部外設,如DMA 控制器、UART、IIC 等等。在這些中斷源中,UARTn、AC97 和EINTn 中斷對于中斷控制器而言是“或”關系。
當從內部外設和外部中斷請求引腳收到多個中斷請求時,中斷控制器在仲裁步驟后請求ARM920T 內核的FIQ或IRQ。仲裁步驟由硬件優(yōu)先級邏輯決定并且寫入結果到幫助用戶通告是各種中斷源中的哪個中斷發(fā)生了的中斷掛起寄存器中
二.中斷控制器操作
用來選擇FIQ或IRQ
程序狀態(tài)寄存器(PSR)的F 位和I 位
如果ARM920T CPU 中的PSR 的F 位被置位為1,CPU 不會接受來自中斷控制器的快中斷請求(FIQ)。同樣的如果PSR 的I 位被置位為1,CPU 不會接受來自中斷控制器的中斷請求(IRQ)。因此,中斷控制器可以通過清除PSR 的F 位和I 位為0 并且設置INTMSK 的相應位為0 來接收中斷。
.中斷控制器特殊寄存器
此處中斷控制器中有5 個控制寄存器:源掛起寄存器、中斷模式寄存器、屏蔽寄存器、優(yōu)先級寄存器和中斷掛
起寄存器。
所有來自中斷源的中斷請求首先被記錄到源掛起寄存器中;谥袛嗄J郊拇嫫,它們被分配到2 個組中,包
括快中斷請求(FIQ)和中斷請求(IRQ)。IRQ 的多仲裁過程是基于優(yōu)先級寄存器。
三.中斷掛起寄存器
S3C2440A 有兩個中斷掛起寄存器:源掛起寄存器(SRCPND)和中斷掛起寄存器(INTPND)。這些掛起寄存器表明一個中斷請求是否為掛起。
當中斷源請求中斷服務,SRCPND 寄存器的相應位被置位為1,并且同時在仲裁步驟后INTPND 寄存器僅有1 位自動置位為1。如果屏蔽了中斷,則SRCPND 寄存器的相應位被置位為1。這
并不會引起INTPND 寄存器的位的改變。
當INTPND 寄存器的掛起位為置位,每當I 標志或F 標志被清除為0 中斷服務程序將開始。
SRCPND 和INTPND 寄存器可以被讀取和寫入,因此服務程序必須首先通過寫1 到SRCPND寄存器的相應位來清除掛起狀態(tài)并且通過相同方法來清除INTPND 寄存器中掛起狀態(tài)。
四.中斷屏蔽寄存器
此寄存器表明如果中斷相應的屏蔽位被置位為1 則禁止該中斷。如果某個INTMSK 的中斷屏蔽位為0,將正常服務中斷。如果INTMSK 的中斷屏蔽位為1 并且產生了中斷,將置位源掛起位。
源掛起(SRCPND)寄存器
SRCPND 寄存器由32 位組成,其每一位都涉及一個中斷源。如果中斷源產生了中斷則相應的位被設置為1 并且等待中斷服務。因此此寄存器指示出是哪個中斷源正在等待請求服務。注意SRCPND 寄存器的每一位都是由中斷源自動置位,其不顧INTMASK 寄存器中的屏蔽位。另外SRCPND 寄存器不受中斷控制器的優(yōu)先級邏輯的影響。在指定中斷源的中斷服務程序中,必須通過清除SRCPND 寄存器的相應位來正確的獲得來自相同源的中斷請求。如果從ISR 中返回并且未清除相應位,則中斷控制器的操作就好像其它中斷請求已經從同一個源進入了。換句話說,如果SRCPND 寄存器的指定位被設置為1,其通常被認作一個有效中斷請求正在等待服務。清除相應位的時間依賴于用戶的需要。如果希望收到來自相同源的其它有效請求,則應該首先清除相應位
并且接著使能中斷。
可以通過寫入一個數(shù)據(jù)到此寄存器來清除SRCPND 寄存器的指定位。其只清除那些數(shù)據(jù)中被設置為1 的相應位置的SRCPND 位。那些數(shù)據(jù)中被設置為0 的相應位置的位保持不變。
中斷模式(INTMOD)寄存器
此寄存器由32 位組成,其每一位都都涉及一個中斷源。如果某個指定位被設置為1,則在FIQ(快中斷)模式
中處理相應中斷。否則則在IRQ 模式中處理。特別注意,只能有一個中斷設置為快速中斷模式。
中斷屏蔽(INTMSK)寄存器
此寄存器由32 位組成,其每一位都涉及一個中斷源。如果某個指定為被設置為1,則CPU 不會去服務來自
相應中斷源(請注意即使在這種情況中,SRCPND 寄存器的相應位也設置為1)的中斷請求。如果屏蔽位為0,則可以服務中斷請求。
中斷掛起(INTPND)寄存器
中斷掛起寄存器中32 位的每一位都表明了是否相應未屏蔽并且正在等待中斷服務的中斷請求具有最高的優(yōu)先
級。當INTPND 寄存器在優(yōu)先級邏輯后被定位了,只有1 位可以設置為1 并且產生中斷請求IRQ 給CPU。IRQ 的
中斷服務程序中可以讀取此寄存器來決定服務32 個中斷源的哪個源。
就如SRCPND 寄存器,必須在中斷服務程序中清除了SRCPND 寄存器后清除此寄存器?梢酝ㄟ^寫入數(shù)據(jù)
到此寄存器中來清除INTPND 寄存器的指定位。只會清除數(shù)據(jù)中設置為1 的相應INTPND 寄存器位的位置。數(shù)據(jù)
中設置為0 的相應位的位置則保持不變。特別注意:在清除源掛起寄存器和中斷掛起寄存器時,是向寄存器中的相應位寫1,不是寫0,這是由寄存器的硬件結構決定的。
次級源掛起(SUBSRCPND)寄存器
可以通過寫入數(shù)據(jù)到此寄存器來清除SUBSRCPND 寄存器的指定位。只有數(shù)據(jù)中那些被設置為1 的相應
SUBSRCPND 寄存器的位的位置才能被清除。數(shù)據(jù)中那些被設置為0 的相應位的位置則保
持不變。
中斷次級屏蔽(INTSUBMSK)寄存器
此寄存器有11 位,其每一位都與一個中斷源相聯(lián)系。如果某個指定位被設置為1,則相應中斷源的中斷請求
不會被CPU 所服務(請注意即使在這種情況中,SRCPND 寄存器的相應位也設置為1)。如果屏蔽位為0,則可以
服務中斷請求。
還有就是清除中斷時有子中斷的要先清除子中斷位,再清除中斷位,有子中斷的要設置子中斷屏蔽寄存器打開子中斷。
中斷順序
1.設置好中斷模式以及相關的棧,可看三星提供的初始化文件。
2.在異常向量表設置好相應的跳轉指令。那么當產生中斷的時候,PC指針就會跳到該向量表處,那么就會執(zhí)行跳轉指令到相應的服務程序入口。
3.在設置異常模式下CPU模式和相關的棧之后(三星的初始化文件),就可以用跳轉指令,跳到我們的C語言部分。
4.在C語言部分,就可以寫我們的程序啦:
中斷——>次級中斷源掛起寄存器——>*中斷次級屏蔽寄存器——>源掛起寄存器——>*中斷屏蔽寄存器——>*中斷模式控制寄存器——>*(1)優(yōu)先級寄存器——>中斷掛起寄存器——>IRQ
參考:
書籍:S3C2440手冊