单片机
返回首页

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

2016-05-12 来源:eefocus

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

 

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 用数字电路CD4069制作的万能遥控轻触开关

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章