MSP430 无法跳出中断
用的是msp430f149,用定时器模拟脉冲,使端口高低电平切换,中断只做自加,主程序死循环中做处理,现在问题就是程序一直在中断中,不跳出来进入主程序中。代买如下#include <msp430x14x.h>
#define Beep_onP4OUT&=~(BIT2+BIT1+BIT3);
#define Beep_OFF P4OUT|=(BIT2+BIT1+BIT3);
unsigned char beep_flag=1;
unsigned int beep_timer;
uint beep_timer_temp = 500;
void Clock_init()
{
unsigned char iq0;
BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 255; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 |= SELS+SELM_2; // SMCLK = XT2
}
void timerA_init()
{
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 5; // 晶振8M
TACTL = TASSEL_2 + MC_1+TACLR; // SMCLK, upmode
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
Clock_init();
P4DIR |= (BIT2+BIT1+BIT3); // P1.0 output
timerA_init();
_EINT();
while(1)
{
if(beep_timer == beep_timer_temp)
{
beep_timer=0;
switch(beep_flag)
{
case 1:
beep_flag=2;
//Beep_on;
P4OUT |= BIT2;
P4OUT |= BIT1;
P4OUT |= BIT3;
break;
case 2:
//Beep_OFF;
beep_flag=1;
P4OUT &= ~BIT2;
P4OUT &= ~BIT1;
P4OUT &= ~BIT3;
if(beep_timer_temp > 10)
beep_timer_temp--;
break;
default:break;
}
}
};
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
beep_timer++;
}
求高手指点,为什么我的程序一直在中断中不跳出来进入while(1)里面 如果把while里面的处理程序放到中断中,完全没问题,可实现效果
但我中断只想做自加操作,程序处理要放到别的地方 强制 Reset 它,肯定是可以跳出的!... {:lol:} 在中断里面是不是需要清除一下标志位? 关注一下。。。
之前做红外遥控,解码的时候也是始终不能跳出中断,加了RETI也无法解决
最后不了了之。。。。。{:mad:}{:mad:} lcofjp 发表于 2014-1-18 10:14
在中断里面是不是需要清除一下标志位?
IO中断才需要软件清除吧? Jordan?? 发表于 2014-1-18 10:22
IO中断才需要软件清除吧?
是IO中断才需要清除标志位,我这里是定时器中断,就是找不到原因为什么不能跳出中断 本帖最后由 lcofjp 于 2014-1-18 10:49 编辑
Jordan?? 发表于 2014-1-18 10:22
IO中断才需要软件清除吧?
你这言论头次听说。
楼主,不好意思,我说错了。 原因我再猜测一下:楼主这个中断产生周期太快,5个时钟周期就要产生一个中断,所以是相应不过来的。入出中断的时间肯定是大于5个周期的。 中断太快了 lcofjp说的不错,5个周期,也就是不到1us就中断,太快了
页:
[1]