深入理解ARM体系架构S3C6410外部中断控制实例
2016-05-12 来源:eefocus
关于S3C6410的中断问题,网上有很多高手已经分析过了,在这里我主要分析S3C6410实现过程,和自己已经编写好的简单程序。
注意:我在这只初始化了一个引脚,即GPNCON0
使能中断函数:
进入单片机查看更多内容>>
我用的是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; //都设置为IRQ rVIC0INTSELECT = 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);//控制led Key_Init();//按键初始化 INTC_Init();//中断初始化 INTC_Enable(INT_EINT0);//中断使能 INTC_SetIntISR(INT_EINT0,Key_ISR);//指定中断处理函数 while(1);//等待
相关文章