有这些寄存器:
波特率生成器,依靠分频器( prescaler/divider)和一个调制器(modulator)。
设选了8MHZ的SMCLK时钟源作为时钟,想设置9600波特率,那么divider值为:
UCA0BR1是高八位,UCA0BR0 是低八位。
833.3333333333(dec)除去了小数得到二进制表示,直接给UCA0BR1和UCA0BR0 组合的divider即可完成波特率配置。
当N大于等于16,可以使用UCOS16来设置为oversampling baud rate generation mode。
调制器,用于尽可能接近小数部分。
手册里还有各种各样复杂的问题和解决方法。给出了一个参考配置表,很有价值,免得自己瞎算和调试。
参考配置表:
参考代码:
// MSP430G2xx3
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P1.2/UCA0TXD|------------>
// | | 9600 - 8N1
// | P1.1/UCA0RXD|<------------
#define CPU_F ( (double) 8000000)
#define delay_us( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )
/* 串口波特率计算,当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数 */
#define baud 9600 /* 设置波特率的大小 */
#define baud_setting (uint) ( (ulong) CPU_F / ( (ulong) baud) ) /* 波特率计算公式 */
#define baud_h (uchar) (baud_setting >> 8) /* 提取高位 */
#define baud_l (uchar) (baud_setting) /* 低位 */
void initUSART(void)
{
P1SEL = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = baud_l; // 8MHz 9600
UCA0BR1 = baud_h; // 8MHz 9600
UCA0MCTL = UCBRS1; // Modulation UCBRSx 2=010= UCBRS2 UCBRS1 UCBRS0
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
}