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

关于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);//等待
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值