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