一、概念
中斷分為兩大類:外部中斷和內(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è)寄存器的定義及其功能描述如下表一。對(duì)中斷的控制無(wú)外乎配置和處理這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)閉了中斷,這一步是針對(duì)在bootloader設(shè)計(jì)中進(jìn)行EINT實(shí)驗(yàn)時(shí)的操作)
6、中斷處理流程
(a)如果是外部中斷(EINT0~EINT3)和 不帶子中斷的內(nèi)部中斷,發(fā)生中斷后SRCPND相應(yīng)位置1,如果沒(méi)有被 INTMSK屏蔽,那么等待進(jìn)一步處理;
(b)如果是帶子中斷的內(nèi)部中斷,發(fā)生中斷后SUBSRCPND相應(yīng)位置1,如果沒(méi)有被INTSUBMSK屏蔽,則SRCPND相應(yīng)位置1,如果沒(méi)有被INTMSK屏蔽,那么等待進(jìn)一步處理;
(c)如果是外部中斷(EINT4~EINT23),發(fā)生中斷后EINTPEND相應(yīng)位置1,如果沒(méi)有被EINTMASK屏蔽,則SRCPND相應(yīng)位EINT4-7和EINT8~23置1,如果沒(méi)有被INTMSK屏蔽,那么等待進(jìn)一步處理;
三種中斷都等待進(jìn)一步處理了,接下來(lái)從SRCPND繼續(xù)往前看,看看INTMSK,如果中斷被屏蔽了,就不用說(shuō)了(注意:快中斷也能被屏蔽)。如果沒(méi)有被屏蔽,那么會(huì)進(jìn)一步到INTMOD。如果是快中斷,那么直接出來(lái),進(jìn)入FIQ(即CPU進(jìn)入快中斷模式處理)。如果是普通中斷,那么SRCPND可以有多位置1(FIQ只能有一個(gè)),這時(shí)就會(huì)經(jīng)過(guò)PRIORITY選出一個(gè)優(yōu)先級(jí)高的,然后根據(jù)選出的中斷把INTPND相應(yīng)位置1(注意:只能選出一個(gè)),進(jìn)入IRQ,讓CPU處理。
INTOFFSET寄存器用來(lái)表示INTPND中哪一位置1了,可以用來(lái)判斷請(qǐng)求中斷的中斷源,但是,對(duì)于外部中斷EINT4~EINT23是無(wú)法判斷的,如EINT4~EINT7中任何一個(gè)中斷源請(qǐng)求中斷,都會(huì)將INTOFFSET中的位EINT4_7置1,所以要判斷具體是哪個(gè)中斷源請(qǐng)求的中斷,可讀取EINTPEND中的值進(jìn)行判斷。
7、中斷的清除
(a)如果是外部中斷EINT0~EINT3和不帶子中斷的內(nèi)部中斷,只需清除SRCPND(注意:清除時(shí)對(duì)相應(yīng)位寫“1”);
(b)如果是帶子中斷的內(nèi)部中斷,需清除SRCPND和SUBSRCPND,注意先清除SUBSRCPND,再清除SRCPND。因?yàn)槿绻惹宄齋RCPND的話,在清除SUBSRCPND的過(guò)程中,SRCPND會(huì)以為又有中斷發(fā)生,又會(huì)置1,也就是說(shuō)一次中斷會(huì)響應(yīng)兩次,所以必須先掐斷源頭,對(duì)它們同樣是寫“1”清除
(c)如果是外部中斷EINT4~EINT23,需清除EINTPEND和SRCPND(同樣注意順序),寫“1”清除。