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.

用msp430f149做串口实验,发现每个位的时间不同



做串口实验,把串口接到PC的仿真终端,在程序中把从PC收到的字符发送给PC,实验不成功,于是,修改程序,不断从串口用 TXBUF0=0XAA 发送字符(二进制10101010),用示波器测量tx端波形,如图,发现各个位的宽度不同,有的位约120us,有的位90us,图中的第2、第5位特别宽,是什么原因呢?

程序代码如下:

#include <MSP430x14x.h>

#define USART_DIR P3DIR
#define USART_SEL P3SEL
#define USART_IN  P3IN
#define USART_OUT P3OUT
#define UTXD0 BIT4
#define URXD0 BIT5

void InitSys();                                                         //初始化

int main( void )
{
        unsigned char q0;
        unsigned char *pq0;
          WDTCTL = WDTPW + WDTHOLD;                   //关闭看门狗
          InitSys();        
start:
        {
                  while((IFG1&UTXIFG0)==0);        //查询是否发送完毕
                TXBUF0=0xaa;
        }
        goto start;
}

void UartInit()
{
        USART_SEL |= UTXD0 +URXD0;    //设置管脚为第二功能
        UCTL0 = CHAR+PENA+SWRST;      //8位数据,1位停止位,奇校验
        UTCTL0 = SSEL0;               //选择UCLK = ACLK
        UBR00 = 0x3;                  //设置波特率9600bit/s
        UBR10 = 0;
        UMCTL0 = 0x4a;
        UCTL0 &= ~SWRST;
        ME1 |= UTXE0 + URXE0;              //打开模块USART0
//        IE1 |= URXIE0 ;                        //打开USART0接收中断
}

/*****************************************************************************
系统初始化
******************************************************************************/
void InitSys()
{
   unsigned int iq0;

   BCSCTL1&=~XT2OFF;                                                     //打开XT2振荡器
   do
   {
                IFG1 &= ~OFIFG;                                                        // 清除振荡器失效标志
                for (iq0 = 0xFF; iq0 > 0; iq0--);        // 延时,等待XT2起振
        }
        while ((IFG1 & OFIFG) != 0);                                // 判断XT2是否起振

        BCSCTL2 =SELM_2;                                                                //选择MCLK为XT2

        UartInit();                                                                                //初始化USART0
        _EINT();                        //打开全局中断控制,若不需要打开,可以屏蔽本句
}