[ZLG-ARM] 周工,请教LPC2103例程

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

RE:liuyk_0321

您好!<br />1.当EINT1发生中断时,怎么知道要去执行下面这段程序?<br />A:中断发生后,CPU读取VICvectAddr寄存器并跳转到相应的程序地址。<br />2.&nbsp;while(1);&nbsp;&nbsp;让程序停在此处合适吗?当EINT1发生中断时,程序会跳到哪里?<br />A:让程序在while处循环是合适的,否则CPU跑完main函数就真的不知道去哪里了。当EINT1发生时程序当然跳到ExtInt0_ISR喽。<br />3.&nbsp;是否应该把程序最后改为<br />while(1)<br />{<br />ExtInt0_ISR;<br />}<br />A:不应该,建议您看一下买开发板时附送的相关书藉“向量中断控制器”部分,这样您会更加了解以上所有问题的。
Liuyk_0321 发表于 2008-9-15 20:24 | 显示全部楼层

再请教周公

void&nbsp;ExtInt0_ISR(void)<br />{<br />IO0CLR&nbsp;=&nbsp;BEEP;&nbsp;//蜂鸣器鸣叫<br />Delay_NS(20);<br />while(IsExtInt(1))<br />{<br />CleanExtInt**(1);&nbsp;//清零EXTINT1&nbsp;中断标志<br />}<br />IO0SET&nbsp;=&nbsp;BEEP;&nbsp;//蜂鸣器停止鸣叫<br />VICVectAddr&nbsp;=&nbsp;0;&nbsp;//退出外部中断1<br />}<br /><br />这段中断服务程序编译后在Flash中的地址是什么?中断寄存器怎么会知道该地址?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

66

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部