单片机 MSP430G2553 串口 计算 波特率

用户手册链接

有这些寄存器:
在这里插入图片描述

波特率生成器,依靠分频器( prescaler/divider)和一个调制器(modulator)。

设选了8MHZ的SMCLK时钟源作为时钟,想设置9600波特率,那么divider值为:
N = B R C L K B a u d R a t e = 8 M H Z 9600 = 833.3333333333 ( d e c ) = 001101000001 ( b i n ) N=\frac{B R C L K}{B a u d R a t e}=\frac{8MHZ}{9600}=833.3333333333(dec)=‭001101000001‬(bin)
UCA0BR1是高八位,UCA0BR0 是低八位。
833.3333333333(dec)除去了小数得到二进制表示,直接给UCA0BR1和UCA0BR0 组合的divider即可完成波特率配置。
当N大于等于16,可以使用UCOS16来设置为oversampling baud rate generation mode。
调制器,用于尽可能接近小数部分。
手册里还有各种各样复杂的问题和解决方法。给出了一个参考配置表,很有价值,免得自己瞎算和调试。
在这里插入图片描述

参考配置表:

Table 15-4. Commonly Used Baud Rates, Settings, and Errors, UCOS16 = 0
在这里插入图片描述
在这里插入图片描述

参考代码:

在这里插入图片描述
在这里插入图片描述

//                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
}
发布了105 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/104534313