请教USART 与PC机通信

nillht   2009-4-4 16:03 楼主
/*****************************************************************************\
文件名: main.c
描述;用于MSP430F149。
异步通讯。


版本:4.20.1 sun_seven
\*****************************************************************************/

#include <MSP430x14x.h>

#define USART_DIR P3DIR
#define USART_SEL P3SEL
#define UTXD0 BIT4
#define URXD0 BIT5

const unsigned char Data[6]="HELLO";
void InitSys(); //初始化
void UartInit();

int main( void )
{

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
InitSys(); //初
LPM3;
for(;;)
{
while((IFG1 & UTXIFG0)==0);
TXBUF0=RXBUF0;
_NOP();
}
}
/*****************************************************************************
系统初始化
******************************************************************************/
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(); //打开全局中断控制,若不需要打开,可以屏蔽本句

}
/*****************************************************************************
USART0初始化
******************************************************************************/

void UartInit()
{
USART_SEL |= UTXD0 +URXD0; //设置p3.4/p3.5管脚为第二功能
USART_DIR |= UTXD0; //设置p3.4输出管脚
UCTL0 = CHAR+MM+SWRST; //8位数据,1位停止位,地址位多机协议
//U0RCTL |= URXWIE; //只有地址字符使URXIFG置位
UTCTL0 = SSEL0; // 选择UCLK为ACLK
UBR00 = 0x3; //设置波特率9600bit/s
UBR10 = 0;
UMCTL0 = 0x4A;
UCTL0 &= ~SWRST;
ME1 |= UTXE0 + URXE0; //打开模块USART0
IE1 |= URXIE0 ; //打开USART0接收中断
}

/*****************************************************************************
USART0接收中断函数
******************************************************************************/
#pragma vector=USART0RX_VECTOR
__interrupt void Usart0Rx()
{
LPM3_EXIT;
}

其中上文红色部分调试不过去,我查看寄存器发现UTXIFG0默认值为0,这个在用户手册上默认应该为1,不知道为什么?难道是版本问题?不仅如此其他寄存器默认该我1的,好像在我的IAR中都是0, 请高手指教。

回复评论 (10)

哪位大侠能够提点一二,小弟感激不尽!
点赞  2009-4-6 10:39
for(t0=0;t0<10;t0++)
{
TXBUF0 = t0_buffer[t0] ;//数据送发送缓冲
WDTCTL = 0x5a0C; //清看门狗
while ((IFG1&UTXIFG0)==0);
}
点赞  2009-4-6 19:44
你把while((IFG1 & UTXIFG0)==0);
TXBUF0=RXBUF0;
放到接受中断里,然后把推出低功耗去掉 试下
点赞  2009-4-6 20:20

cao456

引用:

for(t0=0;t0<10;t0++)
{
TXBUF0 = t0_buffer[t0] ;//数据送发送缓冲
WDTCTL = 0x5a0C; //清看门狗
while ((IFG1&UTXIFG0)==0);
...
换了以后发现在DEBUG下还是执行到while ((IFG1&UTXIFG0)==0);就执行不过去,中断标志位
UTXIFG0一直为0状态,我在手册上这位默认应该是1,或者没有数据的时候也应该是1啊,太奇怪了!
点赞  2009-4-6 21:33
引用:

你把while((IFG1 & UTXIFG0)==0);
TXBUF0=RXBUF0;
放到接受中断里,然后把推出低功耗去掉 试下
您说的情况也是一样,执行到while((IFG1 & UTXIFG0)==0);就跳不出while循环,一直为真。
点赞  2009-4-6 21:36
我现在不明白的是在仿真DEBUG情况下,寄存器的值有些默认为1的,在我workbench 4.20.1 版本中全部都是0,我糊涂了?
点赞  2009-4-6 21:39
问题已解决了~ 发现到硬件环境下就成功了。
点赞  2009-4-7 16:08
软件仿真?!窝晕……
点赞  2009-4-8 16:01
引用:

软件仿真?!窝晕……
呵呵,还处在菜鸟级别,请原谅啊!
点赞  2009-4-8 18:54
费心了!
点赞  2009-4-9 10:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复