📄 uart.c
字号:
//****************************************************************************************
//** 文件名:Uart.c
//** Copyright (c) 2002 Hard&SoftMcuStudio
//** 创建人:Hard&SoftMcuStudio
//** 日期:2002.06.27
//** 描述:Uart drivers
//**
//** 版本:1.0
//**************************************************************************************
#include "uart.h"
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
INT32U ulRx0Index = 0;
INT32U ulRx1Index = 0;
INT8U aucRx0Buf[RX_BUFFER_SIZE];
INT8U aucRx1Buf[RX_BUFFER_SIZE];
/************************* UART ****************************/
void __irq Uart0_RxInt(void)
{
rI_ISPC=BIT_URXD0 ; //clear pending bits,Default value=0x0000000
//aucRx0Buf[ulRx0Index] = RdURXH0();
//Uart0_SendByte(aucRx0Buf[ulRx0Index]);
//ulRx0Index = (ulRx0Index + 1) % RX_BUFFER_SIZE;
//added by chenfurong in 030321
Uart0_ReceiveHook(RdURXH0());
}
void __irq Uart1_RxInt(void)
{
rI_ISPC=BIT_URXD1 ; //clear pending bits,Default value=0x0000000
//aucRx1Buf[ulRx1Index] = RdURXH1();
//Uart1_SendByte(aucRx1Buf[ulRx1Index]);
//ulRx1Index = (ulRx1Index + 1) % RX_BUFFER_SIZE;
Uart1_ReceiveHook(RdURXH1());
}
//--------------------------------------------------------------//
// Init and Enable Uart0 & Uart1 //
//-------------------------------------------------------------//
//*****************************************************************
//** 函数名:void Uart_init(void)
//** 输 入: Null
//** 输 出: Null
//** 功能描述:设置两个串口的波特率
//** 全局变量:Null
//*****************************************************************
void Uart_Init(void)
{
Uart0_Init(Uart0BaudRate); //set UART0 default baudrate as 57600bps for GSM
Uart1_Init(Uart1BaudRate); //set UART1 default baudrate as 9600bps for GPS
}
//*****************************************************************
//** 函数名:void Uart0_init(INT32 ulBandRate)
//** 输 入: INT32 ulBandRate:需设置的波特率
//** 输 出: Null
//** 功能描述:初始化Uart0
//** 全局变量:Null
//*****************************************************************
void Uart0_Init(INT32 baud)
{
INT32 i;
//should disable Globe Interrupt here?
rUFCON0=0x0; //Disable FIFO
rUMCON0=0x0; //Disable AFC
rULCON0=0x3; //Normal,No parity,1 stop,8 bit
rUCON0=0x245; //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
rUBRDIV0=( (int)(MCLK/16./baud + 0.5) -1 );//32;//
for(i=0;i<100;i++);
}
void Uart0_TxEmpty(void)
{
while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty.
}
//*****************************************************************
//** 函数名:void Uart0_SendByte(INT8U ucUart_Ch,INT8U ucData)
//** 输 入:
//** INT8U ucData:需要输出的数据.
//** 输 出: Null
//** 功能描述:由Uart0中输出数据.
//** 全局变量:Null
//*****************************************************************
void Uart0_SendByte(INT8U data)
{
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0(data);
}
//*****************************************************************
//** 函数名:void Uart0_SendString(INT8U ucUart_Ch,INT8U * pucData)
//** 输 入:
//** INT8U *pucData:需要输出的字符串.
//** 输 出: Null
//** 功能描述:由Uart0中输出数据.
//** 全局变量:Null
//*****************************************************************
void Uart0_SendString(INT8 *pcTemp)
{
while(*pcTemp)
Uart0_SendByte(*pcTemp++);
}
//*****************************************************************
//** 函数名:void Uart0_Printf(INT8U ucUart_Ch,INT8U * pucFMT,…)
//** 输 入:
//** INT8U *pucFMT:需要输出的带格式的字符串.
//** 输 出: Null
//** 功能描述:按指定的格式由Uart0中输出数据.
//** 全局变量:Null
//*****************************************************************
//if you don't use vsprintf(), the code size is reduced very much.
void Uart0_Printf(INT8 * pcString,...)
{
va_list ap;
char ucString[256];
va_start(ap,pcString);
vsprintf(ucString,pcString,ap);
Uart0_SendString(ucString);
va_end(ap);
}
//*****************************************************************
//** 函数名:void Uart1_init(INT32 ulBandRate)
//** 输 入: INT32 ulBandRate:需设置的波特率
//** 输 出: Null
//** 功能描述:初始化Uart1
//** 全局变量:Null
//*****************************************************************
void Uart1_Init(INT32 baud)
{
INT32 i;
rUFCON1=0x0;
rUMCON1=0x0;
rULCON1=0x2b;
rUCON1=0x245;
rUBRDIV1=( (int)(MCLK/16./baud + 0.5) -1 );
for(i=0;i<100;i++);
}
void Uart1_TxEmpty(void)
{
while(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty.
}
//*****************************************************************
//** 函数名:void Uart1_SendByte(INT8U ucUart_Ch,INT8U ucData)
//** 输 入:
//** INT8U ucData:需要输出的数据.
//** 输 出: Null
//** 功能描述:由Uart1中输出数据.
//** 全局变量:Null
//*****************************************************************
void Uart1_SendByte(INT8U data)
{
while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty.
rUTXH1=data;
}
//*****************************************************************
//** 函数名:void Uart1_SendString(INT8U ucUart_Ch,INT8U * pucData)
//** 输 入:
//** INT8U *pucData:需要输出的字符串.
//** 输 出: Null
//** 功能描述:由Uart1中输出数据.
//** 全局变量:Null
//*****************************************************************
void Uart1_SendString(INT8 *pcTemp)
{
while(*pcTemp)
Uart1_SendByte(*pcTemp++);
}
//*****************************************************************
//** 函数名:void Uart1_Printf(INT8U ucUart_Ch,INT8U * pucFMT,…)
//** 输 入:
//** INT8U *pucFMT:需要输出的带格式的字符串.
//** 输 出: Null
//** 功能描述:按指定的格式由Uart1中输出数据.
//** 全局变量:Null
//*****************************************************************
//if you don't use vsprintf(), the code size is reduced very much.
void Uart1_Printf(INT8 * pcString,...)
{
va_list ap;
char ucString[256];
va_start(ap,pcString);
vsprintf(ucString,pcString,ap);
Uart1_SendString(ucString);
va_end(ap);
}
INT8U Uart0_RecvLastByte(void)
{
if( ulRx0Index == 0 )
{
return aucRx0Buf[RX_BUFFER_SIZE-1];
}
else
{
return aucRx0Buf[ulRx0Index-1];
}
}
INT8U Uart1_RecvLastByte(void)
{
if(ulRx1Index==0)
{
return aucRx1Buf[RX_BUFFER_SIZE-1];
}
else
{
return aucRx1Buf[ulRx1Index-1];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -