Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 3634

TIMER1_A1中断问题

$
0
0

我用的是G2553,时钟设置为16M,定时器设置为up-down模式,CCR0=400,这样也就是说PWM周期为20K。我在程序中使用TIMER1_A1中断翻转P3.7口的电平,当代码如下时可以正常观察到P3.7口为10KHz的方波。

#include <msp430.h>

int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
/******init clock*******/
BCSCTL1 = CALBC1_16MHZ; // Set DCO ~ 16 Mhz
DCOCTL = CALDCO_16MHZ;
BCSCTL1 |= DIVA_1; // ACLK/(0:1,1:2,2:4,3:8)
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO
/******init GPIO*******/
P2DIR |= BIT1+BIT2+BIT4;
P2SEL |= BIT1+BIT2+BIT4;
P3SEL &= ~ (BIT7); //GPIO-LED3
P3DIR |= (BIT7); //Output-LED3
/******init TIMER*******/
TA1CCR0 = 400; // PWM Period/2
TA1CCTL1 = OUTMOD_2; // CCR1 toggle/set
TA1CCR1 = 100-1; // CCR1 PWM duty cycle
TA1CCTL2 = OUTMOD_6; // CCR2 toggle/set
TA1CCR2 = 100; // CCR2 PWM duty cycle
TA1CTL = TASSEL_2 + MC_3 + TACLR + TAIE; // SMCLK, up-down mode
__bis_SR_register(GIE);
while(1)
{

}
// __bis_SR_register(LPM0_bits); // Enter LPM0
}

#pragma vector = TIMER1_A1_VECTOR//20k frequency
__interrupt void TIMER1_A1_ISR (void)
{

switch(__even_in_range(TA1IV,0x0A))
{
case TA1IV_NONE: break; // Vector 0: No interrupt
case TA1IV_TACCR1: break; // Vector 2: TACCR1 CCIFG
case TA1IV_TACCR2: break; // Vector 4: TACCR2 CCIFG
case TA1IV_6: break; // Vector 6: Reserved CCIFG
case TA1IV_8: break; // Vector 8: Reserved CCIFG
case TA1IV_TAIFG: // Vector 10: TAIFG 减计数到0
P3OUT ^= BIT7;
break;
default: break;
}
}

当我把中断程序中“P3OUT ^= BIT7;”这句话挪到SWITCH外面时(如下),依然能在P3.7脚正常观察到10kHz的方波。

__interrupt void TIMER1_A1_ISR (void)
{
P3OUT ^= BIT7;
switch(__even_in_range(TA1IV,0x0A))
{
case TA1IV_NONE: break; // Vector 0: No interrupt
case TA1IV_TACCR1: break; // Vector 2: TACCR1 CCIFG
case TA1IV_TACCR2: break; // Vector 4: TACCR2 CCIFG
case TA1IV_6: break; // Vector 6: Reserved CCIFG
case TA1IV_8: break; // Vector 8: Reserved CCIFG
case TA1IV_TAIFG: break; // Vector 10: TAIFG 减计数到0


default: break;
}
}

然后我把整个SWITCH语句拿掉后再P3.7脚处观察到了约为500k频率的方波。

我没理解为什么,首先我知道CCR1,CCR2,TIMER OVERFLOW都可以触发TIMER1_A1中断,但是我在程序中只使能了TIMER_OVERFLOW触发中断,CCR1,CCR2的我都没有使能,所以按道理是不需要根据TA1IV的值来判断是哪种中断的,因为只有TIMER_OVERFLOW才会触发该中断,也就是说进入中断的频率应该是20K,但是我拿掉switch语句后P3.7的翻转频率不对。再者当我把翻转P3.7的语句拿到switch语句之前时P3.7翻转的频率是对的,为20k的一半,这个时候我并没有判断TA1IV的值,并不知道是哪种条件触发的中断。


Viewing all articles
Browse latest Browse all 3634

Trending Articles