新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2440外部中斷之按鍵中斷

        S3C2440外部中斷之按鍵中斷

        作者: 時間:2016-11-11 來源:網絡 收藏
        要做2440的中斷實驗。首先要了解ARM的中斷體系結構。ARM體系CPU有七種工作模式。分別是:

        用戶模式(usr):ARM處理器正常程序執行狀態。

        本文引用地址:http://www.104case.com/article/201611/316623.htm

        快速中斷模式(fiq):用于高速數據傳輸或通道處理。

        中斷模式(irq):用于通用的中斷處理。

        管理模式(svc):操作系統使用的保護模式。

        數據訪問終止模式(abt):當數據或指令預取終止時進入該模式,可用于虛擬存儲及存儲保護。

        系統模式(sys):運行具有特權的操作系統任務。

        未定義指令終止模式(und):當未定義的指令執行時進入該模式,可用于支持硬件協處理器的軟件仿真。

        此外,ARM體系的CPU有兩種工作狀態,分別是:ARM狀態、Thumb狀態。

        實際上,CPU一上電就工作在ARM狀態,所以我們不必關心CPU工作狀態。

        每一種工作模式對應相應的寄存器,這里就不詳細說了。可以自己查閱相關資料。

        CPU處理不預期事件有以下兩種方法:

        1.查詢方式:程序循環的查詢各個設備的狀態并作出相應的反應。

        2.當某些事件發生時,硬件會設置某個寄存器;CPU在每執行完一個指令時,通過硬件查看這個寄存器,如果發現所關注的事件發生了,則中斷當前程序流程,跳轉到一個固定的地址處理這件事,最后返回繼續執行被中斷的程序。

        我們來看一個中斷處理框圖

        可以看出帶子中斷的要比不帶子中斷的處理過程多兩個寄存器。這里面涉及到的寄存器就要看s3c2440的芯片手冊了。
        我們再來看一張圖,來了解各個寄存器的關系。
        現在來看一下2440外部中斷的引腳
        I/O引腳F腳與外部中斷引腳EINT復用引腳。
        現在結合代碼來說明中斷處理過程。

        #include "2440addr.h"
        #define U32 unsigned int

        static void __irq Key1_ISR(void) //EINT3
        {
        int led;
        rSRCPND = rSRCPND | (0x1<<3);//EINT1開中斷請求 EINT3位置一
        rINTPND = rINTPND | (0x1<<3);//經過仲裁器選出優先級高的中斷后,這個中斷在INTPND寄存器中相應位置一
        led = rGPBDAT & (0x1<<6);
        if (led ==0)
        rGPBDAT = rGPBDAT | (0x1<<6);//原本是亮的,熄滅
        else
        rGPBDAT = rGPBDAT & ~(0x1<<6);//原本是滅的,點亮
        }

        static void __irq Key2_ISR(void) //EINT4
        {
        int led;
        rSRCPND = rSRCPND | (0x1<<4);
        rINTPND = rINTPND | (0x1<<4);
        if(rEINTPEND&(1<<4))
        {
        rEINTPEND = rEINTPEND | (0x1<<4);
        led = rGPBDAT & (0x1<<5);
        if (led ==0)
        rGPBDAT = rGPBDAT | (0x1<<5);
        else
        rGPBDAT = rGPBDAT & ~(0x1<<5);
        }
        }

        static void __irq Key3_ISR(void) //EINT2
        {
        int led;
        rSRCPND = rSRCPND | (0x1<<2);
        rINTPND = rINTPND | (0x1<<2);
        led = rGPBDAT & (0x1<<8);
        if (led ==0)
        rGPBDAT = rGPBDAT | (0x1<<8);
        else
        rGPBDAT = rGPBDAT & ~(0x1<<8);
        }

        void __irq Key4_ISR(void) //EINT0
        {
        int led;
        rSRCPND = rSRCPND | 0x1;
        rINTPND = rINTPND | 0x1;
        led = rGPBDAT & (0x1<<10);
        if (led ==0)
        rGPBDAT = rGPBDAT | (0x1<<10);
        else
        rGPBDAT = rGPBDAT & ~(0x1<<10);
        }

        void Main(void)
        {
        int light;

        rGPBCON = 0x155550;//0000 0001 0101 0101 0101 0000
        rGPBUP = 0x7ff;//上拉無效
        rGPFCON = 0xaaaa;//1010 1010 1010 1010 GPF管腳均設為中斷模式

        rSRCPND = 0x1d;//0001 1101 EINT0、2、3、4_7開
        rINTMSK = ~0x1d;//屏蔽關
        rINTPND =0x1d;
        rEINTPEND = (1<<4);
        rEINTMASK = ~(1<<4);
        rEXTINT0 = 0x22222;//0010 0010 0010 0010 0010 設計觸發方式 均設為下降沿

        light = 0x0;
        rGPBDAT = ~light;

        pISR_EINT0 = (U32)Key4_ISR;
        pISR_EINT3 = (U32)Key1_ISR;
        pISR_EINT2 = (U32)Key3_ISR;
        pISR_EINT4_7 = (U32)Key2_ISR;

        while(1)
        ;
        }
        //******************************************************************************/

        SRCPND/INPND設置要保持一致,負責哪些中斷的開關。INTMSK是總的中斷屏蔽。EINTPEND/EINTMASK只有外部中斷EINT4-EINT23需要設置,在EXTINT0寄存器中設置觸發方式。

        //********************************************************************************/

        pISR_EINT0-pISR_EINT4_7 定義的是中斷向量入口地址,在2440addr.h文件中。如圖:



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 尼勒克县| 民县| 永城市| 孝义市| 贵港市| 义马市| 固镇县| 海丰县| 大城县| 济阳县| 阜阳市| 甘谷县| 富裕县| 萝北县| 新安县| 桂东县| 雅安市| 惠来县| 万山特区| 日喀则市| 永靖县| 封开县| 梧州市| 福建省| 太仓市| 镇坪县| 江门市| 濉溪县| 晋州市| 托里县| 广元市| 宜兴市| 中阳县| 浏阳市| 麦盖提县| 肥东县| 汝城县| 贵定县| 武清区| 凌源市| 进贤县|