This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

msp430g2452的定时器中断无法复位

我设置了CCR0和CCR1,在定时器A0中的中断服务程序里放了按键程序,CPU在定时器里扫描按键是否按下。当按键按下,定时器A1会产生中断,中断变量j会计数,计算到5次,给P1口的BIT2置零。这个时候,那个定时器A1的中断没办法关闭,返不回主函数,就算软件清零,也没用。有人帮我指点下,看看程序,是不是程序的结构的问题。

#include <msp430.h>
#define KEY_POWER_ON 0x80

#define CPU_F ((double)1000000)//CPU主频 MCLK=32MHz
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //微秒
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //毫秒
void Time_A1init(void);
void key(void);
void time_condition(void);
unsigned char Get_Power_Key (void);
void time_cond(void);
unsigned long long i=0;

int j,PowerFlag=0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
if (CALBC1_1MHZ==0xFF)
{ // If calibration constant erased
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
BCSCTL1 |= DIVA_0;
BCSCTL3 |= LFXT1S_2;
P1DIR=0xff;
P1SEL=0X00;
P1OUT=0Xff;
P2OUT=0x80;
P2SEL=0X00;
P2DIR = 0xFF&~(KEY_POWER_ON);
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 1;
TACTL = TASSEL_1 + MC_1;
__bis_SR_register(GIE);

while(1);
}
unsigned char Get_Power_Key (void)
{
return (P2IN & KEY_POWER_ON ? 1 : 0);
}

void key(void)
{
if(!Get_Power_Key())
{
delay_ms(1);
if(!Get_Power_Key())
{
Time_A1init();

P1OUT&=~BIT1;

while(!Get_Power_Key());

}
CCTL1 &=~ CCIE;
P1OUT|=BIT1;
j=0;
P1OUT|=BIT0;
}
}

void time_condition(void)
{

if(j==5)
{
P1OUT&=~BIT2;
j=0;
CCTL1 &=~ CCIE;

}

}

void time_cond(void)
{
if(i>60000)
{
P1OUT&=~BIT3;
i=0;
}

}

void Time_A1init(void)
{
CCTL1 = CCIE; // CCR1 interrupt enabled
CCR1 = 12000;
TACTL = TASSEL_1 + MC_2; // ACLK, Contmode

__bis_SR_register(GIE);
}
// Timer A0 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
#endif
{
i++;
time_cond();
if(!Get_Power_Key())
{
;// __bic_SR_register_on_exit(LPM3_bits); // Clear LPM3 bits from 0(SR)
}
key();


}
// Timer_A3 Interrupt Vector (TA0IV) handler
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A1 (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMER0_A1_VECTOR))) Timer_A (void)
#else
#error Compiler not supported!
#endif
{
switch( TA0IV )
{
case 2: // CCR1
{
P1OUT&=~BIT0;
CCR1 += 12000;
j++;
time_condition();

// Add Offset to CCR1
}
break;
case 4: break; // CCR2 not used
case 10: break; // overflow not used
}
}