目的

   为了更好地掌握S3C2410中断的原理及中断程序的编写。

   内容利用S3C2410的外部中断0和外部中断1实现两个按键功能



原理

   本次选择的是外部中断EXTINT0和EXTINT11。中断的产生分别来自按钮SB1202和SB1203,当按钮按下时,EXTINT0(对应管脚GPF0)或EXTINT11(对应管脚GPG3)和地连接,输入低电平,从而向CPU发出中断请求。

   当CPU受理后,进入相应的中断服务程序,通过超级终端的主窗口显示当前进入的中断号。



程序

 
  
  1. #include "2410addr.h"//这头文件找了好久啊,mdk里面没有,后来在一个实例中提取出来的

  2. #include "2410lib.h"

  3. void __irq int0_int(void)   //外部中断0处理函数

  4. {

  5.    uart_printf("EINT0 interrupt occurred. \n");

  6.    ClearPending(BIT_EINT0);    //清除中断源

  7. }

  8. void __irq int11_int(void)  //外部中断11处理函数

  9. {

  10. if(rEINTPEND==(1<<11))  //判断外部中断挂起寄存器,确定是否外部中断11

  11.    {

  12.        uart_printf("EINT11 interrupt occurred. \n");

  13.        rEINTPEND=(1<<11);  //清除中断挂起寄存器

  14.    }

  15.    ClearPending(BIT_EINT8_23);

  16. }

  17. void int_init(void) //中断初始化

  18. {

  19.    rGPFCON=(rGPFCON & ~(3<<0) | (0x2<<0)); //将CPFO配置为EINT0

  20.    rGPGCON=(rGPGCON & ~(3<<6) | (0x2<<6)); //将CPF3配置为EINT11

  21.    pISR_EINT0=(UINT32T)int0_int;   //注册中断处理函数

  22.    pISR_EINT8_23=(UINT32T)int11_int;    

  23. //注册处理中断11处理函数,EINT8~23共用此函数,需要在处理函数中加入对源中断的判断

  24.    rEINTPEND=0xffffff; //清除所有外部中断挂起状态

  25.    rSRCPND=BIT_EINT0 | BIT_EINT8_23;   //清除源的挂起状态

  26.    rINTPND=BIT_EINT0 | BIT_EINT8_23;   //清除挂起状态

  27.    rEXTINT0=(rEXTINT0 & ~(7<<0)) | (0x2<<0);   //EINT0下降沿触发

  28.    rEXTINT1=(rEXTINT1 & ~(7<<0)) | (0x2<<12);  //EINT1Ï下降沿触发

  29.    rEINTMASK &= ~(1<<11);  //打开外部中断11

  30.    rINTMSK &= ~(BIT_EINT0 | BIT_EINT8_23); //打开INTMSK中的中断0和中断8~23

  31. }

  32. int main()

  33. {

  34.    int_init();  

  35. while(1);

  36. }

  37. //#define ClearPending(bit) {rSRCPND=bit;rINTPND=rINTPND;}

  38. //写入错误的数据

  39. //清除中断源,注意清除的顺序,要从源头开始清除