单片机
返回首页

单片机 MSP430 串口 计算 波特率

2021-01-10 来源:eefocus

软件计算波特率地址: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

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

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章