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