嵌入式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); 
    //第八步:前面設置完以後,就可以執行按鍵中斷程序了,如果退出按鍵測試中斷,那麼往下執行
   
}
*********************************************************************************************************************************

進入中斷第一步:判斷是哪一個中斷,然後清除中斷標誌

發佈了27 篇原創文章 · 獲贊 15 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章