S3C2440中斷介紹

1.1   S3C2440系統中斷

CPU和外設構成了計算機系統,CPU和外設之間通過總線進行連接,用於數據通信和控制,CPU管理監視計算機系統中所有硬件,通常以兩種方式來對硬件進行管理監視:

l  查詢方式:CPU不停的去查詢每一個硬件的當前狀態,根據硬件的狀態決定處理與否。好比是工廠裏的檢查員,不停的檢查各個崗位工作狀態,發現情況及時處理。這種方式實現起來簡單,通常用在只有少量外設硬件的系統中,如果一個計算機系統中有很多硬件,這種方式無疑是耗時,低效的,同時還大量佔用CPU資源,並且對多任務系統反應遲鈍。

l  中斷方式:當某個硬件產生需要CPU處理的事件時,主動通過一根信號線“告知”CPU,同時設置某個寄存器裏對應的位,CPU一旦發現這根信號線上的電平有變化,就會中斷當前程序,然後去處理髮出該中斷請求。這就像是醫院重危病房,病房每張病牀牀頭有一個應急按鈕,該按鈕連接到病房監控室裏控制檯一盞指示燈,只要該張病牀出現緊急情況病人按下按鈕,病房監控室裏電鈴會響起,通知醫護人員有緊急情況,醫護人員這時查看控制檯上的指示燈,找出具體病房,病牀號,直接過去處理緊急情況。中斷處理方式相對查詢方式要複雜的多,並且需要硬件的支持,但是它處理的實時性更高,嵌入式系統裏基本上都使用這種方式來處理。

系統中斷是嵌入式硬件實時地處理內部或外部事件的一種機制。對於不同CPU而言,中斷的處理只是細節不同,大體處理流程都一樣,S3C2440A的中斷控制器結構如下圖所示:

 

圖3-3 S3C2440中斷控制器

中斷請求由硬件產生,根據中斷源類型分別將中斷信號送到SUBSRCPND(SubSourcePending)和SRCPND(SourcePending)寄存器,SUBSRCPND是子中斷源暫存寄存器,用來保存子中斷源信號,SRCPND是中斷源暫存寄存器,用來保存中斷源信號。中斷信號可通過編程方式屏蔽掉,SUBMASK是子中斷源屏蔽寄存器,可以屏蔽指定的子中斷信號, MASK功能同SUBMASK用來屏蔽中斷源信號。中斷分爲兩種模式:一般中斷的和快速中斷,MODE是中斷模式判斷寄存器,用來判斷當前中斷是否爲快速中斷,如果爲快速中斷直接將快速中斷信號送給ARM內核,如果不是快速中斷,還要將中斷信號進行仲裁選擇。S3C2440A支持多達60種中斷,很有可能多個硬件同時產生中斷請求,這時要求中斷控制器做出裁決,Priority是中斷源優先級仲裁選擇器,當多箇中斷產生時,選擇出優先級最高的中斷源進行處理,INTPND是中斷源結果寄存器,裏面存放優先級仲裁出的唯一中斷源。

1  中斷的產生-中斷源

S3C2440A支持60種中斷源,基本上滿足了開發板內部,外部設備等對中斷的需求。其中每一箇中斷源對應寄存器中的一位,顯然要支持60種中斷至少需要二個32位寄存器,SUBSRCPND和SRCPND分別保存中斷源信號。S3C2440A對60種中斷源的管理是按層級分的。如圖3-4所示:

 

圖3-4中斷源信號複合示意圖

S3C2440A將中斷源分爲兩級:中斷源和子中斷源,中斷源裏包含單一中斷源和複合中斷源,複合中斷源是子中斷源的複合信號。如實時時鐘中斷,該硬件只會產生一種中斷,它是單一中斷源,直接將其中斷信號線連接到中斷源寄存器上。對於複合中斷源,以UART串口爲例進行說明,S3C2440A可以支持3個UART串口,每個串口對應一個複合中斷源信號INT_UARTn,每個串口可以產生三種中斷,也就是三個子中斷:接收數據中斷INT_RXDn,發送數據中斷INT_TXDn,數據錯誤中斷INT_ERRn,這三個子中斷信號在中斷源寄存器複合爲一箇中斷信號,三種中斷任何一個產生都會將中斷信號傳遞給對應的中斷源INT_UARTn,然後通過中斷信號線傳遞給ARM內核。

 

