关于S3C6410的中止问题,网上有许多高手现已剖析过了,在这里我首要剖析S3C6410完成进程,和自己现已编写好的简略程序。
我用的是mini6410 的k1键完成外部中止。
按键初始化:
void Key_Init(){rGPNCON|=(1<<1); //将GPN0设置为中止形式rGPNPUD&=~(1<<0);//上拉电阻rEINT0CON0|=(3<<0); //下降沿触发rEINT0MASK&=~(1<<0); //撤销屏蔽rEINT0FLTCON0|=(1<<7); //延时滤波}
留意:我在这只初始化了一个引脚,即GPNCON0
按键中止程序:
void Key_ISR() __irq //按键中止函数{i++;if(i%2==0)Led_Display(0x0);//在这里用户可增加其他的处理操作else Led_Display(0xf);rEINT0PEND|=(1<<0);//写1铲除中止INTC_ClearVectAddr();//这个函数下面咱们再介绍}
/*铲除中止指示,避免搅扰下一次中止产生*/void INTC_ClearVectAddr(void){rVIC0ADDR = 0x0;rVIC1ADDR = 0x0;}
中止初始化函数:
void INTC_Init(void) {//封闭一切中止rVIC0INTENCLEAR = 0xffffffff; rVIC1INTENCLEAR = 0xffffffff; //都设置为IRQrVIC0INTSELECT = 0x0;rVIC1INTSELECT = 0x0;INTC_ClearVectAddr();}
使能中止函数:
//翻开某一个中止int INTC_Enable(unsigned int intNum){if(intNum > INT_LIMIT)//数值检测{return -1;}if(intNum<32)//如果是vic0组{rVIC0INTENABLE |= (1<指定中止程序函数:
void INTC_SetIntISR(unsigned int intNum, void (*isr)(void) __irq){if(intNum > INT_LIMIT)//数值检测{return ;}if(intNum < 32)//如果是vic0组{VIC0VECTADDR[intNum] = (unsigned )isr;}else//如果是vic1组{VIC1VECTADDR[intNum-32] = (unsigned )isr;}}编写main函数:
Led_Init();//led初始化Led_Display(0x0);//操控ledKey_Init();//按键初始化INTC_Init();//中止初始化INTC_Enable(INT_EINT0);//中止使能INTC_SetIntISR(INT_EINT0,Key_ISR);//指定中止处理函数while(1);//等候