当前位置: 代码迷 >> 单片机 >> LPC2478的定时器中断有关问题,每当BEEP或LED7或LED8为低电平时,IRQ中断将被停止,请教为什么
  详细解决方案

LPC2478的定时器中断有关问题,每当BEEP或LED7或LED8为低电平时,IRQ中断将被停止,请教为什么

热度:70   发布时间:2016-04-28 15:51:08.0
LPC2478的定时器中断问题,每当BEEP或LED7或LED8为低电平时,IRQ中断将被停止,请问为什么?
#define LED7 (1<<6) //P2.6
#define LED8 (1<<7) //P2.7
#define BEEP (1 << 5) // P2.5控制蜂鸣器
#define MkCLK (1<<26) //VD5026时钟产生信号:P2.22 输出11.17KHZ时可确保VD5026编码工作

void __irq IRQ_Timer0(void)
{ if ((FIO2SET & MkCLK) == 0)
{
FIO2SET = MkCLK;
}
else
{
FIO2CLR = MkCLK;
}
T0IR = 0x01; // 清除中断标志
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
void TimerIni()
{
 PINSEL5=PINSEL5&0xFFCFFFFF;
 PINSEL4=PINSEL4&0xFFFFFFFF;
 FIO2DIR=MkCLK;
 FIO2SET=MkCLK;
 
/* 定时器0初始化 */
T0TC = 0; // 定时器设置为0
T0PR = 0; // 时钟不分频
T0MCR = 0x03; // 设置T0MR0匹配后复位T0TC,并产生中断标志
T0MR0 = Fpclk /(2*11170); // 0.5秒钟定时
T0TCR = 0x01; // 启动定时器


  /* 打开IRQ中断 */
IRQEnable(); // IRQ中断使能

/* 设置定时器0中断IRQ */
VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
VICVectPri4 = 00; // 设置定时器0中断最高优先级
VICVectAddr4 = (uint32)IRQ_Timer0; // 设置中断服务程序地址
VICIntEnable = 1 << 0x04; // 使能定时器0中断
  
}

//蜂鸣器 N=鸣叫次数
void Beep(int N)
{int i;
 PINSEL4=PINSEL4&0xFFFFF3FF;
 PINSEL5=PINSEL5&0xFFFFFFFF;
 FIO2DIR=BEEP;//设置P2.5为输出特性

 FIO2SET=BEEP;

 for(i=0;i<N;i++)
 {
  FIO2CLR=BEEP;
  Delay(100);
  FIO2SET=BEEP;
  Delay(100);
  }
}

//LD7 LD8指示灯点亮控制
void LED7LED8blink(int N)//b=交替闪烁次数
{
 int i;
 PINSEL4=PINSEL4 & 0xFFFF0FFF;
 FIO2DIR=LED7|LED8;//设置P2.6\7为输出特性
 FIO2SET=LED7;
 FIO2SET=LED8;
 for(i=0;i<N;i++)
 {
  FIO2CLR=LED7;
  Delay(50);
  FIO2SET=LED7;
  Delay(50);
  FIO2CLR=LED8;
  Delay(50);
  FIO2SET=LED8;
  Delay(50);
 }
}

------解决方案--------------------
这个和IRQ中断不会有什么关系吧 还是仔细查一下吧
------解决方案--------------------
这样看来,
1 你是不断地重新配置了IO口了,才出现了你所谓的,中断不被终止。
是你初始化有问题了
 

探讨

奇怪的是将IRQ定时器中断初始化放入主函数的while(1)循环体内不断重复才可以保持中断不被终止。问题依然没解决掉。