我设置了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
}
}
xyz549040622:
你程序的思想有问题,产生了互锁应该是。不要两个定时器相互关段,对于按键状态机来说,一个定时器足够了。
jiayuan song:
回复 xyz549040622:
我的定时器A0,是用来定时别的程序模块的,这里没写出来,就定义了一个变量,所以我的按键状态机就用了一个定时器,
jiayuan song:
回复 jiayuan song:
我的意思是有没有办法在中断里面进行中断,就是中断嵌套,现在我的程序,从中断a中执行到中断b,但是中断b执行完程序后,没有关闭中断,也就是没有继续执行中断a的程序,简单的说就是定时器没办法退出中断了。