打印
[ZLG-ARM]

周工,请教LPC2103例程

[复制链接]
2116|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuyk_0321|  楼主 | 2008-9-12 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;
}

相关帖子

沙发
zlg_lly| | 2008-9-12 16:34 | 只看该作者

RE:liuyk_0321

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

使用特权

评论回复
板凳
Liuyk_0321| | 2008-9-15 20:24 | 只看该作者

再请教周公

void ExtInt0_ISR(void)
{
IO0CLR = BEEP; //蜂鸣器鸣叫
Delay_NS(20);
while(IsExtInt(1))
{
CleanExtInt**(1); //清零EXTINT1 中断标志
}
IO0SET = BEEP; //蜂鸣器停止鸣叫
VICVectAddr = 0; //退出外部中断1
}

这段中断服务程序编译后在Flash中的地址是什么?中断寄存器怎么会知道该地址?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

66

帖子

1

粉丝