CC430F1537 串口设置
我有一个项目采用的是CC430F1537的芯片,外面XT2接了26MHz的晶振,XT1还接了32.768KHz的晶振;我设置MCLK=XT2=26MHZ,SMCLK=DCO=1MHz,ACLK=XT1=32.768KHz;其中Uart通讯使用4800bps的波特率,而波特率设置是可以选择CLK,我看有UCA0CTL1四种选择:00:UCAxCLK (external USCI clock)
01:ACLK
10:SMCLK
11:SMCLK
我选择01/10/11的ACLK和SMCLK测试都是可以通过的,但是,由于通讯比较严格,标准的波特率要求误差在 正负2%以内,而选用ACLK大大超过了,而用SMCL内部的DCO,则标称就是正负3%,还要考虑Uart本身的误差。所以我瞄准了那个UCAxCLK,不知道这个外部clock是什么?是不是就是XT2呢?但我测试Uart没有反应,求哪位大虾指点一下! 我也想买CC430来玩一下,LZ能不能介绍一下在哪里买的不? 现在我们还只买了利尔达的开发板在试验,msp430的datasheet写得很糟糕,远不如AVR的写的详细并且没有什么遗漏。 顺便看看我的其它设置:
#if0// 如果强制当成MCLK来测试,则Uart没有反应
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_0; // CLK = UCAxCLK
UCA0BR0 = 0x52; // 26MHz 4800
UCA0BR1 = 0x01; //
UCA0MCTL = UCBRS_0 + UCBRF_8 + UCOS16; // Modulation UCBRSx=6, UCBRFx=0
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
#elif0// OK
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
UCA0BR0 = 0x06; // 32768/4800=6.82 (see User's Guide)
UCA0BR1 = 0x00; //
UCA0MCTL = UCBRS_7 + UCBRF_0; // Modulation UCBRSx=6, UCBRFx=0
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
#elif1// OK
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 13; // 1MHz 4800 (see User's Guide)
UCA0BR1 = 0; // 1MHz 4800
UCA0MCTL = UCBRS_0 + UCBRF_0 + UCOS16; // Modln UCBRSx=0, UCBRFx=0,
// over sampling
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
#else// OK
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_3; // SMCLK
UCA0BR0 = 0xD0; // 1MHz 4800 (see User's Guide)
UCA0BR1 = 0x00; // 1MHz 4800
UCA0MCTL = UCBRS_3 + UCBRF_0; // Modln UCBRSx=3, UCBRFx=0,
// over sampling
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
#endif 看了技术手册,UCAxCLK是需要外部输入的,UCA0CLK是第1脚,UCA0CLK是第14脚.
DCO可以设置的(1M-20M),而且设置比较准的,网站上有例程可以看看.
这个程序可以参考一下
/*
设置DCO函数
in:无
out:无
*/
void Set_DCO (void) // Set DCO to selected frequency
{
#define DELTA 977 // target DCO= DELTA*(4096) = 4Mhz
//#define DELTA 900 // target DCO = DELTA*(4096) = 3686400
//#define DELTA 256 // target DCO = DELTA*(4096) = 1048576
//#define DELTA 70 // target DCO = DELTA*(4096) = 286720
unsigned int Compare, Oldcapture = 0;
BCSCTL1 |= DIVA_3; // ACLK= LFXT1CLK/8
CCTL2 = CM_1 + CCIS_1 + CAP; // CAP, ACLK
TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear
while (1)
{
while (!(CCIFG & CCTL2)); // Wait until capture occured
CCTL2 &= ~CCIFG; // Capture occured, clear flag
Compare = CCR2; // Get current captured SMCLK
Compare = Compare - Oldcapture; // SMCLK difference
Oldcapture = CCR2; // Save current captured SMCLK
if (DELTA == Compare) break; // If equal, leave "while(1)"
else if (DELTA < Compare) // DCO is too fast, slow it down
{
DCOCTL--;
if (DCOCTL == 0xFF)
{
if (!(BCSCTL1 == (XT2OFF + DIVA_3)))
BCSCTL1--; // Did DCO roll under?, Sel lower RSEL
}
}
else
{
DCOCTL++;
if (DCOCTL == 0x00)
{
if (!(BCSCTL1 == (XT2OFF + DIVA_3 + 0x07)))
BCSCTL1++; // Did DCO roll over? Sel higher RSEL
}
}
}
CCTL2 = 0; // Stop CCR2
TACTL = 0; // Stop Timer_A
} 多谢楼上!
其实你看我其它设置,测试都是可以通过的,只是从理论来计算,32.768KHz的那个晶振由于clock本身频率比较小,误差比较大,而如果用DCO的话,理论上标称就是正负3%,而在工控中Uart的误差要在正负2%以内。
好了,看来真的是需要一个外部clock,我死心了 :( 本着对别人和自己负责的有始有终的原则,说说现在的更新或者状态:
msp430的Uart 源有以下几种:
00:UCAxCLK (external USCI clock) -->真的是有引脚从外部输入
01:ACLK
10:SMCLK
11:SMCLK
我现在的做法是:让SMCK也跑XT2的26MHz,然后再计算,结果非常精准。 回复【1楼】my_avr
-----------------------------------------------------------------------
同学送我的小系统板是利尔达的,仿真器很小,一套好像也挺便宜,你可以去他们网站上看看
页:
[1]