做串口实验,把串口接到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(); //打开全局中断控制,若不需要打开,可以屏蔽本句
}
