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.

FR2512定时器A疑问

Other Parts Discussed in Thread: MSP430FR2512, MSP430FR2522, MSP430FR2422

测试使用定时器A输出30ms,然后延时100ms,实测结果是输出76ms,延时252ms,这到底是我代码问题还是器件误差就有那么大?

#include "msp430fr2512.h"

//软件延时宏定义
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))

void main(void)
{
//关狗
WDTCTL = WDTPW + WDTHOLD;

//设置各个时钟源
CSCTL0 = 0;
CSCTL1 &= ~DCORSEL_7;
CSCTL1 |= DCORSEL_3; //DCO设定频率为8M
CSCTL4 |= SELMS_0 + SELA_1; //MCLK和SMCLK选择DCO,ACLK选择REFO
CSCTL5 |= DIVS_3 + DIVM_0; //SMCLK用8分频即1M,MCLK用DCO不分频即8M

TA0CTL = TASSEL_2 + TAIE; //TimerA用SMCLK不分频 ,1M
TA1CTL = TASSEL_1 + TAIE; //TimerB用ACLK不分频

//设置I/O口
P1SEL0 = 0;
P1SEL1 = 0;
P2SEL0 = 0;
P2SEL1 = 0;

P1OUT = 0;
P1DIR = BIT0 + BIT1 + BIT2;
P1DIR |= BIT7;

P2OUT = 0;
P2DIR = BIT2;

PM5CTL0 &= ~LOCKLPM5;

_EINT();

for(;;)
{
//输出30ms
TA0CCR0 = 30000;
P1OUT |= BIT1;
P2OUT |= BIT2;
TA0CTL |= MC_1;
LPM1;
P1OUT &= ~BIT1;
P2OUT &= ~BIT2;
//延时100ms
delay_us(100000);
}
}

#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer0_A1(void)
{
switch(__even_in_range(TA0IV,TA0IV_TAIFG))
{
case TA0IV_TACCR1:
LPM1_EXIT;
TA0CTL &= ~MC_3;
TA1CTL &= ~MC_3;
break;
case TA0IV_TACCR2:
LPM1_EXIT;
break;
case TA0IV_TAIFG:
LPM1_EXIT;
TA0CTL &= ~MC_3;
TA0R = 0;
break;
}
}

  • 芯片的误差没有这么大,建议您用TI例程测试一下

    在MSPWARE内有相关的例程,路径为

    C:\ti\msp\MSP430Ware_3_80_03_07\examples\devices\MSP430FR2xx_4xx\MSP430FR2422_MSP430FR2512_MSP430FR2522_Code_Examples\C

    msp430fr2422_ta0_01.c Timer0_A3, Toggle P1.0, CCR0 Count Mode ISR, DCO SMCLK
    msp430fr2422_ta0_02.c Timer0_A3, Toggle P1.0, CCR0 Up Mode ISR, DCO SMCLK
    msp430fr2422_ta0_04.c Timer0_A3, Toggle P1.0, Overflow ISR, 32kHz ACLK
    msp430fr2422_ta0_16.c Timer0_A3, PWM TA0.1-2, Up Mode, DCO SMCLK
    msp430fr2422_ta0_17.c Timer0_A3, PWM TA0.1-2, Up Mode, 32KHz ACLK
    msp430fr2422_ta0_20.c Timer0_A3, PWM TA0.1-2, Up/Down Mode, 32kHz ACLK
    msp430fr2422_ta0_22.c Timer_A, Ultra-Low Pwr Pulse Accumulator
    msp430fr2422_ta0_capture.c Timer0_A3 Capture of ACLK
    msp430fr2422_ta1_05.c Timer1_A3, Toggle P1.0, CCR0 Cont Mode ISR, 32KHz ACLK
    msp430fr2422_ta1_06.c Timer1_A3, Toggle P1.0, CCR0 UP Mode ISR, 32KHz ACLK
    msp430fr2422_ta1_16.c Timer1_A3, PWM TA1.1-2, Up Mode, DCO SMCLK
    msp430fr2422_ta1_17.c Timer1_A3, PWM TA1.1-2, Up Mode, 32KHz ACLK
  • 建议楼主把mclk、smclk和aclk通过io输出,测量一下,看是否真的是时钟误差。

  • 搞清楚了是FLL的影响,之前用的G系列没这问题所以就没细心看手册,而且之前没例程更加没注意,感谢提供了例程的方法!
  • 很高兴您能解决问题