嵌入式arm学习总结(七)--中断-基于S3C2440



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); 
    //第八步:前面设置完以后,就可以执行按键中断程序了,如果退出按键测试中断,那么往下执行
   
}
*********************************************************************************************************************************

进入中断第一步:判断是哪一个中断,然后清除中断标志

你可能感兴趣的:(嵌入式arm)