圖3-5 UART串口中斷源信號複合示意圖

總中斷源詳下面表中列出了S3C2440A部分中斷源,它分別對應中斷源寄存器裏某個位:詳細中斷源請查看S3C2440A硬件手冊。

表3-5 部分中斷源信號

中斷源

描述

優先級仲裁分組

INT_ADC

數模轉換和觸摸屏中斷

ARB5

INT_RTC

實時時鐘中斷

ARB5

INT_UART0

UART0中斷(包含子中斷)

ARB5

INT_NFCON

NandFlash控制中斷

ARB4

INT_WDT_AC97

看門狗中斷

ARB1

EINT8-23

外部中斷8~23(包含外部子中斷)

ARB1

EINT4-7

外部中斷4~7(包含外部子中斷)

ARB1

EINT3

外部中斷3

ARB0

EINT2

外部中斷2

ARB0

EINT1

外部中斷1

ARB0

EINT 0

外部中斷0

ARB0

中斷信號除上述分法之外,還可以按照硬件位置分爲:外部中斷源和內部中斷源。

l  內部中斷源:它是嵌入式系統中常見硬件產生的中斷信號,比如:UART串口中斷源,時鐘Timer中斷源,看門狗中斷源等

l  外部中斷源:有時嵌入式系統裏要在外部接口上掛載一些外部設備,這些設備並不是一個通用嵌入式系統裏必備硬件,比如:藍牙模塊,各種傳感器,WIFI無線通信模塊,這些硬件也要產生中斷讓CPU來處理數據,因此這些外設硬件通過中斷信號線連接到中斷控制器上,它們產生的中斷叫做外部中斷信號。它們有着和內部中斷一樣的處理機制,只不過,它沒有一個固定的中斷號與之對應,硬件與嵌入式系統的連接方式與中斷處理完全由系統硬件與軟件設計者實現。

外設硬件通過輸入輸出接口I/O Ports掛接到嵌入式系統上,I/O Ports向外設提供外部中斷信號線,輸出電源,頻率時鐘和輸入輸出信號線,外部硬件根據自己需要連接到I/O Ports上,產生中斷時向外部中斷信號線上送出中斷信號,通過外部中斷信號線傳遞到中斷控制器。

按鍵Key可以認爲最爲簡單的一種硬件設備了,如下圖所示:

 

圖3-6按鍵硬件接線原理圖

它功能很簡單,可以將電路接通,按鍵K1~K6一端接地爲低電平,另外一端接電源正極爲高電平,EINT8,EINT11,EINT13,EINT14,EINT15,EINT19六根中斷信號線分別和高電平端按鍵相連,當按鍵按下時電路接通,整個電路變成低電平,中斷信號線上電壓產生變化,通過設置中斷觸發方式,產生外部中斷請求,輸入到CPU內部,從而實現按鍵中斷控制。

S3C2440A可以支持EINT0~EINT23共24種外部中斷,完全可以滿足小型嵌入式設備外設硬件的需求。

外部中斷源也分爲外部中斷源和外部子中斷源,其處理方式和內部中斷源基本一樣。

 

1.1.1   中斷優先級

S3C2440A支持60種中斷,多個硬件可能同時產生中斷請求,由於CPU只能處理一箇中斷,中斷控制器怎麼選擇出一個最佳的中斷,交給ARM內核進行處理呢? 中斷控制器採用優先級仲裁比較的方式進行選擇,找出優先級最高的中斷源。中斷控制器將60種中斷源分成7組,如下圖所示,它類似體育賽事裏的比賽方式,所有參賽選手在小組賽PK,選擇出小組賽最優秀選手,然後進入決賽階段和其它小組最優先選擇再PK,最後優勝者就是總冠軍。其中ARBITER0~ARBITER5爲“小組賽”階段,中斷源信號在各自小組裏進行優先級仲裁,選擇出最高優先級中斷信號,每小組選出的中斷信號送到ARBITER6,也就是決賽階段,選擇出最高優先級中斷信號,交給ARM內核。

 

圖3-7 S3C2440優先級仲裁示意圖

中斷信號在7個分組裏PK時的優先級是可編程的,通過PRIORITY寄存器進行優先級設置。如下表(只列出PRIORITY寄存器部分位):

