📄 before_usart.c
字号:
/***********************************************************
文件名称: USART.c
作 者: ADVANCE-007
版 本: V1.0
说 明: 关于串口的最底层函数,供上层调用 , 晶体:4MHZ
修改记录: 20070308
***********************************************************/
/***************************************************************
********** 预定义说明区 ********************
***************************************************************/
#include <msp430x14x.h>
#include "USART.H"
/***************************************************************
********** 常,变量定义区 * *********************
***************************************************************/
//Note:It must be 1. COM1 & COM2
uchar g_bRxdPos=0;//接收定位计数器
uchar g_bRxdLen=0;//等待接收字节数
uchar g_aRecvBuf[RecDataLen];//接收数据缓冲区
uchar Begin_flag = 0;//开始接收数据帧的标志;//曹修改
/***************************************************************
********** 函数说明 ********************
***************************************************************/
/**************************************************************
********** 函数 定义区 * *********************
***************************************************************/
/* com 的初始工作 *****************************************************
* comnum:输入:COM1 :初始化com1 port.
* 输入:COM2 :初始化com2 port.
* bps: 输入:BPSASK 只返回现有bps
* BPS4800 设置BPS:4800
* BPS9600 设置BPS:9600
* BPS19200 19200
* BPS28800 28800
* BPS57600 57600
* BPS115200 115200
* 其他数值 只返回现有bps
* 返回:返回现有bps,值范围:BPSASK,BPS4800,BPS9600,BPS19200,BPS28800,BPS57600,115200 ****/
void InitCom(uint8 comnum, uint8 bps) //注意: 晶体:4MHZ
{
//static uchar oldbps1=BPSASK;
//static uchar oldbps2=BPSASK;
if(comnum==COM1){
switch(bps){
case BPS4800:
UBR10=0x03;
UBR00=0x41;
UMCTL0=0x2a;
break;
case BPS9600:
UBR10=0x01;
UBR00=0xa0;
UMCTL0=0xab;
break;
case BPS19200:
UBR10=0x00;
UBR00=0xd0;
UMCTL0=0x2a;
break;
case BPS28800:
UBR10=0x00;
UBR00=0x8a;
UMCTL0=0xbf;
break;
case BPS57600:
UBR10=0x00;
UBR00=0x45;
UMCTL0=0xaa;
break;
case BPS115200:
UBR10=0x00;
UBR00=0x22;
UMCTL0=0xbb;
break;
default:break;
//return oldbps1;
}
//oldbps1=bps;
//********* COM1设置, 20070308 ADVANCE
UCTL0 = CHAR; // 设串口控制寄存器,数据位为8bit
UTCTL0 = SSEL1; //设串口发送控制寄存器的所用时钟,UCLK = SMCLK
// START COM1
ME1 |= URXE0 + UTXE0; //使能UART1的RXD和TXD
IE1 |= URXIE0 + UTXIE0; //使能UART1的RX和TX中断
P3SEL |= BIT5 + BIT4; //设置P3.5为URXD1,P3.4为UTXD1
P3DIR |= BIT4; //P3.4为UTXD1,输出管脚
//return oldbps1;
}
else if(comnum==COM2){
switch(bps){
case BPS4800: //注意: 晶体:11.0592MHZ
UBR11=0x03;
UBR01=0x41;
UMCTL1=0x2a;
break;
case BPS9600:
UBR11=0x01;
UBR01=0xa0;
UMCTL1=0xab;
break;
case BPS19200:
UBR11=0x00;
UBR01=0xd0;
UMCTL1=0x2a;
break;
case BPS28800:
UBR11=0x00;
UBR01=0x8a;
UMCTL1=0xbf;
break;
case BPS57600:
UBR11=0x00;
UBR01=0x45;
UMCTL1=0xaa;
break;
case BPS115200:
UBR11=0x00;
UBR01=0x22;
UMCTL1=0xbb;
break;
default:break;
//return oldbps2;
}
//oldbps2=bps;
//********* COM2设置,与COM1 完全相同 20070308 ADVANCE
//UCTL1 = 0X00; //将寄存器的内容清零
UCTL1 = CHAR; // 设串口控制寄存器,数据位为8bit
//UTCTL1 = 0X00; //将串口发送控制寄存器的内容清零
UTCTL1 = SSEL1; //设串口发送控制寄存器的所用时钟,UCLK = SMCLK
// START COM2
ME2 |= URXE1 + UTXE1; //使能UART1的RXD和TXD
IE2 |= URXIE1;// + UTXIE1; //使能UART1的RX和TX中断
P3SEL |= BIT7 + BIT6; //设置P3.7为URXD1,P3.6为UTXD1
P3DIR |= BIT6; //P3.6为UTXD1,输出管脚
//return oldbps2;
}
//else
//return BPSASK;
}
/**************************************************/
void UartRxd0_Int_test(void)
{
TXBUF0 = ~RXBUF0;
IE1 |= UTXIE0;
}
//串口中断服务子程序 COM1 Port
// 处理来自串口 0 的接收中断
interrupt [UART0RX_VECTOR] void usart0_rx(void)
{
g_aRecvBuf[g_bRxdPos++]=RXBUF0;
if(g_bRxdPos>=RecDataLen)
g_bRxdPos=0;
/*
unsigned char xdata * data t;
t=inRxBuf; t++;
if(t==RxBuf+LenRxBuf)
t=RxBuf;
if(t==outRxBuf) //RxBuf Full
return;
*inRxBuf=SBUF;
inRxBuf=t;
*/
}
//串口中断服务子程序 COM2 Port. Addr: 0x4b
// 处理来自串口 0 的发送中断
interrupt [UART0TX_VECTOR] void usart0_tx(void)
{
/*
unsigned char xdata * data t;
if(inTxBuf==outTxBuf) //TxBuf Empty
{
TIflag=1;
return;
}
SBUF=*outTxBuf;
outTxBuf++;
if(outTxBuf==TxBuf+LenTxBuf)
outTxBuf=TxBuf;
*/
}
// 处理来自串口 1 的接收中断
uchar COM2_R_flag = 0;
uchar Lead_flag = 0;
interrupt [UART1RX_VECTOR] void usart1_rx(void)
{
/*g_aRecvBuf[g_bRxdPos++] = RXBUF1;
if(g_bRxdPos>=RecDataLen)
{
g_bRxdPos = 0;
COM2_R_flag = 1;
}*/
////////////////////////////////////由此向下为曹跃东试验用代码////////////////////////////////////////////////////
if(RXBUF1 == 0xF0)
{
Lead_flag++;
}
if((RXBUF1 != 0xF0)&&(Lead_flag > 3))
{
//if((RXBUF1 == 0xAA)|(RXBUF1 == 0x55))
//{
//g_aRecvBuf[g_bRxdPos++] = RXBUF1;
Begin_flag = 1;
//}
//Lead_Flag = 0;Lead_flag-1)+
}
if(Begin_flag)
{
g_aRecvBuf[g_bRxdPos++] = RXBUF1;
if(g_bRxdPos >= (g_aRecvBuf[4]+6))
{
g_bRxdPos = 0;
COM2_R_flag = 1;
Lead_flag = 0;
Begin_flag = 0;
}
}
//////////////////////////////////////////////由此向上为曹跃东试验用代码///////////////////////////////////////////
/*
unsigned char xdata * data t;
t=inRxBuf; t++;
if(t==RxBuf+LenRxBuf)
t=RxBuf;
if(t==outRxBuf) //RxBuf Full
return;
*inRxBuf=SBUF;
inRxBuf=t;
*/
}
///////////////////////////////////////
// 处理来自串口 1 的发送中断
interrupt [UART1TX_VECTOR] void usart1_tx(void)
{
/* unsigned char xdata * data t;
if(inTxBuf==outTxBuf) //TxBuf Empty
{
TIflag=1;
return;
}
SBUF=*outTxBuf;
outTxBuf++;
if(outTxBuf==TxBuf+LenTxBuf)
outTxBuf=TxBuf;
*/
}
///////////////////////////////////////
/*****************************************************************************
发送函数。采用查询方式。
* comnum:输入:COM1 :初始化com1 port.
* 输入:COM2 :初始化com2 port.
pBuffer:指向发送数据缓冲区的指针
n_byte:发送的字节数
******************************************************************************/
void SendUart(uint8 comnum,uint8 *pBuffer,uint8 n_byte)//,uint8 n_byte
{
unsigned char q0;
if(comnum==COM1)//选择COM1
{
for(q0=0;q0<n_byte;q0++)//while(*pBuffer)//直到发送完毕
{
while ((IFG1&UTXIFG0)==0); //查询是否发送完毕
TXBUF0=*pBuffer;//TXBUF0=*pBuffer;
pBuffer++;
}
}
if(comnum==COM2)//选择COM2
{
for(q0=0;q0<n_byte;q0++)//while(*pBuffer)//直到发送完毕
{
while ((IFG2&UTXIFG1)==0); //查询是否发送完毕
TXBUF1=*pBuffer;//TXBUF0=*pBuffer;
pBuffer++;
}
}
}
/*****************************************************
//取消USART的中断操作
Stop_COM(COM1,UsartRXD) //stop COM1's RXD
Stop_COM(COM2,UsartRXD) //stop COM2's RXD
*****************************************************/
void Stop_COM(uint8 comnum,uint8 UsartTXDorRXD)//stop COMX's TXD or RXD
{
if(comnum==COM1)//选择COM1
{
if(UsartTXDorRXD==UsartTXD)
{IE1 &= ~UTXIE0;} //取消UART1的TX中断
else if(UsartTXDorRXD==UsartRXD)
{IE1 &= ~URXIE0;} //取消UART1的RX中断
else if(UsartTXDorRXD==UsartAll)
{IE1 &= ~UTXIE0; IE1 &= ~URXIE0;} //取消UART1的RX和TX中断
}
if(comnum==COM2)//选择COM2
{
if(UsartTXDorRXD==UsartTXD)
{IE2 &= ~UTXIE1;} //取消UART1的TX中断
else if(UsartTXDorRXD==UsartRXD)
{IE2 &= ~URXIE1;} //取消UART1的RX中断
else if(UsartTXDorRXD==UsartAll)
{IE2 &= ~UTXIE1; IE2 &= ~URXIE1;} //取消UART1的RX和TX中断
}
}
/*****************************************************
//取消USART的中断操作
Start_COM(COM1,UsartRXD) //start COM1's RXD
Start_COM(COM2,UsartRXD) //start COM2's RXD
*****************************************************/
void Start_COM(uint8 comnum,uint8 UsartTXDorRXD)//start COMX's TXD or RXD
{
if(comnum==COM1)//选择COM1
{
if(UsartTXDorRXD==UsartTXD)
{IE1 |= UTXIE0;} //取消UART1的TX中断
else if(UsartTXDorRXD==UsartRXD)
{IE1 |= URXIE0;} //取消UART1的RX中断
else if(UsartTXDorRXD==UsartAll)
{IE1 |= UTXIE0; IE1 |= URXIE0;} //取消UART1的RX和TX中断
}
if(comnum==COM2)//选择COM2
{
if(UsartTXDorRXD==UsartTXD)
{IE2 |= UTXIE1;} //取消UART1的TX中断
else if(UsartTXDorRXD==UsartRXD)
{IE2 |= URXIE1;} //取消UART1的RX中断
else if(UsartTXDorRXD==UsartAll)
{IE2 |= UTXIE1; IE2 |= URXIE1;} //取消UART1的RX和TX中断
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -