一、概念
中斷分為兩大類:外部中斷和內(nèi)部中斷。
1、外部中斷:S3C2440的24個(gè)外部中斷占用GPF0~GPF7(EINT0~EINT7)、GPG0~GPG15(EINT8~EINT23)。使用這些引腳作為中斷輸入時(shí),必須將引腳配置為EINT模式,配置方法可參考datasheet。
2、內(nèi)部中斷:內(nèi)部中斷包括DMA中斷、UART中斷、IIC中斷等等由內(nèi)部外設(shè)觸發(fā)的中斷。
3、相關(guān)寄存器:S3C2440中斷控制涉及到10個(gè)寄存器--SRCPND、INTMOD、INTMSK、PRIORITY、INTPND、INTOFFSET、SUBSRCPND、INTSUBMSK、EINTMASK、EINTPEND,這10個(gè)寄存器的定義及其功能描述如下表一。對中斷的控制無外乎配置和處理這10個(gè)寄存器中的某幾個(gè)。
表一 與S3C2440中斷相關(guān)的10個(gè)寄存器的信息
4、各寄存器的關(guān)系(工作流程)。根據(jù)中斷源進(jìn)行分類,中斷的處理流程可用下圖1表示:
圖1 S3C2440中斷處理流程圖
由上圖1可知,S3C2440的中斷可分為四種情況:由外部中斷源(EINT0~EINT3)觸發(fā)的中斷、由外部中斷子中斷源(EINT4~EINT23)觸發(fā)的中斷、由內(nèi)部中斷源(內(nèi)部子中斷)觸發(fā)的中斷和由內(nèi)部中斷源(非子中斷)觸發(fā)的中斷。
5、中斷的開啟(中斷初始化,INTMOD 和 PRTORITY使用默認(rèn)值)
(a)如果是外部中斷(EINT0~EINT3)和內(nèi)部中斷(不帶子中斷),需設(shè)置INTMSK,讓它不屏蔽中斷即可;
(b)如果是帶子中斷的內(nèi)部中斷,需設(shè)置INTSUBMSK 和 INTMSK,讓它們不屏蔽中斷即可;
(c)如果是外部中斷(EINT4~EINT23),需設(shè)置EINTMASK 和 INTMSK,讓它們不屏蔽中斷即可;
注意:CPSR中的第7位I也需清除(在start.S中關(guān)閉了中斷,這一步是針對在bootloader設(shè)計(jì)中進(jìn)行EINT實(shí)驗(yàn)時(shí)的操作)
6、中斷處理流程
(a)如果是外部中斷(EINT0~EINT3)和 不帶子中斷的內(nèi)部中斷,發(fā)生中斷后SRCPND相應(yīng)位置1,如果沒有被 INTMSK屏蔽,那么等待進(jìn)一步處理;
(b)如果是帶子中斷的內(nèi)部中斷,發(fā)生中斷后SUBSRCPND相應(yīng)位置1,如果沒有被INTSUBMSK屏蔽,則SRCPND相應(yīng)位置1,如果沒有被INTMSK屏蔽,那么等待進(jìn)一步處理;
(c)如果是外部中斷(EINT4~EINT23),發(fā)生中斷后EINTPEND相應(yīng)位置1,如果沒有被EINTMASK屏蔽,則SRCPND相應(yīng)位EINT4-7和EINT8~23置1,如果沒有被INTMSK屏蔽,那么等待進(jìn)一步處理;
三種中斷都等待進(jìn)一步處理了,接下來從SRCPND繼續(xù)往前看,看看INTMSK,如果中斷被屏蔽了,就不用說了(注意:快中斷也能被屏蔽)。如果沒有被屏蔽,那么會進(jìn)一步到INTMOD。如果是快中斷,那么直接出來,進(jìn)入FIQ(即CPU進(jìn)入快中斷模式處理)。如果是普通中斷,那么SRCPND可以有多位置1(FIQ只能有一個(gè)),這時(shí)就會經(jīng)過PRIORITY選出一個(gè)優(yōu)先級高的,然后根據(jù)選出的中斷把INTPND相應(yīng)位置1(注意:只能選出一個(gè)),進(jìn)入IRQ,讓CPU處理。
INTOFFSET寄存器用來表示INTPND中哪一位置1了,可以用來判斷請求中斷的中斷源,但是,對于外部中斷EINT4~EINT23是無法判斷的,如EINT4~EINT7中任何一個(gè)中斷源請求中斷,都會將INTOFFSET中的位EINT4_7置1,所以要判斷具體是哪個(gè)中斷源請求的中斷,可讀取EINTPEND中的值進(jìn)行判斷。
7、中斷的清除
(a)如果是外部中斷EINT0~EINT3和不帶子中斷的內(nèi)部中斷,只需清除SRCPND(注意:清除時(shí)對相應(yīng)位寫“1”);
(b)如果是帶子中斷的內(nèi)部中斷,需清除SRCPND和SUBSRCPND,注意先清除SUBSRCPND,再清除SRCPND。因?yàn)槿绻惹宄齋RCPND的話,在清除SUBSRCPND的過程中,SRCPND會以為又有中斷發(fā)生,又會置1,也就是說一次中斷會響應(yīng)兩次,所以必須先掐斷源頭,對它們同樣是寫“1”清除
(c)如果是外部中斷EINT4~EINT23,需清除EINTPEND和SRCPND(同樣注意順序),寫“1”清除。