色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          TQ2440按鍵中斷

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

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

          本文引用地址:http://cafeforensic.com/article/201611/321677.htm

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

          #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函數的地址映射到中斷向量表,這樣,當中斷觸發(fā)時,就跳到相應函數的地址執(zhí)

          //行該函數。如EINT0中斷被觸發(fā)時,就執(zhí)行函數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按鍵中

          評論


          技術專區(qū)

          關閉