# 单片机 MSP430 串口 计算 波特率

92 篇文章 5 订阅

MSP430怎么计算波特率在各手册都有提到，但始终不清楚，直到看了官网的一篇文章：
https://processors.wiki.ti.com/index.php/USCI_UART_Baud_Rate_Gen_Mode_Selection

N = fBRCLK/Baudrate=1MHZ/9600=104.16666666666666

UCBRx = INT(N) -> integer part of N
UCBRSx = round((N - INT(N))*8) -> integer rounding of fractional part of N times 8

UCBRSx 寄存器就等于N的小叔部分乘以0后取整数部分。

For fBRCLK=1MHz, BR=9600: N=1000000/9600 = 104.16666667
UCBRx = INT(N) = 104
UCBRSx = round (0.16666667 * 8) = round (1.33333333) = 1

UCBRx = INT(N/16) -> integer part of N divided by 16
UCBRFx = round(((N/16) - INT(N/16))*16) -> integer rounding of fractional part of N divided by 16 times 16

UCBRFx 寄存器==（UCBRx 等于N除以16后的小数部分）乘以16后再取整数部分。

For fBRCLK=4MHz, BR=9600: N/16=4000000/9600/16 = 26.041666666
UCBRx = INT(N/16) = 26
UCBRFx = round (0.041666666 * 16) = round (0.66666666666666666666666666666667) = 1

The formulas for calculating USCI UART Baud Rate Register Values are basically available in the Family User’s Guide document.

For calculating all the formula, it requires the division factor N:

N = fBRCLK/Baudrate

Where fBRCLK is basically the input clock frequency of the USCI module as shown in the USCI block diagram as follows:

If N >= 16, it is possible to enable the oversampling mode (setting UCOS16=1).

# Low Frequency Baud-Rate Mode Setting (UCOS16=0)

In Low Frequency Baud-Rate Mode Setting, the baud rate prescaler register UCBRx and the fractional portion modulator UCBRSx can be calculated as follows:

UCBRx = INT(N) -> integer part of N

*UCBRSx = round((N - INT(N))8) -> integer rounding of fractional part of N times 8

Comparing it to the Baud Rate Setting Register Table provided in the User Guide document tidoc:slau208m Table 34-4. “Commonly Used Baud Rates, Settings, and Errors, UCOS16 = 0”-

For fBRCLK=1MHz, BR=9600: N=1000000/9600 = 104.16666667
UCBRx = INT(N) = 104
UCBRSx = round (0.16666667 * 8) = round (1.33333333) = 1
For fBRCLK=1MHz, BR=19200: N=1000000/19200 = 51,020408163265306122448979591837
UCBRx = INT(N) = 51
UCBRSx = round (0,020408163265306122448979591837 * 8) = round (0,16326530612244897959183673469388) = 0
For fBRCLK=1MHz, BR=38400: N=1000000/38400 = 26,041666666666666666666666666667
UCBRx = INT(N) = 26
UCBRSx = round (0,041666666666666666666666666667 * 8) = round (0,33333333333333333333333333333333) = 0
For fBRCLK=1MHz, BR=57600: N=1000000/57600 = 17,361111111111111111111111111111
UCBRx = INT(N) = 17
UCBRSx = round (0,361111111111111111111111111111 * 8) = round (2,8888888888888888888888888888889) = 3
For fBRCLK=1MHz, BR=115200: N=1000000/115200 = 8,6805555555555555555555555555556
UCBRx = INT(N) = 8
UCBRSx = round (0,6805555555555555555555555555556 * 8) = round (5,4444444444444444444444444444444) = 6

# Oversampling Baud-Rate Mode Setting (UCOS16=1)

In Oversampling Mode Setting, the baud rate prescaler register UCBRx and the first stange modulator register UCBRFx can be calculated as follows:

UCBRx = INT(N/16) -> integer part of N divided by 16

*UCBRFx = round(((N/16) - INT(N/16))16) -> integer rounding of fractional part of N divided by 16 times 16

Comparing it to the Baud Rate Setting Register Table provided in the User Guide document tidoc:slau208m Table 34-5. “Commonly Used Baud Rates, Settings, and Errors, UCOS16 = 1”.

For fBRCLK=4MHz, BR=9600: N/16=4000000/9600/16 = 26,041666666666666666666666666667
UCBRx = INT(N/16) = 26
UCBRFx = round (0,041666666666666666666666666667 * 16) = round (0,66666666666666666666666666666667) = 1
For fBRCLK=4MHz, BR=19200: N/16=4000000/19200/16 = 13,020833333333333333333333333333
UCBRx = INT(N/16) = 13
UCBRFx = round (0,020833333333333333333333333333 * 16) = round (0,33333333333333333333333333333333) = 0
For fBRCLK=4MHz, BR=38400: N/16=4000000/38400/16 = 6,5104166666666666666666666666667
UCBRx = INT(N/16) = 6
UCBRFx = round (0,5104166666666666666666666666667 * 16) = round (8,1666666666666666666666666666667) = 8

# 参考代码：

//                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
}

• 0
点赞
• 0
评论
• 4
收藏
• 打赏
• 扫一扫，分享海报

01-13 1895

05-29 2137
07-27 4440
12-10 9165
02-19 1260
05-01
08-06
03-15
03-02
03-01
02-06

Q742971636

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。