前幾天把外部中斷基本搞好了,但對幾個中斷寄存器的具體含義和區(qū)別不是很了解。今天特意拿起datasheet詳讀并網(wǎng)絡(luò)上查了這方面的資料。將結(jié)果記錄如下:
S3C2440的中斷寄存器有6個中斷裁決器,分為2級:第一級為5個,第二級為1個。詳見Datasheet的P380的interrupt sources和P381的interrupt sub sources。第一級的32個中斷源包含26個內(nèi)部中斷,6個外部中斷。
這6個中斷分別為:EINT0,EINT1.EINT2,EINT3,EINT4_7,EINT8_23。其中EINT4_7,EINT8_23都是共享一個中斷。在外部中斷有中斷請求時,因?yàn)镋INT4_7和EINT8_23是分別共享中斷的,而SRCPND和INTPND的BIT4或BIT5也是共享使用的,那么怎么區(qū)別是EINT4還是EINT5或EINT6發(fā)生中斷呢,這就需要另一個寄存器EINTPEND來判斷,由于EINT0~EINT3都獨(dú)享一個中斷,所以EINTPEND只有EINT4~23,讀取該寄存器就知道哪個中斷觸發(fā)了。
一、三個中斷未決寄存器:源未決寄存器SRCPND和中斷未決寄存器INTPND以及外部中斷未決寄存器EINTPEND。
SRCPND寄存器有效位為32位,每一位對應(yīng)一個中斷源。某個位被置一表示相應(yīng)的中斷被觸發(fā),單我們知道系統(tǒng)在同一 時間內(nèi)可以觸發(fā)多個中斷,只要中斷觸發(fā)了,相應(yīng)的位就被置一,直到該位被清除為止。也就是說在同一時刻SRCPND寄存器可以有多個位被同時置1。該位寫1后被清0。
INTPND寄存器有效位為32位,看似跟SRCPND一樣,其實(shí)有很大的不同,在某一時刻INTPND寄存器只能有一個位被置一。INTPND某位被置一說明,該位所對應(yīng)的中斷在所有已觸發(fā)的中斷里中斷優(yōu)先級最高且沒有被屏蔽,表示CPU即將或已經(jīng)在處理在對該位對應(yīng)的中斷進(jìn)行處理。該位寫1后被清0。
兩者的區(qū)別:SRCPND表明當(dāng)前有什么中斷被觸發(fā)了;INTPND表明CPU即將或正在處理某個中斷。
EINTPEND:寄存器有效位為24位,低4位保留。EINTPENG只有EINT4~E23,跟SRCPND一樣,可以在同一時刻多個位同時為1.用來區(qū)分共享中斷EINT4_7和EINT8_23具體為哪個觸發(fā)。該位寫1后被清0.
eg。在外部中斷例程的中斷處理程序里是如下寫法:
if(rINTPND==0x10)
{
rSRCPND = 0x10;
rINTPND = 0x10;
if(EINTPEND & 0X10) //EINT4
{
EINTPENG |= 0X10;
Uart_Printf("K4發(fā)生中斷n");
}
if(rEINTPEND&0x20) //EINT5
{
rEINTPEND |= 0x20;
Uart_Printf("K5發(fā)生中斷n");
}
}
判斷條件為INTPND,如果INTPND該位置1說明當(dāng)前CPU正在處理EINT4_7,將SRCPND和INTPND的位1都寫1,清0標(biāo)志。if(EINTPEND & 0X10)為第二判定條件,確認(rèn)為EINT4_7中的EINT4發(fā)生中斷。
二、INTMOD中斷模式寄存器,每一位與SRCPND中各位對應(yīng)。0--IRQ模式,1--FIQ模式,默認(rèn)初始化全0.
每次只能對一個中斷源置成FIQ,所以每次只能對INTMOD中的一位置1. FIQ中斷優(yōu)先級比IRQ高。
三、INTMSK中斷屏蔽寄存器,每一位與SRCPND中各位對應(yīng)。0--未屏蔽,1--屏蔽中斷請求,默認(rèn)初始化全1.
四、INTSUBMSK、SUBSRCPND是副中斷源引腳寄存器,使用情況與主中斷源類似。第二級副中斷源列表在datasheet P381。