This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430FR5739串口波特率设置错误为什么还能运行正常?

Other Parts Discussed in Thread: MSP430FR5739

请问为什么下面波特率设置错误,串口通信还能跑得很正常,谢谢
int main()
{
    WDTCTL = WDTPW+WDTHOLD;
    // Init the device with 24MHz DCOCLCK.
    //InitClk
    CSCTL0_H = 0xA5;
    CSCTL1 |= DCORSEL + DCOFSEL0 + DCOFSEL1;	 // Set max. DCO setting
    CSCTL2 = SELA_1 + SELS_3 + SELM_3;		// set ACLK - VLO, the rest  = MCLK = DCO
    CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0;		// set all dividers to 0


    //InitUart
    P2SEL1 |= BIT0 + BIT1;
    P2SEL0 &= ~(BIT0 + BIT1);
    // Configure UART 0
    UCA0CTL1 |= UCSWRST; 
    UCA0CTL1 = UCSSEL_2;                      // Set SMCLK as UCLk 
    UCA0BR0 = 156 ;                              // 9600 baud
    // 8000000/(9600*16) - INT(8000000/(9600*16))=0.083
    UCA0BR1 = 0; 
    // UCBRFx = 1, UCBRSx = 0x49, UCOS16 = 1 (Refer User Guide)
    UCA0MCTLW = 0x4911 ;                      
    UCA0IE |= UCRXIE;                         // Enable RX interrupt
    UCA0CTL1 &= ~UCSWRST; 
    __bis_SR_register(GIE);
    while(1)
    {
    }
}

  • 你好,

    可以把你的问题点标注出来,我们看起来会省事一些:

    1.串口波特率设置都9600?

    2.你故意把哪里设置错了,和参考例程相比那些语句不同?

    3.你说串口通讯正常是你发送固定某一个数据还是测试了多种数据,有图说明接收的数据是正确的吗?

  • 你好,问题是这样的,这段程序是TI的参考例程,我根据用户手册设置波特率,感觉程序中的这段代码设置波特率9600不正确

    UCA0BR0 = 156 ;                              // 9600 baud
        // 8000000/(9600*16) - INT(8000000/(9600*16))=0.083
    UCA0BR1 = 0; 
        // UCBRFx = 1, UCBRSx = 0x49, UCOS16 = 1 (Refer User Guide)
    UCA0MCTLW = 0x4911 ;

    根据用户手册计算的话,这里参考例程是用SMCLK=24MHz作为外部时钟,如果UCA0BR0=156是对的,但是UCA0MCTLW的值不是这么设置的,如果按照例程中的值设置的话,那外部时钟就是8MHz,但是我也没有给时钟进行分频,这是为什么?谢谢

  • 楼主,

        你的理解应该是有道理的,UCA0MCTLW寄存器在24MHz的条件下跑9600应该不是设置为0x4911,应该是0x0001(如果我每算错的话)。两种设置的主要区别是在于UCBRFx和UCBRSx。

        但是因为你跑的波特率并不快,且使用了16倍过采样,在波特率不是很准的情况下提高了稳定性,所以即使UCBRFx和UCBRSx不是很准确,只要UCA0BRn设置好了,在一些条件下(比如慢速的波特率下)也是可以正常运行的。

  • 您好,

        那我应该如何设置正确的值才能够获得正确的波特率,并且能够准确的进行数据传输呢?

    谢谢

  • 楼主,

        波特率的设置除了BR0和BR1之外 UCA0MCTLW寄存器值的UCBRFx和UCBRSx的设置也会影响到波特率的准确性。其实在用户手册中的波特率产生那一节有比较详细的描述了波特率是怎么产生的,相信楼主也读过它了,所以就根据那一节的公式和描述,设置好BR0,BR1,UCBRFx和UCBRSx就可以比较准确的获得波特率。

  • 您好,我最近也在学习写UART这一部分的代码,请问跟那里找到参考例程呢?接受数据应该怎么写呢?有参考的嘛?谢谢。

  • 你好,

    附件是参考资料,你可以把以前的基于MSP430Fxx的平台切换到FRAM平台的实施方式。

    另外附件是430WARE软件包关于MSP430FR5739的代码,里面有串口的程序

    希望对你有帮助。