×
单片机 > 单片机程序设计 > 详情

深入理解ARM体系架构S3C6410外部中断控制实例

发布时间:2020-08-25 发布时间:
|
关于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; 
  
  //都设置为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);//等待

 




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析