1.中断源:
s3c2440提供了60个中断源 , 如下所示 :
2.中断处理过程:
3.相关寄存器介绍:
① sourcepending (SRCPND) register
SRCPND : 32位对应着32个中断源 , 被置'1'的位所对应的中断源被指明产生中断请求并且等待中断服务.也就是说这个寄存器指明了哪些中断源在等待中断服务.
SRCPND每一个位由中断源自动设置而不受INTMASK的屏蔽位所影响.也不受中断控制器的优先次序影响.
在中断服务子程序里 , 需要对SRCPND相应位清零 , 因为s3c2440的中断控制器没有提供硬件清零,所以我们要自己通过对SRCPND相应位写'1'来清除这个中断指示.
如果想要接收到相同中断源的有效请求就必须马上清除中断位并且使能中断.
②interrupt mode (INTMOD) register(用于设置中断模式)
INTMOD : 32位对应着32个中断源 , 被置 '1' 的位相应的中断被设置为IFQ(快速中断)模式 . 反之 , 为IRQ(普通中断)模式 .
需要注意 : 在中断控制器里只能有一个中断源作为FIQ模式被服务 . 所以在INTMOD里面只能有一位被设置为 ' 1' .
FIQ中断是不受INTPND和INTOFFSET寄存器影响的 , 也就是说INTPND和INTOFFSET寄存器只对IRQ模式的中断有效 .
③interrupt mask(INTMSK) register
INTMSK : 32位对应着32个中断源 , 被置 '1'的位相应的中断请求CPU不提供中断服务(注意 : SRCPND的相应位还是会被置'1'的,只是CPU不理睬) ,
④priority register (PRIORITY)
PRIORITY : PRIORITY[20:7]每两位对应一个中断优先级仲裁器 , 用于设置对应组里的中断优先次序 , 详细设置可参考寄存器说明. PRIORITY[6:0]每一位对应一个仲裁器 , 被置'1'的位相应的仲裁器使能优先级轮流翻转.
关于中断优先级顺序设置情况如下(注意REQ0/5位置永远不变) :
1)ARB_SEL=00b , 优先顺序(高--->低) :REQ0->REQ1->REQ2->REQ3->REQ4->REQ5
2)ARB_SEL=01b , 优先顺序(高--->低) :REQ0->REQ2->REQ3->REQ4->REQ1->REQ5
3)ARB_SEL=10b , 优先顺序(高--->低) :REQ0->REQ3->REQ4->REQ1->REQ2->REQ5
4)ARB_SEL=11b , 优先顺序(高--->低) :REQ0->REQ4->REQ1->REQ2->REQ3->REQ5
当仲裁器优先级轮流翻转被禁止,则优先级顺序固定为我们自己的配置(可以随时手动更改) , 当使能时 , 优先级顺序自动翻转 , 规则如下 :
1)假如REQ0/5被服务 , 相应ARB_SEL位不被改变 ;
2)假如REQ1被服务 , 相应ARB_SEL位被改变为01b ;
2)假如REQ2被服务 , 相应ARB_SEL位被改变为10b ;
2)假如REQ3被服务 , 相应ARB_SEL位被改变为11b ;
2)假如REQ4被服务 , 相应ARB_SEL位被改变为00b ;
⑤interrupt pending (INTPND) register
INTPND : 32位对应32个中断源 , 当等待中断服务的的中断请求没有被屏蔽(涉及INTMSK) , 并且在两级中断仲裁器中为最高优先级时,这个寄存器的相应位会被置'1' , 被置 '1'的相应中断请求会产生IRQ给CPU . 在中断服务子程序里我们可以通过读出这个寄存器来判断出我们即将服务的是哪一个中断源.
跟SRCPND寄存器一样 , 在终端服务子程序清除了SRCPND相应位之后 , 这个寄存器也必须在中断服务子程序里被清除 .我们可以通过往相应位写'1'来清除它.
FIQ产生不会设置INTPND的任何位 , 也就是说INTPND只受IRQ中断影响.
⑥interrupt offset(INTOFFSET) register
INTOFFSET : 里面的值指明了哪一个IRQ中断请求在INTPND寄存器里面出现 . (FIQ中断不影响这个寄存器)
⑦sub source pending(SUBSRCPND) register
SUBSRCPND : 指明子中断请求状态 . 相应位为'0'指明没有中断请求.'1'则指明产生一个中断请求.
⑧interrupt sub mask (INTSUBMSK) register
INTSUBMSK : 相应位被置'1' , 则表明对应的中断请求源的中断请求CPU不服务(注意 : 这个寄存器的内容不会影响到SUBSRCPND被置'1') .