msp430F5438A串口波特率问题

2019-03-24 09:38发布

本帖最后由 menghubei 于 2015-10-9 15:08 编辑

XT2晶振使用25M,使用正常。
串口使用UCA3,波特率使用115200,程序功能:串口收到数据后直接返回数据。
UCA3BR = 25m/115200/16=13.56;
UCARF = 0.56*16=9;

出现的问题:PC端串口助手使用115200波特率是接收到乱码,使用76800没有问题,收发正常,怀疑是波特率设置的问题。
源代码如下:

//*********************************************************************************************
//主系统时钟设置
P5SEL  |= BIT2 + BIT3;                    // Port select XT2
    PMMCTL0=PMMPW+PMMCOREV_3;
    UCSCTL6 &= ~XT2OFF;                       // Enable XT2
    //UCSCTL6 |= XT2DRIVE_3;               //晶振电流最大,达到24M~32MHz
    UCSCTL3 |= SELREF_2;                      // FLLref = REFO
    UCSCTL4 |= SELA__REFOCLK;                 // ACLK=REFO(32.768kHz),SMCLK=DCO,MCLK=DCO
    do
    {                                         // Clear XT2,XT1,DCO fault flags                                             
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);                                                   
        SFRIFG1 &= ~OFIFG;                    // Clear fault flags
    }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

    UCSCTL6 &= ~(XT2DRIVE0 + XT2DRIVE1);      // Decrease XT2 Drive according to expected frequency                                             
    UCSCTL6 |= XT2DRIVE_3;                    // XT2 Drive Level mode: 2, XT2: 16MHz~24MHz                     
    UCSCTL4 |= SELS_5 + SELM_5;               // SMCLK=MCLK=XT2  


    //串口设置
     UCA3CTL1 |= UCSWRST;
     UCA3CTL1 |= UCSSEL_3;        //选择smclk为时钟源
     UCA3BR1 = 13;
     UCA3BR0 = 0;
     UCA3MCTL = UCBRS_0 + UCBRF_9 + UCOS16;
     P10SEL |= BIT4 + BIT5;
     P10DIR =0x10;
     UCA3CTL1 &= ~UCSWRST;
     UCA3IE |= UCRXIE;
     _EINT();


//*********************************************************************************************

各位又遇到这种问题没
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
menghubei
1楼-- · 2019-03-26 06:31
Triton.zhang 发表于 2015-10-10 14:13
1. 发送0XAA或0X55, 用示波器抓一个串口的波形,然后看高低电平时间得到实际的波特率。
2. 反过来看是那 ...

恩,又学到一招经验。
bobde163
2楼-- · 2019-03-26 10:29
menghubei 发表于 2015-10-11 10:45
最原始的代码都被我改了,发送的代码是:

while(1)
{
    UCA3TXBUF = 'A';
}

//////////////// ...

你在发送的时候,不用检测发送寄存器是否为空就一直往里写数据?单片机最高支持25M的晶振,那应该是没有问题的,你有仔细检查过串口这部分的配置代码没有?
menghubei
3楼-- · 2019-03-26 13:25
 精彩回答 2  元偷偷看……
bobde163
4楼-- · 2019-03-26 15:57
menghubei 发表于 2015-10-11 11:04
while (!(UCA3IFG&UCTXIFG));        
这段代码是加了的,回帖的时候忘了。

检查了的,同样的代码我 ...

同样使用25M,9600的波特率没有问题,那往高了的波特率的不行的话,那还是分频分得不对,你再试试
deletegu
5楼-- · 2019-03-26 21:31
楼主的问题我也遇到过,5438A跑25M,出现的问题是程序死在延时函数里,搞了很久,找不到原因,最后把时钟降下来就好了
menghubei
6楼-- · 2019-03-27 01:42
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章