表3-6 中斷優先級控制寄存器(PRIORITY)

寄存器名

地址

是否讀寫

描述

復位默認值

PRIORITY

0x4A00000C

R/W

中斷優先級控制寄存器

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

0x00

ARB_SEL5

[18:17]

仲裁組5優先級排序

00 = REQ 1-2-3-4

01 = REQ 2-3-4-1

10 = REQ 3-4-1-2

11 = REQ 4-1-2-3

00

ARB_MODE6

[6]

仲裁組6優先級是否輪轉:

0 = 不輪轉,     1 = 輪轉

1

ARB_MODE5

[5]

仲裁組5優先級是否輪轉:

0 = 不輪轉,     1 = 輪轉

1

通過設置仲裁組n優先級排序方式位,設置每個仲裁組內中斷信號的優先級順序,比如:ARB_SEL5分組時包含四個中斷信號:REQ1 INT_UART0, REQ2 INT_SPI1, REQ3 INT_RTC, REQ4 INT_ADC,ARB_SEL5位採用默認值:00,當INT_UART0和INT_RTC中斷信號同時產生時,INT_UART0會被選出,通過可編程方式改變優先級排序方式來改變中斷信號優先級。

ARB_MODE0~ ARB_MODE6爲每個仲裁分組的優先級輪轉設置位,採用默認值時,當前中斷信號被選擇處理之後,再次產生中斷請求時,它的優先級自動輪轉到該組最低,這樣可以保證優先級低的中斷信號可以被及時處理,不至於出現優先級高且中斷請求頻繁的中斷每次都被優先處理,而優先級低的被“餓死”的情況。顯然,這種方式更民主,實時性更佳。

2   中斷控制器相關寄存器

(1)SUBSRCPND子中斷源暫存寄存器

表3-7 子中斷源暫存寄存器(SUBSRCPND)

寄存器名

地址

是否讀寫

描述

復位默認值

SUBSRCPND

0x4A000018

R/W

子中斷源暫存寄存器,保存中斷請求狀態:

0:沒有中斷請求信號

1:中斷請求信號產生

0x00000000

 

SUBSRCPND

對應SRCPND

描述

初始值

Reserved

[31:15]

未使用

0

INT_AC97

INT_WDT_AC97

[14]

0 = 未產生中斷 1 = 產生中斷

0

INT_RXD0

INT_UART0

[0]

0 = 未產生中斷 1 = 產生中斷

0

該寄存器用來標識保存子中斷源信號,當某個子中斷信號產生之後,SUBSRCPND對應位被自動置1,該位會一直保持被置位,只到中斷處理程序將其清除爲止,需要注意一下,清除中斷是通過向對應位寫入1來清除,而不是寫入0,寫入0無效。

(2)INTSUBMSK子中斷源屏蔽寄存器

表3-8 子中斷源屏蔽寄存器(INTSUBMSK)

寄存器名

地址

是否讀寫

描述

復位默認值

INTSUBMSK

0x4A00001C

R/W

子中斷源信號屏蔽存寄存器,設置相應位來屏蔽中斷信號:

0:未屏蔽,中斷可用

1:屏蔽中斷信號

0xFFFF

 

INTSUBMSK

描述

初始值

Reserved

[31:15]

未使用

0

INT_AC97

[14]

0 = 未屏蔽1 = 屏蔽中斷

1

INT_RXD0

[0]

0 = 未屏蔽1 = 屏蔽中斷

1

該寄存器用來屏蔽子中斷源信號,默認值爲全部子中斷都被屏蔽掉,因此要想處理某個硬件中斷,必須要打開中斷屏蔽位,通過寫入0來取消屏蔽中斷。

(3)SRCPND中斷源暫存寄存器

表3-9中斷源暫存寄存器(SRCPND)

寄存器名

地址

是否讀寫

描述

復位默認值

SRCPND

0x4A000000

R/W

中斷源暫存寄存器,保存中斷請求狀態:

0:沒有中斷請求信號

1:中斷請求信號產生

0x00000000

 

SRCPND

描述

初始值

INT_ADC

[31]

0 = 未產生中斷 1 = 產生中斷

0

EINT0

[0]

0 = 未產生中斷 1 = 產生中斷

0

