深入理解ARM體系架構(gòu)S3C6410外部中斷控制實例
我用的是mini6410 的k1鍵實現(xiàn)外部中斷。
本文引用地址:http://m.butianyuan.cn/article/201611/318687.htm按鍵初始化:
void Key_Init(){rGPNCON|=(1<<1); //將GPN0設(shè)置為中斷模式rGPNPUD&=~(1<<0);//上拉電阻rEINT0CON0|=(3<<0); //下降沿觸發(fā)rEINT0MASK&=~(1<<0); //取消屏蔽rEINT0FLTCON0|=(1<<7); //延時濾波}
注意:我在這只初始化了一個引腳,即GPNCON0
按鍵中斷程序:
void Key_ISR() __irq //按鍵中斷函數(shù){i++;if(i%2==0)Led_Display(0x0);//在這里用戶可添加其他的處理操作else Led_Display(0xf);rEINT0PEND|=(1<<0);//寫1清除中斷INTC_ClearVectAddr();//這個函數(shù)下面我們再介紹}
/*清除中斷指示,防止干擾下一次中斷發(fā)生*/void INTC_ClearVectAddr(void){rVIC0ADDR = 0x0;rVIC1ADDR = 0x0;}
中斷初始化函數(shù):
void INTC_Init(void) {//關(guān)閉所有中斷rVIC0INTENCLEAR = 0xffffffff; rVIC1INTENCLEAR = 0xffffffff; //都設(shè)置為IRQrVIC0INTSELECT = 0x0;rVIC1INTSELECT = 0x0;INTC_ClearVectAddr();}
使能中斷函數(shù):
//打開某一個中斷int INTC_Enable(unsigned int intNum){if(intNum > INT_LIMIT)//數(shù)值檢測{return -1;}if(intNum<32)//如果是vic0組{rVIC0INTENABLE |= (1<指定中斷程序函數(shù):
void INTC_SetIntISR(unsigned int intNum, void (*isr)(void) __irq){if(intNum > INT_LIMIT)//數(shù)值檢測{return ;}if(intNum < 32)//如果是vic0組{VIC0VECTADDR[intNum] = (unsigned )isr;}else//如果是vic1組{VIC1VECTADDR[intNum-32] = (unsigned )isr;}}編寫main函數(shù):
Led_Init();//led初始化Led_Display(0x0);//控制ledKey_Init();//按鍵初始化INTC_Init();//中斷初始化INTC_Enable(INT_EINT0);//中斷使能INTC_SetIntISR(INT_EINT0,Key_ISR);//指定中斷處理函數(shù)while(1);//等待
評論