具体详细解释
这段来自:http://hi.baidu.com/ghy0504/blog/item/db90649a0f554bbfc8eaf47a.html
具体写的很详细,后面画个图对流程进行详细解释,方便自己查阅,并结合wince里面底层中断的代码分析下。
S3C2410有24个外部中断引脚:EINT0~EINT23,但是对于EINT0~EINT3这4个外部中断而言,使用比较简单;对于其它20个而言,使用稍稍复杂一些。
首先,来看S3C2410的中断控制器,有6个中断裁决器分为2级,第1级5个,第2级1个。第1级的5个裁决器管理32个中断源,在这32个中断源中有2个是保留的,24个是给内部中断源的,而外部中断只给了6个中断:EINT0、 EINT1、EINT2、EINT3、EINT4~7、EINT8~23。EINT4~EINT7、EINT8~EINT23都是共享一个中断。
中断控制器中主要的相关寄存器有:INTMSK、SRCPND、PRIORITY、INTPND,还有一个INTMOD。但是对于外部中断还有几个寄存器:EXTINTn、EINTMSK、EINTPEND等。
对于外部中断EINT0~EINT3由于没有共享,因此外部寄存器中只有EXTINT0和它们有关,进行中断触发电平信号的设置。
但是对于其他的20个外部中断而言,所有上面提到的寄存器都有关系。实际上对于 EINT4~EINT23,实际上可以看作有3级屏蔽,第1级屏蔽是CPSR中的I-Bit和F-Bit,第2级屏蔽是EINTMASK([4:23]每一位对应一个相应的外部中断),第3级屏蔽是INTMSK(Bit4、Bit5);对于EINT0~EINT3而言,只是INTMSK中的 Bit0~Bit3,因此在变成初始化时应该要特别注意。
在外部中断有中断请求时,由于EINT4~7、EINT8~23分别共享中断,因此在SRCPND中分别对应Bit4、Bit5,最终导致INTPND中的相应位置1(在任何时刻只能有一个位置1),但是如何分辨这些共享的中断?可以通过查询EINTPEND来进行(Bit4~Bit23分别对应1个外部中断)。由于在相应中断后在服务例程中应将挂起寄存器中相应的位清0来清除未处理状态,因此对于EINT4~7、EINT8~23这20个外部中断的清除挂起寄存器的顺序是:
1. EINTPEND(可能多位同事为1),方法:向要清0的位写1,其它位写0,但要注意由于第4位保留,因此不要试图向第4位写1,可能会导致不可预料的结果。
2.SRCPND(可能多位同时为1),方法:向要清0的位写1,其它位写0。
3.INTPND,方法:向其写本身的数据(即INTPND=INTPND)。
下面具体介绍各个寄存器的功能:
SRCPND(Source Pending Register)寄存器有效位32位,可读写,每一位涉及到一个中断源,SRCPND是主中断源引脚寄存器,某个位被置1表示相应的中断被触发,但我们知道在同一时刻内系统可以触发若干个中断,只要中断被触发了,SRCPND的相应位便被置1,也就是说SRCPND 在同一时刻可以有若干位同时被置1,另外,此寄存器不受中断控制器的优先权逻辑的影响。如果此中断没有被INTMSK寄存器屏蔽、或者是快中断(FIQ)的话,它将被进一步处理。通过写数据到这个寄存器能清除SPCPND相应的位。
INTMODE(Interrupt Mode Register)寄存器有效位为3