新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > TQ2440按鍵中斷

        TQ2440按鍵中斷

        作者: 時間:2016-11-26 來源:網絡 收藏
        有幾點需要注意:

        1、需要調用MMU函數,實現內存的映射;

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

        2、在中斷觸發跳入中斷處理函數后,首先要清除SRCPND和INTPND相應的位,如果用到次級中斷源,如這里用到了EINT4_7中的EINT4,就要清除EINTPEND相應的位。一般來說,應該先清除次級中斷源相應的位,再清除中斷源,否則中斷源會發生多次中斷。在完成清除后再進行具體的處理。

        #include "def.h"
        #include "option.h"
        #include "2440addr.h"
        #include "2440lib.h"
        #include "2440slib.h"
        #include "mmu.h"


        #define LED1 (1<<5) //must be "()"
        #define LED2 (1<<6)
        #define LED3 (1<<7)
        #define LED4 (1<<8)

        #define KEY1(1<<1)//GPF1
        #define KEY2(1<<4)//GPF4
        #define KEY3(1<<2)//GPF2
        #define KEY4(1<<0)//GPF0

        //void delay_ms(U32 i);
        void init_irq(void);
        void MMU_Init(void);

        int Main(void)
        {
        rGPBCON=0x15400;
        rGPBDAT=0x7ff;
        MMU_Init();//必須要有MMU,目的是為了實現地址映射
        init_irq();//初始化中斷寄存器
        while(1);

        }

        void delay_ms(U32 i)
        {
        int j;
        for(;i>0;i--)
        for(j=65535;j>0;j--);
        }

        void key_per(void)//按鍵處理
        {
        if(!(rGPFDAT&KEY1))
        rGPBDAT=~LED1;

        else if(!(rGPFDAT&KEY2))
        rGPBDAT=~LED2;

        else if(!(rGPFDAT&KEY3))
        rGPBDAT=~LED3;

        else if(!(rGPFDAT&KEY4))
        rGPBDAT=~LED4;

        }

        void __irq key1_3_4(void)
        {
        //當按下鍵后,就跳到此函數里,在以下的按鍵對應的各個分支里,在跳到key_per()前應該調用

        //ChearPending()清除SCRPND和INTPND對應的位
        if(rINTPND &KEY3)
        {
        ClearPending(BIT_EINT2);
        key_per();
        }
        else if(rINTPND &KEY4)
        {
        ClearPending(BIT_EINT0);
        key_per();
        }

        else if(rINTPND&KEY1)
        {
        ClearPending(BIT_EINT1);
        key_per();
        }

        }

        void __irq key2(void)

        {
        //if(rEINTPEND &KEY2)//10000
        //{
        rEINTPEND = (1<<4);//CLEARrEINTPEND
        ClearPending(BIT_EINT4_7);
        key_per();
        //}
        }

        //由于key2在電路圖上對應的是GPF4,相應的中斷功能是EINT4,它具體是由次級中斷寄存器中的

        //EINTMASK來使能的,在init_irq()中由于要映射中斷處理函數,因此這里單獨寫出key2,清晰程序。

        void init_irq(void)
        {
        rGPFCON&=(~((3<<0)|(3<<2)|(3<<4)|(3<<8)));
        rGPFCON|=((2<<0)|(2<<2)|(2<<4)|(2<<8));//configure GPF0、1、2、4 to EINT0、1、2、4
        //rGPFCON=0xfeea;
        rPRIORITY=0x00000000;//deafult priority configure
        rINTMOD=0x0;//IRQ
        EnableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);//enable EINT0、1、2、4_7 with INTMSK register
        //rINTMSK&=(~((1<<0)|(1<<1)|(1<<2)|(1<<4)));
        rEINTMASK&=~(1<<4);//enbale EINT4 with EINTMASK register

        //下面是將key1_3_4和key2函數的地址映射到中斷向量表,這樣,當中斷觸發時,就跳到相應函數的地址執

        //行該函數。如EINT0中斷被觸發時,就執行函數key1_3_4。

        pISR_EINT0= (unsigned int)key1_3_4;

        pISR_EINT1= (unsigned int)key1_3_4;
        pISR_EINT2= (unsigned int)key1_3_4;
        pISR_EINT4_7= (unsigned int)key2;

        }



        關鍵詞: TQ2440按鍵中

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 随州市| 泰安市| 大悟县| 蓝田县| 金门县| 嘉定区| 临桂县| 珲春市| 辉县市| 武强县| 尚义县| 谷城县| 海伦市| 金乡县| 德江县| 鹿泉市| 黑河市| 平湖市| 榆社县| 建湖县| 萝北县| 天津市| 海晏县| 紫金县| 年辖:市辖区| 武汉市| 苍南县| 丰原市| 郧西县| 新建县| 体育| 景德镇市| 离岛区| 黎川县| 中西区| 当涂县| 鹿邑县| 福贡县| 临泽县| 林甸县| 巴彦县|