S3C2440中断分析
扫描二维码
随时随地手机看文章
前几天把外部中断基本搞好了,但对几个中断寄存器的具体含义和区别不是很了解。今天特意拿起datasheet详读并网络上查了这方面的资料。将结果记录如下:
S3C2440的中断寄存器有6个中断裁决器,分为2级:第一级为5个,第二级为1个。详见Datasheet的P380的interrupt sources和P381的interrupt sub sources。第一级的32个中断源包含26个内部中断,6个外部中断。
这6个中断分别为:EINT0,EINT1.EINT2,EINT3,EINT4_7,EINT8_23。其中EINT4_7,EINT8_23都是共享一个中断。在外部中断有中断请求时,因为EINT4_7和EINT8_23是分别共享中断的,而SRCPND和INTPND的BIT4或BIT5也是共享使用的,那么怎么区别是EINT4还是EINT5或EINT6发生中断呢,这就需要另一个寄存器EINTPEND来判断,由于EINT0~EINT3都独享一个中断,所以EINTPEND只有EINT4~23,读取该寄存器就知道哪个中断触发了。
一、三个中断未决寄存器:源未决寄存器SRCPND和中断未决寄存器INTPND以及外部中断未决寄存器EINTPEND。
SRCPND寄存器有效位为32位,每一位对应一个中断源。某个位被置一表示相应的中断被触发,单我们知道系统在同一 时间内可以触发多个中断,只要中断触发了,相应的位就被置一,直到该位被清除为止。也就是说在同一时刻SRCPND寄存器可以有多个位被同时置1。该位写1后被清0。
INTPND寄存器有效位为32位,看似跟SRCPND一样,其实有很大的不同,在某一时刻INTPND寄存器只能有一个位被置一。INTPND某位被置一说明,该位所对应的中断在所有已触发的中断里中断优先级最高且没有被屏蔽,表示CPU即将或已经在处理在对该位对应的中断进行处理。该位写1后被清0。
两者的区别:SRCPND表明当前有什么中断被触发了;INTPND表明CPU即将或正在处理某个中断。
EINTPEND:寄存器有效位为24位,低4位保留。EINTPENG只有EINT4~E23,跟SRCPND一样,可以在同一时刻多个位同时为1.用来区分共享中断EINT4_7和EINT8_23具体为哪个触发。该位写1后被清0.
eg。在外部中断例程的中断处理程序里是如下写法:
if(rINTPND==0x10)
{
rSRCPND = 0x10;
rINTPND = 0x10;
if(EINTPEND & 0X10) //EINT4
{
EINTPENG |= 0X10;
Uart_Printf("K4发生中断n");
}
if(rEINTPEND&0x20) //EINT5
{
rEINTPEND |= 0x20;
Uart_Printf("K5发生中断n");
}
}
判断条件为INTPND,如果INTPND该位置1说明当前CPU正在处理EINT4_7,将SRCPND和INTPND的位1都写1,清0标志。if(EINTPEND & 0X10)为第二判定条件,确认为EINT4_7中的EINT4发生中断。
二、INTMOD中断模式寄存器,每一位与SRCPND中各位对应。0--IRQ模式,1--FIQ模式,默认初始化全0.
每次只能对一个中断源置成FIQ,所以每次只能对INTMOD中的一位置1. FIQ中断优先级比IRQ高。
三、INTMSK中断屏蔽寄存器,每一位与SRCPND中各位对应。0--未屏蔽,1--屏蔽中断请求,默认初始化全1.
四、INTSUBMSK、SUBSRCPND是副中断源引脚寄存器,使用情况与主中断源类似。第二级副中断源列表在datasheet P381。