一.由上面的中断原理图可知:
2440一共有60个中断源,这些中断源是由DMA,串口,IIC等等控制器产生的,当有多重中断产生时,这些中断会经过一个仲裁寄存器来给这些中断分优先级。
如上图可知:
中断分为复合中断(含有子中断)和单个中断。
复合中断要配置 SUBSRCPND,SUBMASK,SRCPND,MASK,MODE, Priority,INTPND等七个寄存器,同时不要忘了要配置CPSR中的‘I’ ‘F’位。
单个中断需要配置SRCPND,MASK,MODE,Priority,INTPND等五个寄存器,同时也不要忘了要配置CPSR中的‘I’ ‘F’位。(若使用IRQ普通中断,则只需要配置‘I’位,若使用FIQ中断,则需要配置‘F’位)。
二.中断的优先级设置:
三.中断初始化.
1.首先,我们需要配置INTMOD寄存器,以确定中断的模式,是irq中断还是Fiq中断。
2.我们需要配置CPSR中的相应的位,如‘I’‘F’位。
如果是IRQ模式,则我们需要将I位设置为0,Enable IRQ。
如下所示:
__asm{
MRS R0,CPSR
BIC R0,R0,#0x80 //cpsr中相应的位使能
MSR CPSR_c,R0
}
三.我们需要配置INTMSK寄存器.
打开中断.
四.我们需要配置SRCPND和INTPND寄存器,我们需要将他们相应的位置1,它们自己在内部自动清零。
特别注意:我们在中断服务函数中首先要对这两个寄存器进行置1的操作,从而来清理中断。而且要注意顺序,SRCPND寄存器应该在INTPND前面配置好。
一般如果我们不需要用到优先级的时候,我们就不需要去配置priority寄存器了.
以上的几个寄存器的配置完成后我们的单一中断的初始化就算是完成了,接下来就是安装中断服务函数了,将中断服务函数安装到相应的向量地址处就OK了。
如果是复合中断的话:我们还需要配置SUBMUSK寄存器,这个寄存器在IO口那一章,为EINTMASK寄存器,还需要配置EINTPEND寄存器置1清零。
(所以,复合中断中,我们首先需要将SUBSRCPND,SRCPND,INTPND置1清0,然后再配置SUBMASK,MASK,MODE寄存器,同时我们也需要将CPSR中的‘I’位,‘F’位配置,然后是配置外部中断的
通过配置这几个寄存器来配置外部中断的触发方式,如按键中断中应该配置为下降沿触发方式比较好。最后就是安装中断服务函数了。
).
我们还可以通过EINTPEND(SUBSRCPND)寄存器来判断复合中断中哪一个子中断发生了。
最后复合中断也要将相应的复合中断服务函数安装到相应的向量地址中,而且要注意的是在中断服务函数中也要清除中断。
所以,中断配置原理也就这样了。