关于 MSP430 定时器 A/B的应用的问题
问题1、我使用定时器A产生独立的时间间隔,我模仿例子建立程序,在没有其他程序的时候,可以正常产生独立的时间间隔,但是当程序增多的时候,发现有时候无法进入定时器,或者过了很久才能进入定时器。我猜想可能是其他的中断干扰了定时器,我的判断正确吗。
问题2:我虽然使用MSP430 定时器产生了几个独立的时间周期,但是我对这个定时器的工作原理还有理解不透的地方。
代码如下:
// Timer1 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
TA0CCR0 += 64; // Add Offset to CCR0
}
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case 0:
break;
case 2:
TA0CCR1 += 8192; // Add Offset to CCR2
SendGPSData();
break; // CCR4 not used
case 4:
UCA0IE |= UCRXIE;
TA0CCR2+= 256; // Add Offset to CCR2
UART1_SendStr_char(ask); //TA0R1计数到CCR1触发
P9OUT |= BIT0;
break;
case 6:
UCA0IE |= UCRXIE;
TA0CCR3 += 512; // Add Offset to CCR1
WindV=TA1R*0.88; //记录1s内的风速计数值(每秒的风速),每个脉冲对应0.88米
TA1R = 0; //风速计计数清零
break;
case 8:
break; // CCR3 not used
case 10:
break; // CCR5 not used
case 12:
break; // Reserved not used
case 14: // overflow
break;
default:
break;
}
}
上面的代码,下面的这一部分的作用是什么?里面没有任何处理程序。也就是定时器A为什么一定需要CCR0,然而CCR0却不做任何工作,为什么CCR0和CCR1-CCR5分开来?定时器A CCR0和其他的CCRx的关系是是什么,工作机制是怎样子,说的越详细越好。
// Timer1 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
TA0CCR0 += 64; // Add Offset to CCR0
}
[解决办法]
很久没有用 msp430, 它是不错的 mcu, 不会发生你说的情况,可能是你的 isr 有问题
可能是不同的中断时间处理不同的事物
[解决办法]
对于问题1,我想你的判断是正确的。
对于问题2,我想你对TimerA定时器还缺乏了解。在你的TIMER0_A1_VECTOR中断向量的中断程序中,有TA0CCR1 += 8192;TA0CCR2+= 256;的语句,我看不到你在主程序中对TimerA的模式设置,但是我猜想写此程序的人写TA0CCR0 += 64;TA0CCR1 += 8192;TA0CCR2+= 256;是相呼应的,是想实现什么。这要看你如何设置TimerA的模式,和你的程序到底想干什么事情!