我是初学者,一边看数据手册一边写程序,之前用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; } }}
此帖出自
小平头技术问答
谢谢啊……
一周热门 更多>