有幾點需要注意:1、需要調(diào)用MMU函數(shù),實現(xiàn)內(nèi)存的映射;
本文引用地址:http://m.butianyuan.cn/article/201611/321677.htm2、在中斷觸發(fā)跳入中斷處理函數(shù)后,首先要清除SRCPND和INTPND相應(yīng)的位,如果用到次級中斷源,如這里用到了EINT4_7中的EINT4,就要清除EINTPEND相應(yīng)的位。一般來說,應(yīng)該先清除次級中斷源相應(yīng)的位,再清除中斷源,否則中斷源會發(fā)生多次中斷。在完成清除后再進(jìn)行具體的處理。
#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,目的是為了實現(xiàn)地址映射
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)
{
//當(dāng)按下鍵后,就跳到此函數(shù)里,在以下的按鍵對應(yīng)的各個分支里,在跳到key_per()前應(yīng)該調(diào)用
//ChearPending()清除SCRPND和INTPND對應(yīng)的位
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在電路圖上對應(yīng)的是GPF4,相應(yīng)的中斷功能是EINT4,它具體是由次級中斷寄存器中的
//EINTMASK來使能的,在init_irq()中由于要映射中斷處理函數(shù),因此這里單獨寫出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函數(shù)的地址映射到中斷向量表,這樣,當(dāng)中斷觸發(fā)時,就跳到相應(yīng)函數(shù)的地址執(zhí)
//行該函數(shù)。如EINT0中斷被觸發(fā)時,就執(zhí)行函數(shù)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;
}
評論