专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
MSP430g2553Launchpad中的USCI的UART模式,求助
2019-03-24 10:29
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
7605
1
995
用LaunchPad指导书中的USCI的UART模式中的程序进行人机交互,发现总是光有接收没有回复,没有办法控制单片机的P1.0,P1.6LED的亮灭,这是怎么回事啊?
#include "MSP430G2553.h"
#define LED1_ON P1DIR|=BIT0; P1OUT|=BIT0
#define LED1_OFF P1DIR|=BIT0; P1OUT&=~BIT0
#define LED2_ON P1DIR|=BIT6; P1OUT|=BIT6
#define LED2_OFF P1DIR|=BIT6; P1OUT&=~BIT6
#define RX_FIFO_SIZE 16 //接收缓冲区大小宏定义
#define TX_FIFO_SIZE 64 //发送缓冲区大小宏定义
unsigned char Rx_FIFO[RX_FIFO_SIZE]={0}; //UART接收FIFO数组
unsigned int Rx_FIFO_DataNum=0; //UART接收FIFO的“空满”指示变量
unsigned int Rx_FIFO_IndexR=0; //UART接收FIFO的模拟“读指针”变量
unsigned int Rx_FIFO_IndexW=0; //UART接收FIFO的模拟“写指针”变量
unsigned char Tx_FIFO[TX_FIFO_SIZE]={0}; //UART发送FIFO数组
unsigned int Tx_FIFO_DataNum=0; //UART发送FIFO的“空满”指示变量
unsigned int Tx_FIFO_IndexR=0; //UART发送FIFO的模拟“读指针”变量
unsigned int Tx_FIFO_IndexW=0; //UART 发送FIFO 的模拟“写指针”变量
extern unsigned char Rx_FIFO[RX_FIFO_SIZE];
extern unsigned int Rx_FIFO_DataNum;
extern unsigned int Rx_FIFO_IndexR;
extern unsigned int Rx_FIFO_IndexW;
extern unsigned char Tx_FIFO[TX_FIFO_SIZE];
extern unsigned int Tx_FIFO_DataNum;
extern unsigned int Tx_FIFO_IndexR;
extern unsigned int Tx_FIFO_IndexW;
const unsigned char Out_DELETE[]= "x8 x8"; /* VT100 backspace and clear */
const unsigned char String1[]="命令:LED1_ON LED1_OFF LED2_ON LED2_OFF ";
const unsigned char String2[]="Please input Command: ";
const unsigned char String3[]="Are you crazy? ";
const unsigned char String4[]="I was born for these! ";
const unsigned char String5[]="I have got it! ";
const unsigned char String6[]="It is easy for me! ";
const unsigned char String7[]="As your wish! ";
void UART_OnTx(void);
void UART_OnRx(void);
void UART_SendString(const unsigned char *Ptr);
void Command_match();
/******************************************************************************************************
* 名 称:Rx_FIFO_WriteChar()
* 功 能:往Rx接收FIFO中写1字节
* 入口参数:Data:待写入FIFO的数据
* 出口参数:1:写入数据成功,0 :写入数据失败
* 说 明:操作FIFO时需要关闭总中断
* 范 例:无
******************************************************************************************************/
char Rx_FIFO_WriteChar(unsigned char Data)
{
if(Rx_FIFO_DataNum==RX_FIFO_SIZE) return(0);
//判断FIFO是否已装满未读数据,如果装满返回0
_DINT(); //操作FIFO前一定要关总中断
Rx_FIFO_DataNum++; //未读取数据个数加一
Rx_FIFO[Rx_FIFO_IndexW]=Data; //将数据写入写读指针位置的FIFO数组
Rx_FIFO_IndexW++; //写指针移位
if (Rx_FIFO_IndexW>=RX_FIFO_SIZE) //判断指针是否越界
Rx_FIFO_IndexW=0; //写指针循环归零
_EINT(); //恢复总中断使能
return(1); //返回成功
}
char Rx_FIFO_ReadChar(unsigned char *Chr)
{
if(Rx_FIFO_DataNum==0) return(0); //判断FIFO是是否有未读数据,如果没有返回0
_DINT(); //操作FIFO前一定要关总中断
Rx_FIFO_DataNum--; //待读取数据个数减一
*Chr=Rx_FIFO[Rx_FIFO_IndexR]; //将读指针位置的FIFO数据赋给指针所指变量
Rx_FIFO_IndexR++; //读指针移位
if (Rx_FIFO_IndexR>=RX_FIFO_SIZE) //判断指针是否越界
Rx_FIFO_IndexR=0; //读指针循环归零
_EINT(); //恢复总中断使能
return(1);
}
void Rx_FIFO_Clear()
{
_DINT(); //操作FIFO前一定要关总中断
Rx_FIFO_DataNum=0; //FIFO 中未读取数据数目清零
Rx_FIFO_IndexR=0; //FIFO 中模拟读指针清零
Rx_FIFO_IndexW=0; //FIFO 中模拟写指针清零
_EINT (); //恢复总中断使能
}
char Tx_FIFO_WriteChar(unsigned char Data)
{
if(Tx_FIFO_DataNum==TX_FIFO_SIZE) return(0);
//判断FIFO是否已装满未读数据,如果装满返回0
_DINT(); //操作FIFO前一定要关总中断
//-----“全新”一次发送数据必须手动触发Tx中断-----
if((Tx_FIFO_DataNum==0) &&( !(UCA0STAT & UCBUSY)))
//判断是否为一次“全新”发送
IFG2 |=UCA0TXIFG; // 手动触发一次
Tx_FIFO_DataNum++; //未读取数据个数加一
Tx_FIFO[Tx_FIFO_IndexW]=Data; //将数据写入写读指针位置的FIFO数组
Tx_FIFO_IndexW++; //写指针移位
if (Tx_FIFO_IndexW >= TX_FIFO_SIZE) //判断指针是否越界
Tx_FIFO_IndexW=0; //写指针循环归零
_EINT(); //恢复总中断使能
return(1); //返回成功
}
char Tx_FIFO_ReadChar(unsigned char *Chr)
{
if(Tx_FIFO_DataNum==0) return(0); //判断FIFO是是否有未读数据,如果没有返回0
_DINT(); //操作FIFO前一定要关总中断
Tx_FIFO_DataNum --; //待读取数据个数减一
*Chr=Tx_FIFO[Tx_FIFO_IndexR]; //将读指针位置的FIFO数据赋给指针所指变量
Tx_FIFO_IndexR++; //读指针移位
if (Tx_FIFO_IndexR>=TX_FIFO_SIZE) //判断指针是否越界
Tx_FIFO_IndexR=0; //读指针循环归零
_EINT(); //恢复总中断使能
return(1); //返回成功
}
void Tx_FIFO_Clear()
{
_DINT(); //操作FIFO前一定要关总中断
Tx_FIFO_DataNum=0; //FIFO 中未读取数据数目清零
Tx_FIFO_IndexR=0; //FIFO 中模拟读指针清零
Tx_FIFO_IndexW=0; //FIFO 中模拟写指针清零
_EINT(); //恢复总中断使能
}
/******************************************************************************************************
* 名 称:USCI_A0_init()
* 功 能:初始化USCI_A0模块为UART模式
* 入口参数:无
* 出口参数:无
* 说 明:UART设为波特率9600,8位数据,无校验,1位停止位
* UART初始化配置较复杂,可以使用Grace配置后再移植代码的方法
* 范 例:无
******************************************************************************************************/
void USCI_A0_init(void)
{
//-----开启IO口的TXD和RXD功能-----
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2;
//-----设置UART时钟源为ACLK-----
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
//-----移植Grace配置的波特率参数-----
UCA0BR0 = 0x03; // 32kHz/9600 = 3.41
UCA0BR1 = 0x00;
UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE + UCA0TXIE; // Enable USCI_A0 TX/RX interrupt
_EINT(); //开总中断
}
/******************************************************************************************************
* 名 称:USCI0TX_ISR()
* 功 能:响应Tx中断服务
* 入口参数:无
* 出口参数:无
* 说 明:凡是中断标志位有可能不被自动清除的,均手动清除一次,以防万一
* 范 例:无
******************************************************************************************************/
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
IFG2&=~UCA0TXIFG; //手动清除标志位
UART_OnTx(); //调用Tx事件处理函数
}
/******************************************************************************************************
* 名 称:USCI0RX_ISR()
* 功 能:响应Rx中断服务
* 入口参数:无
* 出口参数:无
* 说 明:凡是中断标志位有可能不被自动清除的,均手动清除一次,以防万一
* 范 例:无
******************************************************************************************************/
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
IFG2&=~UCA0RXIFG; //手动清除标志位
UART_OnRx(); //调用Rx事件处理函数
}
void Command_match();
void UART_OnTx(void)
{
unsigned char Temp=0;
if(Tx_FIFO_DataNum>0)
{
Tx_FIFO_ReadChar(&Temp); //调用FIFO库函数
UCA0TXBUF= Temp;
}
}
复制代码
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
huybn5776
1楼-- · 2019-03-24 16:19
我调试这个Project时也发生过相同情况
换了几个软件后最后只有
Tera Term Pro
在我的Win8.1笔记本用的比较正常
有时发现MSP430没回应的话要重插USB再开串口软件连接才行
加载中...
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
换了几个软件后最后只有Tera Term Pro在我的Win8.1笔记本用的比较正常
有时发现MSP430没回应的话要重插USB再开串口软件连接才行
一周热门 更多>