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

FR2512定时器A疑问

$
0
0

测试使用定时器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;
}
}


Viewing all articles
Browse latest Browse all 3634

Trending Articles