Mini2440裸機開發之中斷控制器
一、S3C2440上的中斷
1.1 中斷概述
S3C2440A 中的中斷控制器接受來自60 箇中斷源的請求。提供這些中斷源的是內部外設,如DMA 控制器、 UART、IIC 等等。在這些中斷源中,UARTn、AC97 和EINTn 中斷對於中斷控制器而言是“或”關係。
當從內部外設和外部中斷請求引腳收到多箇中斷請求時,中斷控制器在仲裁步驟後請求ARM920T 核心的FIQ 或IRQ。
1.2 中斷過程
(1)如果是不帶子中斷的內部中斷
如果是不帶子中斷的內部中斷髮生後,中斷髮生後SRCPND相應位置1,如果沒有被INTMSK遮蔽,那麼等待進一步處理
(2) 如果是帶子中斷的內部中斷
如果是帶子中斷的內部中斷,中斷髮生後SUBSRCPND相應位置1,如果沒有被INTSUBMSK遮蔽,那麼SRCPND相應位置1,等待進一步處理。
幾個SUBSRCPND可能對應同一個SRCPND,SRCPND和SUBSRCPND對應關係:
SRCPND | SUBSRCPND |
INT_UART0 | INT_RXD0,INT_TXD0,INT_ERR0 |
INT_UART1 | INT_RXD1,INT_TXD1,INT_ERR1 |
INT_UART2 | INT_RXD2,INT_TXD2,INT_ERR2 |
INT_ADC | INT_ADC_S, INT_TC |
INT_CAM | INT_CAM_C, INT_CAM_P |
INT_WDT_AC97 | INT_WDT, INT_AC97 |
(3)如果是外部中斷
EINT0-EINT3發生後SRCPND相應位置1,如果沒有被INTMSK遮蔽,那麼等待進一步處理。
EINT4-EINT23發生後EINTPEND相應位置1,如果沒有被EINTMASK遮蔽,那麼SRCPND相應位EINT4-7或EINT8-23置1,如果沒有被INTMSK遮蔽,等待進一步處理。
幾個EINTPEND對應同一個SRCPND,對應表如下:
SRCPND | EINTPEND |
EINT0 | EINT0 |
EINT1 | EINT1 |
EINT2 | EINT2 |
EINT3 | EINT3 |
EINT4~7 | EINT4-EINT7 |
EINT8~23 | EINT8-EINT23 |
1.3 中斷處理邏輯
三種中斷都等待進一步處理了。接下來從SRCPND往下看,看INTMSK。如果中斷被遮蔽了,就不用說了(注意:快中斷也能被遮蔽)。如果沒有被遮蔽,那看一下中斷模式:
- 如果中斷模式是快中斷,那麼直接出來進入FIQ;
- 如果是普通中斷,那麼SRCPND可以有多位置1(FIQ只能有一個),這時就會經過PRIORITY選出一個優先順序高的,然後把根據選出的中斷把INTPND相應位置1(注意:只能選出一個),進入IRQ,讓CPU處理。
1.4 中斷開啟
- 如果是不帶子中斷的內部中斷,只需設定INTMSK,讓它不遮蔽中斷就可以了;
- 如果是帶子中斷的內部中斷,需設定INTSUBMSK和INTMSK,讓它門不遮蔽中斷就可以了;
- 如果是外部中斷,對於EINT8-23需要設定EINTMASK和INTMSK。對於EINT0-EINT3只需設定INTMSK;
1.5中斷清除
- 如果是不帶子中斷的內部中斷,只需清除SRCPND、INTPND,注意清除需位置1。
- 如果是帶子中斷的內部中斷,需清除SRCPND和SUBSRCPND、INTPND,注意先清除SUBSRCPND,再清除SRCPND。因為,如果你先清除SRCPND的話,然後在清除SUBSRCPND的過程中,SRCPND會以為又有中斷髮生,又會置1,也就是說一次中斷會響應兩次。所以必須先掐斷源頭。
- 如果是外部中斷,對於EINT8-23需要清除EINTPEND和SRCPND、INTPND(同樣注意順序)。對於EINT0-EINT3只需清除SRCPND。
二、中斷暫存器
在閱讀下面內容之前,你需要了解ARM的暫存器體系,其中主要包括CPSR 和 SPSR 暫存器,如果不瞭解,可以看我之前的部落格介紹,嵌入式Linux之常用ARM彙編。
2.1 程式狀態暫存器(PSR)的F位和I位
如果ARM920T CPU 中的PSR 的F位被置位為1,CPU 不會接受來自中斷控制器的快中斷請求(FIQ)。同 樣的如果PSR 的I 位被置位為1,CPU 不會接受來自中斷控制器的中斷請求(IRQ)。因此,中斷控制器可以通過清除PSR 的F位和I位為0,並且設定INTMSK 的相應位為0來接收中斷。同理我們關中斷也包含兩步:
(1) 我們可以開啟SVC模式,關閉fiq,irq中斷,如下:
set_svcmode:
mrs r0,cpsr /* r0 = cpsr */
bic r0,r0,#0x1f /* M[4:0]清0 */
orr r0,r0,#0xd3 /* 設定為SVC模式,並關閉fiq,irq中斷 */
msr cpsr,r0 /* cpsr = r0 */
mov pc,lr /* bl指令將下一條指令地址複製到了lr,子程式返回 */
我們先用bit指令將處理器模式為[4:0]請零,然後採用ORR或指定將模式位設定位10011,即SVC模式,同時將[7:6]位置1,關閉fiq、irq中斷。
(2) 設定INTMASK遮蔽中斷
disable_interrupt:
mvn r1,#0x00 /* 取反賦值 r1 = 0xffffffff */
ldr r0,=0X4A000008
str r1,[r0] /* INTMASK每一位均寫1 遮蔽中斷
mov pc,lr
2.2 中斷模式(INTMOD)
ARM920T有兩種中斷模式的型別:FIQ 或IRQ。所有中斷源在中斷請求時決定使用哪種型別。
INTMOD暫存器由32 位組成,其每一位都都涉及一箇中斷源。如果某個指定為被設定為1,則在FIQ(快中斷)模式 中處理相應中斷。否則則在IRQ 模式中處理。
暫存器 | 地址 | R/W | 描述 | 復位值 |
INTMOD | 0X4A000004 | R/W |
中斷模式暫存器 0:IRQ模式 1:FIQ模式 |
0x00 |
暫存器的每一位和2.5節每一箇中斷源一一對應,比如[31]:INT_ADC、[30]:INT_RTC。
注意:如果中斷模式在INTMOD 暫存器中設定為FIQ 模式,則FIQ 中斷將不會影響INTPND 和INTOFFSET 寄存 器。這種情況下,這2 個暫存器只對IRQ 中斷源有效。
2.3 中斷掛起暫存器(SRCPND、INTPND)
S3C2440A 有兩個中斷掛起暫存器:源掛起暫存器(SRCPND)和中斷掛起暫存器(INTPND)。這些掛起暫存器表明一箇中斷請求是否為掛起。當中斷源請求中斷服務,SRCPND 暫存器的相應位被置位為1,並且同時在仲 裁步驟後INTPND 暫存器僅有1 位自動置位為1。如果遮蔽了中斷,則SRCPND 暫存器的相應位被置位為1。這 並不會引起INTPND 暫存器的位的改變。當INTPND 暫存器的掛起位為置位,每當I 標誌或F 標誌被清除為0 中 斷服務程式將開始。SRCPND 和INTPND 暫存器可以被讀取和寫入,因此服務程式必須首先通過寫1 到SRCPND暫存器的相應位來清除掛起狀態並且通過相同方法來清除INTPND 暫存器中掛起狀態。
暫存器 | 地址 | R/W | 描述 | 復位值 |
SRCPND | 0X4A000000 | R/W |
指示中斷請求狀態 0:中斷未被請求 1:中斷源聲明瞭中斷請求 |
0x00 |
暫存器的每一位和2.5節每一箇中斷源一一對應,比如[31]:INT_ADC、[30]:INT_RTC。
中斷掛起暫存器中32 位的每一位都表明了是否相應未遮蔽並且正在等待中斷服務的中斷請求具有最高的優先 級。當INTPND 暫存器在優先順序邏輯後被定位了,只有1 位可以設定為1 並且產生中斷請求IRQ 給CPU。IRQ 的 中斷服務程式中可以讀取此暫存器來決定服務32 箇中斷源的哪個源。
暫存器 | 地址 | R/W | 描述 | 復位值 |
INTPND | 0X4A000010 | R/W |
指示中斷請求狀態 0:中斷未被請求 1:中斷源聲明瞭中斷請求 |
0x7F |
暫存器的每一位和2.5節每一箇中斷源一一對應,比如[31]:INT_ADC、[30]:INT_RTC。
注意:如果FIQ 模式中斷髮生,則INTPND 的相應位將不會開啟因為INTPND 暫存器只對IRQ 模式中斷可見。
2.4 中斷遮蔽暫存器(INTMASK)
此暫存器表明如果中斷相應的遮蔽位被置位為1 則禁止該中斷。如果某個INTMSK 的中斷遮蔽位為0,將正常 服務中斷。如果INTMSK 的中斷遮蔽位為1 並且產生了中斷,將置位源掛起位。
暫存器 | 地址 | R/W | 描述 | 復位值 |
INTMASK | 0X4A000008 | R/W |
決定遮蔽哪個中斷源。被遮蔽的中斷源將不會服務 0:中斷服務可用 1:遮蔽中斷服務 |
0xFFFFFFFF |
暫存器的每一位和2.5節每一箇中斷源一一對應,比如[31]:INT_ADC、[30]:INT_RTC。
2.5 中斷源
中斷控制器支援60個(EINT4~8、EINT8~23算多個)中斷源,並分為6個仲裁組ARB5、ARB4、ARB3、ARB2、ARB1、ARB0。
2.6 中斷優先順序
每個仲裁器可以處理基於1 位仲裁器模式控制(ARB_MODE)和選擇控制訊號(ARB_SEL)的2 位的6 箇中斷請求,如下:
- 如果ARB_SEL 位為00b,優先順序順序為REQ0、REQ1、REQ2、REQ3、REQ4 和REQ5。
- 如果ARB_SEL 位為01b,優先順序順序為REQ0、REQ2、REQ3、REQ4、REQ1 和REQ5。
- 如果ARB_SEL 位為10b,優先順序順序為REQ0、REQ3、REQ4、REQ1、REQ2 和REQ5。
- 如果ARB_SEL 位為11b,優先順序順序為REQ0、REQ4、REQ1、REQ2、REQ3 和REQ5。
請注意仲裁器的REQ0 的優先順序總是最高並且REQ5 的優先順序總是最低。此外,通過改變ARB_SEL 位,可以輪換REQ1 到REQ4 的順序。
此處,如果ARB_MODE 位被設定為0,ARB_SEL 位不能自動改變,這使得仲裁器操作在固定優先順序模式中 (注意即使在此模式中,也不能通過手動改變ARB_SEL 位來重新配製優先順序)。另一方面,如果ARB_MODE 為 1,ARB_SEL 位會被輪換方式而改變,例如如果REQ1 被服務,ARB_SEL 位被自動改為01b 以便REQ1 進入到 最低的優先順序。ARB_SEL 改變的詳細結果如下:
- 如果REQ0 或REQ5 被服務,ARB_SEL 位不會改變 ;
- 如果REQ1 被服務,ARB_SEL 位被改為01b;
- 如果REQ2 被服務,ARB_SEL 位被改為10b;
- 如果REQ3 被服務,ARB_SEL 位被改為11b;
- 如果REQ4 被服務,ARB_SEL 位被改為00b。
暫存器 | 地址 | R/W | 描述 | 復位值 |
PRIORITY | 0X4A00000C | R/W |
IRQ 優先順序控制暫存器 |
0x7F |
暫存器位資訊:
PRIORITY | 位 | 描述 | 初始狀態 |
ARB_SEL6 | [20:19] |
仲裁器組6 優先順序順序設定 00: REQ 0-1-2-3-4-5 01:REQ 0-2-3-4-1-5 10: REQ 0-3-4-1-2-5 11:REQ 0-4-1-2-3-5 |
00 |
ARB_SEL5 | [18:17] |
仲裁器組5 優先順序順序設定 00: REQ 0-1-2-3-4-5 01:REQ 0-2-3-4-1-5 10: REQ 0-3-4-1-2-5 11:REQ 0-4-1-2-3-5 |
00 |
ARB_SEL4 | [16:15] |
仲裁器組4 優先順序順序設定 00: REQ 0-1-2-3-4-5 01:REQ 0-2-3-4-1-5 10: REQ 0-3-4-1-2-5 11:REQ 0-4-1-2-3-5 |
00 |
ARB_SEL3 | [14:13] |
仲裁器組3 優先順序順序設定 00: REQ 0-1-2-3-4-5 01:REQ 0-2-3-4-1-5 10: REQ 0-3-4-1-2-5 11:REQ 0-4-1-2-3-5 |
00 |
ARB_SEL2 | [12:11] |
仲裁器組2 優先順序順序設定 00: REQ 0-1-2-3-4-5 01:REQ 0-2-3-4-1-5 10: REQ 0-3-4-1-2-5 11:REQ 0-4-1-2-3-5 |
00 |
ARB_SEL1 | [10:9] |
仲裁器組1 優先順序順序設定 00: REQ 0-1-2-3-4-5 01:REQ 0-2-3-4-1-5 10: REQ 0-3-4-1-2-5 11:REQ 0-4-1-2-3-5 |
00 |
ARB_SEL0 | [8:7] |
仲裁器組0 優先順序順序設定 00: REQ 0-1-2-3-4-5 01:REQ 0-2-3-4-1-5 10: REQ 0-3-4-1-2-5 11:REQ 0-4-1-2-3-5 |
00 |
ARB_MODE6 | [6] |
仲裁器組6 優先順序輪換使能 0 :優先順序不輪換 1:優先順序輪換使能 |
1 |
ARB_MODE5 | [5] |
仲裁器組5 優先順序輪換使能 0 :優先順序不輪換 1:優先順序輪換使能 |
1 |
ARB_MODE4 | [4] |
仲裁器組4 優先順序輪換使能 0 :優先順序不輪換 1:優先順序輪換使能 |
1 |
ARB_MODE3 | [3] |
仲裁器組3 優先順序輪換使能 0 :優先順序不輪換 1:優先順序輪換使能 |
1 |
ARB_MODE2 | [2] |
仲裁器組2 優先順序輪換使能 0 :優先順序不輪換 1:優先順序輪換使能 |
1 |
ARB_MODE1 | [1] |
仲裁器組1 優先順序輪換使能 0 :優先順序不輪換 1:優先順序輪換使能 |
1 |
ARB_MODE0 | [0] |
仲裁器組0 優先順序輪換使能 0 :優先順序不輪換 1:優先順序輪換使能 |
1 |
2.7 中斷偏移暫存器(INTOFFSET)
中斷偏移暫存器中的值表明了是哪個IRQ 模式的中斷請求在INTPND 暫存器中。此位可以通過清除SRCPND 和INTPND 自動清除。
暫存器 | 地址 | R/W | 描述 | 復位值 |
INTOFFSET | 0x4A000014 | R |
指示IRQ 中斷請求源 |
0x00 |
暫存器值和2.5節每一箇中斷源偏移量對應,比如31:INT_ADC、30:INT_RTC。
2.8次級源掛起暫存器(SUBSRCPND)
可以通過寫入資料到此暫存器來清除SUBSRCPND 暫存器的指定位。只有資料中那些被設定為1 的相應 SUBSRCPND 暫存器的位的位置才能被清除。資料中那些被設定為0 的相應位的位置則保持不變。
暫存器 | 地址 | R/W | 描述 | 復位值 |
SUBSRCPND | 0X4A000018 | R/W |
指示中斷請求狀態 0:中斷未被請求 1:中斷源聲明瞭中斷請求 |
0x00 |
暫存器位資訊:
SUBSRCPND | 位 | 描述 | 初始狀態 |
保留 | [31:15] | 未使用 | 0 |
INT_AC97 | [14] | 0:未請求 1:請求 | 0 |
INT_WDT | [13] | 0:未請求 1:請求 | 0 |
INT_CAM_P | [12] | 0:未請求 1:請求 | 0 |
INT_CAM_C | [11] | 0:未請求 1:請求 | 0 |
INT_ADC_S | [10] | 0:未請求 1:請求 | 0 |
INT_TC | [9] | 0:未請求 1:請求 | 0 |
INT_ERR2 | [8] | 0:未請求 1:請求 | 0 |
INT_TXD2 | [7] | 0:未請求 1:請求 | 0 |
INT_RXD2 | [6] | 0:未請求 1:請求 | 0 |
INT_ERR1 | [5] | 0:未請求 1:請求 | 0 |
INT_TXD1 | [4] | 0:未請求 1:請求 | 0 |
INT_RXD1 | [3] | 0:未請求 1:請求 | 0 |
INT_ERR0 | [2] | 0:未請求 1:請求 | 0 |
INT_TXD0 | [1] | 0:未請求 1:請求 | 0 |
INT_RXD0 | [0] | 0:未請求 1:請求 | 0 |
對映到SRCPND:
SRCPND | SUBSRCPND |
INT_UART0 | INT_RXD0,INT_TXD0,INT_ERR0 |
INT_UART1 | INT_RXD1,INT_TXD1,INT_ERR1 |
INT_UART2 | INT_RXD2,INT_TXD2,INT_ERR2 |
INT_ADC | INT_ADC_S, INT_TC |
INT_CAM | INT_CAM_C, INT_CAM_P |
INT_WDT_AC97 | INT_WDT, INT_AC97 |
2.9中斷次級遮蔽暫存器(INTSUBMSK)
此暫存器有11 位,其每一位都與一箇中斷源相聯絡。如果某個指定位被設定為1,則相應中斷源的中斷請求 不會被CPU 所服務(請注意即使在這種情況中,SRCPND 暫存器的相應位也設定為1)。如果遮蔽位為0,則可以 服務中斷請求。
暫存器 | 地址 | R/W | 描述 | 復位值 |
INTSUBMSK | 0X4A00001C | R/W |
決定遮蔽哪個中斷源。被遮蔽的中斷源將不會服務 0:中斷服務可用 1:遮蔽中斷服務 |
0xFFFF |
暫存器每一位和2.8節中暫存器位資訊一致。
INTSUBMSK | 位 | 描述 | 初始狀態 |
保留 | [31:15] | 未使用 | 0 |
INT_AC97 | [14] | 0:可服務 1:遮蔽 | 0 |
INT_WDT | [13] | 0:可服務 1:遮蔽 | 0 |
INT_CAM_P | [12] | 0:可服務 1:遮蔽 | 0 |
INT_CAM_C | [11] | 0:可服務 1:遮蔽 | 0 |
INT_ADC_S | [10] | 0:可服務 1:遮蔽 | 0 |
INT_TC | [9] | 0:可服務 1:遮蔽 | 0 |
INT_ERR2 | [8] | 0:可服務 1:遮蔽 | 0 |
INT_TXD2 | [7] | 0:可服務 1:遮蔽 | 0 |
INT_RXD2 | [6] | 0:可服務 1:遮蔽 | 0 |
INT_ERR1 | [5] | 0:可服務 1:遮蔽 | 0 |
INT_TXD1 | [4] | 0:可服務 1:遮蔽 | 0 |
INT_RXD1 | [3] | 0:可服務 1:遮蔽 | 0 |
INT_ERR0 | [2] | 0:可服務 1:遮蔽 | 0 |
INT_TXD0 | [1] | 0:可服務 1:遮蔽 | 0 |
INT_RXD0 | [0] | 0:可服務 1:遮蔽 | 0 |
三、程式碼下載
Young/s3c2440_project【5.int】