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.

MSP430F5438A波特率设置



选用ACLK为32768Khz,波特率为9600,UCA0BR0 = 3;  UCA0BR1 = 0;   UCA0MCTL=0x4A这个0X4A怎么得到的?

  • 这个如果要说完整的话就有点复杂了,这里可以简单来讲下:

    对于一个串口通信来讲,我们一般关心的是波特率,也就是每个BIT的传输速率,具体到波形我们看的是一个有效位的时间,我们可以把它叫做BITCLK。

    应为UART是异步通信,也就是说通信的双方是没有同步时钟传输的,接受一方只能自己产生一个时钟去检测这个有效的BIT,但由于系统之间的时钟误差,接受一方的系统是不可能完全和发射一方的BITCLK同相或同频的。那么就只有用一个高于BITCLK的时钟,我们叫它为BRCLK去采样UART的传输数据BIT。由于相位和时间的误差,我们不可能在一个完整的BITCLK采样到完整的数据,所以UART口就采用了用多数电平判断的机制。比如采样7次取4次或上的多数电平,或者采样5次取3次多数电平。

    为了节约功耗,MSP430允许用32768的晶体为UART提供时钟源,也就是说BRCLK的最大频率就只能是32K了,这个时候的通信波特率不能高于32K的1/3。换句话说一个BITCLK器件,BRCLK要采样3次,取其中两次的值为准。

    那么我们如何用32K产生9600的波特率呢?

    32K/9600得到的不是整数,MSP430为了提高BRCLK的采样精度,增加了UCA0MCTL这个寄存器来调节BRCLK的采样,具体做法就是在一个BITCLK期间通过增加或者减少32K的一个时钟来尽量靠近9600波特率的采样时间。

    UCA0MCTL 寄存器的最低位OCOS16为0用来指示采用低频的32K作为时钟源。高4-7位UCBRFx用来对高频的晶体模式下的BRCLK调节,1-3位UCBRSx用来对低频模式下的BRCLK调节。在本案中:UCA0MCTL = 0X4A,OCOS16为0,高4位可以忽略,UCBRSX=5;

    其中UCBRSX是这样计算出来的:

    UCBRSx=round[(N-INT(N)×8]

    其中:N=fBRCLK/Baudrate

    在本案中:

    N= 32768/9600 = 3.413

    UCBRSX=ROUND[ (3.413-3)*8] = 3

    所以本案中的UCA0MCTL=0x4A是错的,理论上应该是UCA0MCTL = 0X06;

     

     

  •  你好,首先 UCA0MCTL寄存器的定义为:

    然后,根据下图配置:

    按照你的要求设置应该是这样的:

    UCA0BR0 = 0x03; // 32kHz/9600=3.41 (see User's Guide)
    UCA0BR1 = 0x00; //
    UCA0MCTL = UCBRS_3+UCBRF_0; // Modulation UCBRSx=3, UCBRFx=0

    不知你的0x4A是怎么来的?