1.中断执行过程
1)保存中断前PC值
2)保持中断前CPSR到spsr
3)修改CPSR的相应值,进入相应异常模式
4)执行异常
5)现将SPSR还原到CPSR
6)还原PC
ARM硬件不支持相同异常中断嵌套
如果相同异常嵌套,必须通过软件来保存CPSR和PC的值
不同异常中断硬件支持嵌套
2.s3c2440的中断
共60个终端源,有五种中断触发方式
3.ARM中断响应过程--详细过程
中断初始化总共分为7步,只要初始化后,只要触发中断,那么程序直接跳入中断服务函数
第一步:配置I/O口为中断功能
第二步:配置外部中断触发模式
第三步: EINTPEND外中断挂起寄存器,清除时要写1相当于为0,清除中断请求标志,写0无效。可以不要,开机复位时自动为0.
第四步:EINTMASK外中断屏蔽寄存器,为0允许中断,为1屏蔽中断。是否屏蔽外中断
第五步:清除外部总中断标志:EINT8_23在寄存器SRCPND(中断源请求寄存器),目的允许中断
如果是外部中断需要清两个寄存器,一个为EINTPEND和SRCPND寄存器相应位
第六步:设置中断服务函数,告诉CPU外中断8-23的入口地址
第七步:intmask总中断屏蔽寄存器,写0开总中断,EINT8_23开8-23外部总中断
第八步:前面设置完以后,就可以执行按键中断程序了,如果退出按键测试中断,那么往下执行
*********************************************************************************************************************************
void KeyScan_Test(void)
{
//第一步:配置I/O口为中断功能
rGPGCON = rGPGCON & (~((3<<0)|(3<<6)|(3<<10)|(3<<12)|(3<<14|(3<<22)))) | ((2<<0)|(2<<6)|(2<<10)|(2<<12)|(2<<14|(2<<22))) ;
//第二步:配置外部中断触发模式,配置为下降沿,寄存器设定EINT0-EINT23的触发方式
rEXTINT1 = (2<<0)|(2<<12)|(2<<20)|(2<<24)|(2<<28);
rEXTINT2 = (2<<12);
//第三步: EINTPEND外中断挂起寄存器,清除时要写1相当于为0,清除中断请求标志,写0无效。可以不要,开机复位时自动为0.
rEINTPEND |= (1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19); //clear 清除8,,11,13,14,15,19六个中端中标志位,允许中断
//第四步:EINTMASK外中断屏蔽寄存器,为0允许中断,为1屏蔽中断。 是否屏蔽外中断
rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //enable
//第五步:清除外部总中断标志:EINT8_23在寄存器SRCPND(中断源请求寄存器),目的允许中断
//如果是外部中断需要清两个寄存器,一个为EINTPEND和SRCPND寄存器相应位
ClearPending(BIT_EINT8_23);
//第六步:设置中断服务函数,告诉CPU外中断8-23的入口地址
pISR_EINT8_23 = (U32)Key_ISR;
//第七步:intmask总中断屏蔽寄存器,写0开总中断,EINT8_23开8-23外部总中断
EnableIrq(BIT_EINT8_23);
//第八步:前面设置完以后,就可以执行按键中断程序了,如果退出按键测试中断,那么往下执行
}
*********************************************************************************************************************************
进入中断第一步:判断是哪一个中断,然后清除中断标志