LPC2114/EASYARM2100中断嵌套设计

来源:互联网 发布:jsp上传图片到数据库 编辑:程序博客网 时间:2024/05/20 13:19

在lpc的工程文件中有个IRQ.s文件,这个文件就是用来处理中断嵌套的。

 

在文件的末尾添加中断处理函数的句柄handler:Eint0_Handler HANDLER IRQ_Eint0。IRQ_Eint0就是中断服务程序名。

 

然后要在使用这个句柄的c文件中声明这个句柄,声明的格式跟声明函数的格式是一样的,如:void Eint0_Handler(void);

 

实现中断嵌套要在irq中断处理函数中开中断,使用下面的嵌入式汇编函数:

__inline void  EnableIRQ(void)
{  int  tmp;

   __asm
   {  MRS tmp, CPSR
      BIC   tmp, tmp, #0x80
      MSR   CPSR_c, tmp
   }
}//inline的目的是编译的时候直接把调用该函数的地方用该函数代替,而不是在运行的时候调用,提高运行速度。

然后在低优先级的中断处理函数中使用改函数开中断。

 

每一个中断处理函数的中断服务程序地址写成这样:VICVectAddr1=(uint32)Eint0_Handler;

 

这时候中断处理函数前面不要加__irq前缀。

 

这样就可以了。

 

实例:

IRQ.s:添加下面的
;/* Add interrupt handler here£¬user could change it as needed */

;Timer0_Handler  HANDLER Timer0
Eint0_Handler HANDLER IRQ_Eint0
T0_Handler HANDLER IRQ_T0
    END

 

main.c:全代码

/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:   main.c
** Last modified Date:  2004-09-16
** Last Version:  1.0
** Descriptions:  The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:   Chenmingji
** Created date:  2004-09-16
** Version:    1.0
** Descriptions:  The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#define LED4 (0X01<<25)
#define LED1 (0X01<<22)
#define KEY1 (0x01<<16)
#define BEEPCON (0X01<<7)
#define BEEPON() IO0CLR=BEEPCON
#define BEEPOFF() IO0SET=BEEPCON
#define LED1ON() IO0CLR=LED1
#define LED1OFF() IO0SET=LED1
#define LED4ON() IO0CLR=LED4
#define LED4OFF() IO0SET=LED4

void Eint0_Handler(void);
void T0_Handler(void);

__inline void  EnableIRQ(void)
{  int  tmp;

   __asm
   {  MRS tmp, CPSR
      BIC   tmp, tmp, #0x80
      MSR   CPSR_c, tmp
   }
}
void T0Init(void)
{
 T0TC=0;
 T0PR=0;
 T0MCR=0x03;
 T0MR0=Fpclk/2;
 T0IR=0x01;
 T0TCR = 0x03;
 T0TCR = 0x01;
 
 
}

extern void  IRQ_T0(void)
{
 uint32 backup=0x00;
 uint32 t=0;
 backup=VICIntEnable;

 VICIntEnClr=(0x01<<4)|(0x01<<14);
 VICVectAddr=0x00;
 t=IO0SET;
 if((t&LED4)==0)
  {
   IO0SET=LED4;
  }
 else
  {
   IO0CLR=LED4;
  }
 T0IR=0x01;
 VICIntEnable=backup;
 
}
void Eint0Init(void)
{
 
 
}
extern void  IRQ_Eint0(void)
{
 uint32 backup=0x00;
 uint32 t;
 backup=VICIntEnable;

 VICIntEnClr=(0x01<<14);
 VICVectAddr=0;
 EnableIRQ();
 t=IO0SET;
 if((t&LED1)==0)
  {
   LED1OFF();
  }
 else
  {
   LED1ON();
  }
 while((EXTINT&0x01)!=0)
  {
   EXTINT=0x01;
  }
 VICIntEnable=backup;
 
}


int main (void)
{// add user source code
 //T0Init();
 //Eint0Init();
 PINSEL0=0x00000000;
 PINSEL1=0x00000001;//key1
 IO0DIR=LED1|LED4;
 BEEPOFF();
 VICIntSelect=0x00000000;
 VICIntEnable=(0x01<<14)|(0x01<<4);
 VICVectCntl1=0x20|14;
 VICVectAddr1=(uint32)Eint0_Handler;
 //VICVectAddr1=(uint32)IRQ_Eint0;
 VICVectCntl0=0X20|4;
 VICVectAddr0=(uint32)T0_Handler;
 //VICVectAddr0=(uint32)IRQ_T0;
 EXTINT=0x01;
 T0Init();
 IO0CLR=LED4;
 LED1ON();
 //IO0CLR=LED1;
 
 EnableIRQ();
 while(1);
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

如果按住key1,LED4还可以闪烁,则证明中断嵌套成功。