1. 程式人生 > >【ARM】s3c2410中斷處理例項

【ARM】s3c2410中斷處理例項

目的

   為了更好地掌握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. //清除中斷源,注意清除的順序,要從源頭開始清除