问个IRQ中断嵌套的问题
本帖最后由 Bloath 于 2011-12-10 08:55 编辑看datasheet中,EINT0的优先级比EINT4的默认要高
我写了两个中断程序,我用按键进行触发,程序如下
EINT0的执行是先让左边两个LED亮,延时一段时间后,只让最左边的亮
EINT4的程序内容跟EINT0相类似,只是LED显示变成了右边
单独测两个中断都没有问题,进行嵌套实验
当我触发了EINT4时,在中间的延时时我触发了EINT0
因为EINT0优先级比较高,所以执行了EINT0的中断程序
但是EINT0执行完后没有继续执行EIN4的内容
示意图如下
触发EINT4
灭---灭---亮---亮
触发EINT0
亮---亮---灭---灭
程序中的延时
亮---灭---灭---灭
(如果返回的话应该还能执行
灭---灭---灭---亮)
求大神解释 你怎么不把程序贴出来呢???那样好分析。你给个结果不好分析的 本帖最后由 Bloath 于 2011-12-10 14:46 编辑
void LED(U16 Data)
{
rGPBDAT = (rGPBDAT & ~(0xf<<5)) | ((~Data & 0xf)<<5);
}
void delay(U16 x)
{
U16 b;
while(x--)
{ for(b=0xffff; b>0; b--); }
}///////////////////////////////
/// EINT0的中断程序
///////////////////////////////
void __irq INT0()
{
LED(0x03);
delay(50);
LED(0x01);
rSRCPND |= 0x1;
rINTPND |= 0x1;
}
///////////////////////////////
/// EINT4的中断程序
///////////////////////////////
void __irq INT4()
{
LED(0x0C);
delay(50);
LED(0x08);
rEINTPEND |= 0x10;
rSRCPND |= 0x10;
rINTPND |= 0x10;
}
///////////////////////////////
/// EINT0和4的IRQ初始化
///////////////////////////////
void INTInit()
{
rGPFCON |= (0x2<<8)|0x2; //将GPF的两位IO口设成中断模式
rEXTINT0 |= (0x2<<16)|2; //将EINT0和EINT4的触发方式为下降沿
rEINTMASK &= ~(1<<4); //解除EINT0和EINT4的屏蔽位
rINTMSK &= ~((1<<4)|1); //同上
pISR_EINT0 = (U32)INT0; //将中断地址写给二级向量表
pISR_EINT4_7 = (U32)INT4; //同上
}
void Main(void)
{
INTInit();
rGPBCON = 0x155555;
while(1)
{
LED(0x08);
delay(70);
LED(0x04);
delay(70);
LED(0x02);
delay(70);
LED(0x01);
delay(70);
}
}
正在查中断方面的资料,我也是在中断上遇到问题.
页:
[1]