該寄存器用來保存中斷源信號,當某個中斷信號產生之後, SRCPND對應位被自動置1,該位會一直保持被置位,只到中斷處理程序將其清除爲止,需要注意一下,清除中斷是通過向對應位寫入1來清除,而不是寫入0,寫入0無效。

(4)INTMSK中斷源屏蔽寄存器

表3-10中斷源屏蔽寄存器(INTMSK)

寄存器名

地址

是否讀寫

描述

復位默認值

INTMSK

0x4A000008

R/W

中斷源信號屏蔽存寄存器,設置相應位來屏蔽中斷信號:

0:未屏蔽,中斷可用

1:屏蔽中斷信號

0xFFFFFFFF

 

INTMSK

描述

初始值

INT_ADC

[31]

0 = 未屏蔽1 = 屏蔽中斷

1

EINT0

[0]

0 = 未屏蔽1 = 屏蔽中斷

1

該寄存器用來屏蔽中斷源信號,默認值爲全部中斷都被屏蔽掉,因此要想處理某個硬件中斷,必須要打開中斷屏蔽位,通過寫入0來取消屏蔽中斷。

(5)INTPND最高優先級中斷暫存寄存器

表3-11最高優先級中斷暫存寄存器(INTPND)

寄存器名

地址

是否讀寫

描述

復位默認值

INTPND

0x4A000010

R/W

最高優先級中斷暫存寄存器裏面保存有經過優先級仲裁的結果:

0:沒有中斷請求信號

1:中斷請求信號產生

0x00000000

 

INTPND

描述

初始值

INT_ADC

[31]

0 = 未產生中斷 1 = 產生中斷

0

EINT0

[0]

0 = 未產生中斷 1 = 產生中斷

0

該寄存器保存了經過優先級仲裁出的中斷信號位,它是所有當前中斷請求裏優先級別最高的中斷,因此該寄存器裏的值最多有一位被置1,通常中斷處理程序中會通過讀取該寄存器的值來獲得當前正在處理的中斷請求。中斷處理完成之後,通過寫入1來清除中斷。

(6)INTOFFSET中斷號偏移量寄存器

表3-12中斷號偏移量寄存器(INTOFFSET)

寄存器名

地址

是否讀寫

描述

復位默認值

INTOFFSET

0x4A000014

R

中斷號偏移量寄存器,用來保存當前處理的中斷號

0x0000000

該寄存器裏存放的是經過優先級仲裁出的中斷信號對應的中斷號,是一個0~31之間的整數,其實它就是INTPND裏對應的位號,比如:INT_UART0產生了中斷,INTPND裏第28位置1,INTOFFSET裏保存的整數就是28,多出來這個寄存器的目的主要是方便中斷處理程序查詢中斷源,清除中斷源:

#define TIMER0_IRQ_OFT       10               // 時鐘0定時中斷

#define EINT0_IRQ_OFT       0                  // 開發板K1按鍵1對應外部中斷EINT0

void  handle_irq()

{

    unsigned long irqOffSet = INTOFFSET;   // 取得中斷號

    switch(irqOffSet)

    {

                  case TIMER0_IRQ_OFT:               // 當前中斷爲定時器0中斷

                    do_timer();                             // 跳入定時器0處理程序

                        break;

                  case EINT0_IRQ_OFT:                  // 當前中斷爲K1按鍵觸發

                       do_key1_pressed();               // 處理K1按下事件

                        break;

    }

   

    SRCPND &= (1<<irqOffSet);                   // 清除中斷源

    INTPND = INTPND;                             // 清除最高優先級中斷暫存寄存器中斷

}

 

(7)INTMOD中斷模式寄存器

表3-13中斷模式寄存器(INTMOD)

寄存器名

地址

是否讀寫

描述

復位默認值

INTMOD

0x4A000004

R/W

中斷模式寄存器,指定對應中斷模式:

0 = IRQ一般中斷模式

1 = FIQ快速中斷模式

0x0000000

 

INTMOD

描述

初始值

INT_ADC

[31]

0 = IRQ 1 = FIQ

0

EINT0

[0]

0 = IRQ 1 = FIQ

0

通過設置ARM內核產生中斷。需要注意的是,快速中斷不存在優先級仲裁,只能有一位被設置爲<FONT face=""">FIQ模式。

 

++++++++++++++++++++++++++++++++++++++++++

轉載出處:

http://blog.csdn.net/mr_raptor/article/details/6556186

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章