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