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.

msp430g2553关于时钟和定时器捕获的问题

Other Parts Discussed in Thread: MSP430G2553

使用的是launchpad板,在产品开发中遇到了几个问题,希望各位高手能予以解答,先说ACLK

void CLOCK_INIT(void)
{
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
BCSCTL2 |= SELM_0 + DIVS_0;
BCSCTL3 |= LFXT1S_0; //晶振
BCSCTL3 |= XCAP_2;//10pf
IFG1 &= ~OFIFG; //清除振荡器错误中断标志
}

由于产品需要能准确计时,所以我需要用外部晶振工作在LPM3中,现在焊了个32768,我想问上面的程序配置的对吗,我还焊了两个10P电容,外部电容有无必要,寄存器设置的电容是什么电容,具体关于这点软件硬件应该怎么处理?

还有一个问题是关于我需要第二个定时器的捕获功能,(因为我看手册说第一个定时器的捕获功能和串行口重复了)我在网上找了好久也没有找到定时器2的程序,大都是定时器1的。我自己改了一个使用,现在定时器配置的是MCLK.(有的说会是SMCLK),我想改成ACLK,但是一旦修改成ACLK系统就不工作了,连带着我的串口都失去反应,串口使用的是smclk.

还有就是同步捕获与异步捕获的区别。

#include "msp430g2553.h"
unsigned int lastCCR0=0,JJ=0;
unsigned int k=0,J=0;
void TIME2_INIT(void)
{
TA1CTL = TASSEL_2 + MC_2 +TACLR ; //改为TASSEL_1,手册说是ACLK,改完就不正常了。
TA1CCTL0 =CM_1 + CCIS_0+ SCS + CAP + CCIE;
//实际使用的是P2.0下降沿,,大家先看看捕获配置的对否,

P2REN |= 0xff;//上拉
P2DIR =0;
P2SEL =0xff;
P2SEL2 =0;

}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
BCSCTL2 |= SELM_0 + DIVS_0;
BCSCTL3 |= LFXT1S_0; //晶振
BCSCTL3 |= XCAP_2;//10pf
IFG1 &= ~OFIFG; //清除振荡器错误中断标志

P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104; // 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
TIME2_INIT();

_EINT();
//while(1)
// LPM3;
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
}

// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = 0x55;//UCA0RXBUF; // TX -> RXed character
int a=UCA0RXBUF; //读取后清楚接收中断标志位(猜测)
}

// Timer A0 interrupt service routine
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0 (void) //CCR0
{

k=TA1CCR0-lastCCR0;
lastCCR0=TA1CCR0;
J=TA1R-JJ;
JJ=TA1R;
//UCA0TXBUF = k>>8;
// while (!(IFG2&UCA0TXIFG));
//UCA0TXBUF = k;
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF = J>>8;
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF = J;
P1OUT ^= 0x01; // Toggle P1.0
}

现在这种配置的输出其实也不太正常,我就是用按键连续按下制造下降沿,不知道是不是动作太慢时钟太快的原因,希望用过的可以给予解答,谢谢大家!

  • 问题1、可以不外接电容的,一般情况使用内置的电容就可以。这个电容是晶体振荡器的起振电容,帮助晶体振荡器尽快进入稳定的工作状态的。

    问题2、msp430g2553的TIMER0和TIMER1功能完全是一样的,可以参照TIMER0的例程来配置timer1