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

本文由muge0913编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7415075

作者:张同浩,邮箱:[email protected]


关于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<<intNum);
		
	}
	else//如果是vic1组
	{
	    rVIC1INTENABLE |= (1<<(intNum -32));	    			
	}

	return 0;

}


指定中断程序函数:

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);//等待










你可能感兴趣的:(c)