深入理解ARM体系架构S3C6410外部中断控制实例
时间:11-20
来源:互联网
点击:
关于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; //都设置为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);//等待
ARM体系架构S3C6410外部中断控 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)