在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还可以闪烁,则证明中断嵌套成功。