1.向量IRQ 的使用 将EINT1 初始化为IRQ 中断。短接JP1 时,发生中断,蜂鸣器鸣叫一声。 程序清单 4.4 向量IRQ 中断测试 #define IN_MAIN #include "config.h" #include "ExtInterrupt.h" #pragma import(__use_no_semihosting_swi) //don't delete this line #define BEEP (1 << 7) //P0.7 控制BEEP #define EXTINT0_NO 15 //外部中断1 的中断号 /****************************************************************************************** ** 函数名称:Delay_NS() ** 功能描述:延时函数。 ******************************************************************************************/ void Delay_NS(uint32 dly) { uint32 i; for(; dly > 0; dly--) { for(i = 0; i < 50000; i++); } } /****************************************************************************************** ** Function name: IRQ_Exception ** Descriptions: interrupt exceptional handler , change it as needed ** don't delete this function ******************************************************************************************/ void IRQ_Exception(void) { } /****************************************************************************************** **函数名称:ExtInt0_ISR **功能描述:外部中断0 中断服务函数。 ******************************************************************************************/ void ExtInt0_ISR(void) { IO0CLR = BEEP; //蜂鸣器鸣叫 Delay_NS(20); while(IsExtInt(1)) { CleanExtInt**(1); //清零EXTINT1 中断标志 } IO0SET = BEEP; //蜂鸣器停止鸣叫 VICVectAddr = 0; //退出外部中断1 } /****************************************************************************************** ** 函数名称:Main() ** 函数功能:测试向量IRQ。 ** 说明:芯片复位时,JP1 跳线不能短接。JP9 跳线断开。 ******************************************************************************************/ void Main(void) { TargetInit(VPBDIV_DATA, PLLCFG_DATA, MAMTIM_DATA); // don't delete while((PLLSTAT & (1 << 10)) == 0); // can delete PINSEL0 = 0; PINSEL1 = 0; IO0DIR = BEEP; IO0SET = BEEP; SetExtInt(1, 0, 0); //使能外部中断1,低电平触发,禁止唤醒CPU 功能 SetISR(EXTINT0_NO,0,(uint32)ExtInt0_ISR); //设置IRQ 中断 VICIntEnable = (1 << EXTINT0_NO); //对应的中断使能 IRQEnable(); //打开中断 while(1); }
请教:1.当EINT1发生中断时,怎么知道要去执行下面这段程序?
/****************************************************************************************** **函数名称:ExtInt0_ISR **功能描述:外部中断0 中断服务函数。 ******************************************************************************************/ void ExtInt0_ISR(void) { IO0CLR = BEEP; //蜂鸣器鸣叫 Delay_NS(20); while(IsExtInt(1)) { CleanExtInt**(1); //清零EXTINT1 中断标志 } IO0SET = BEEP; //蜂鸣器停止鸣叫 VICVectAddr = 0; //退出外部中断1 }
2. while(1); 让程序停在此处合适吗?当EINT1发生中断时,程序会跳到哪里?
3. 是否应该把程序最后改为
while(1) { ExtInt0_ISR; } |