4105|1

42

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

MSP430F149串口上电不能发送字符 [复制链接]

我是初学者,一边看数据手册一边写程序,之前用BCS  定时器都好好的,现在用到串口了,结果出问题了。。。。
主程序中初始化基本时钟系统,初始化串口,初始化P3端口,进入while(1)循环,循环中用查询方式,把板子接收到的字符再发送给超级终端显示。

这样的时候很正常,用超级终端发一个字符,就会回显一个字符,之后我在初始化之后,while循环之前加了一段语句,用来先往超级终端发一个字符‘0’即0x30,这就有问题了,每次上电超级终端都收不到字符。。。但是板子上的二极管会闪一下,说明板子确实是发送出去字符了,而且程序也是在执行while循环的,因为这时用超级终端给板子发一个字符时,超级终端上就有回显(我已经关闭了超级终端自带的回显功能),所以说那段发送程序肯定是已经执行过了,只是超级终端没有接受到。。。。。
但是当板子接收到一次超级终端发来的字符之后,如果把调试关系,再下载(保证板子不断电),或者给板子复位,那么那个字符‘0’就会显示在超级终端上,但是如果是给板子断电然后上电,就不行。。。
这是为什么啊。。。。。。。
/********************************************************************
//DM430-L型最小系统板串口测试程序,使用单片机的串口0
//通过电脑与串口线连接开发板串口座,使用串口调试助手发送数据到系统板
//系统板会将收到的数据再发送到串口调试助手,接收采用中断模块,发送用查询
//板载的BSL模块可以通过跳线帽设置为USB转串口模式,笔记本电脑没有串口可以直接代替
//开发板的BSL_Config区的RXD和TXD0连接,TXD和RXD0连接即可
//调试环境:EW430 V5.30
//作者:阿迪 www.avrgcc.com
//时间:2011.09.19
********************************************************************/

#include <msp430x14x.h>

#define CPU_F ((double)8000000) 
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

/*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/
#define baud           9600                                //设置波特率的大小
#define baud_setting   (uint)((ulong)CPU_F/((ulong)baud))  //波特率计算公式
#define baud_h         (uchar)(baud_setting>>8)            //提取高位
#define baud_l         (uchar)(baud_setting)               //低位



//*************************************************************************
//                    系统时钟初始化
//*************************************************************************
void Clock_Init()
{
  uchar i;
  BCSCTL1&=~XT2OFF;                 //打开XT振荡器
  BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
  do{
    IFG1&=~OFIFG;                   //清除震荡标志
    for(i=0;i<100;i++) ;//延时等待
  }
  while((IFG1&OFIFG)!=0);           //如果标志为1,则继续循环等待
  IFG1&=~OFIFG; 
}


//*************************************************************************
//               MSP430串口初始化
//*************************************************************************
void UART_Init()
{
  U0CTL|=CHAR;                //8位数据模式 
  U0TCTL|=0x30;//SSEL1;              //SMCLK为串口时钟
  
  U0BR1=baud_h;               //BRCLK=8MHZ,Baud=BRCLK/N
  U0BR0=baud_l;               //N=UBR+(UxMCTL)/8
  U0MCTL=0x00;                //微调寄存器为0,波特率9600bps
  ME1|=UTXE0;                 //UART1发送使能
  ME1|=URXE0;                 //UART1接收使能
  U0CTL&=~SWRST;
 // IE1|=URXIE0;                //接收中断使能位
  //IE1|=UTXIE0;
  P3SEL|= BIT4;               //设置IO口为普通I/O模式
  P3DIR|= BIT4;               //设置IO口方向为输出
  P3SEL|= BIT5;
}
//*************************************************************************
//           主函数
//*************************************************************************
void main(void)
  WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗 
  Clock_Init();                       //系统时钟设置
  UART_Init();                        //串口设置初始化
  _EINT(); 
  delay_ms(1000);
  
  U0TXBUF = 0X39;//发送9
  while((U0TCTL & 0X01)==0);
  IFG1 &= ~UTXIFG0;
  
  U0TXBUF = 0X36;//发送6
  while((IFG1 & UTXIFG0)==0);
  IFG1 &= ~UTXIFG0;
  
  while(1)                            //无限循环
   {
     if ((IFG1 & URXIFG0)) //查询方式 是否接收到字符
     { 
       IFG1 &= ~URXIFG0;
       U0TXBUF = U0RXBUF;
       while(!(IFG1 & UTXIFG0));
       IFG1 &= ~UTXIFG0;
     }
   }
}
 
点赞 关注

回复
举报

42

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
大家没有人遇到过这个问题吗???
刚才又调来调去的,还是不行啊,必须要电脑先给板子发一个字符才行啊。。。
这个是不是板子的波特率设置有问题啊??导致自己不能和电脑的进行匹配,有没有高手指点一下啊。。。

谢谢啊……
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表