单片机 MSP430 串口 计算 波特率

单片机 专栏收录该内容
92 篇文章 5 订阅

软件计算波特率地址:http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html

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

假如选择时钟1MHZ,想设置9600波特率,那么
N = fBRCLK/Baudrate=1MHZ/9600=104.16666666666666
如果N大于16,那么就建议设置过采样模式(setting UCOS16=1)。

如果不设置的时候 (UCOS16=0)
那么:
UCBRx = INT(N) -> integer part of N
UCBRSx = round((N - INT(N))*8) -> integer rounding of fractional part of N times 8
也就是UCBRx 等于N的整数部分。
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

如果设置的时候(UCOS16=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
也就是UCBRx 等于N除以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

有(UCOS16=1)后,UCBRFx才有效,而且此时UCBRSx 就无效了。
还有一点是 round 函数四舍五入比较随意。



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
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:酷酷鲨 设计师:CSDN官方博客 返回首页

打赏作者

Q742971636

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值