/***********************************************************************//**
* @file drv_uart.c
* @brief Contains all functions support for UART firmware library on LPC17xx
* @version 3.0
* @date 18. June. 2010
* @author NXP MCU SW Application Team
**************************************************************************
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* products. This software is supplied "AS IS" without any warranties.
* NXP Semiconductors assumes no responsibility or liability for the
* use of the software, conveys no license or title under any patent,
* copyright, or mask work right to the product. NXP Semiconductors
* reserves the right to make changes in the software without
* notification. NXP Semiconductors also make no representation or
* warranty that such application will be suitable for the specified
* use without further testing or modification.
**********************************************************************/
/* Peripheral group ----------------------------------------------------------- */
/** @addtogroup UART
* @{
*/
/* Includes ------------------------------------------------------------------- */
#include "drv_uart.h"
/*******************************************************************************
@version 1.0
@date 2011-04-06
@author JH
*******************************************************************************/
#define U3_RX_SIZE (0x4000) //串口3 主机通信接收缓冲区长度
#define U3_TX_SIZE (0x40)
//=============================================================================
//串口3
//=============================================================================
#if U3_RX_SIZE
u8 U3RxBuf[U3_RX_SIZE]; //接收缓冲区
#endif
#if U3_TX_SIZE
u8 U3TxBuf[U3_TX_SIZE]; //发送缓冲区
#endif
#if U3_RX_SIZE || U3_TX_SIZE
BUFFER_INDEX_Type tU3BufIndex;
#endif
/*******************************************************************************
//函数名称: UART_InitRxBuffer()
//功能描述: 清空接收FIFO和RBR中数据,并把接收头尾指针清零
//入口参数: pUARTx:选择的UART外设,必须是以下值之一
// - LPC_UART0: UART0外设
// - LPC_UART1: UART1外设
// - LPC_UART2: UART2外设
// - LPC_UART3: UART3外设
//出口参数: 无
//返回值 : 无
*******************************************************************************/
void UART_InitRxBuffer(LPC_UART_TypeDef *pUARTx)
{
u32 tmp = 0;
#if defined(U3_RX_SIZE) && U3_RX_SIZE
if (pUARTx == LPC_UART3)
{
NVIC_EnableIRQ(UART3_IRQn);
tU3BufIndex.RxHead = tU3BufIndex.RxTail = 0;
tmp = pUARTx->FCR;
pUARTx->FCR = UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS;
pUARTx->FCR = tmp;// & UART_FCR_BITMASK;
NVIC_DisableIRQ(UART3_IRQn);
}
else
#endif
{}
}
/*******************************************************************************
//函数名称: UART_ClearRxBuffer()
//功能描述: 清空接收FIFO和RBR中数据,并把尾指针赋值给头指针,但不一定是零
//入口参数: pUARTx:选择的UART外设,必须是以下值之一
// - LPC_UART0: UART0外设
// - LPC_UART1: UART1外设
// - LPC_UART2: UART2外设
// - LPC_UART3: UART3外设
//出口参数: 无
//返回值 : 无
*******************************************************************************/
void UART_ClearRxBuffer(LPC_UART_TypeDef *pUARTx)
{
u32 tmp;
if ((pUARTx == LPC_UART0)
||(((LPC_UART1_TypeDef *)pUARTx) == LPC_UART1)
||(pUARTx == LPC_UART2)
||(pUARTx == LPC_UART3))
{
tmp = pUARTx->FCR;
pUARTx->FCR = UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS;
pUARTx->FCR = tmp & UART_FCR_BITMASK;
}
#if defined(U3_RX_SIZE) && U3_RX_SIZE
if (pUARTx == LPC_UART3)
{
NVIC_EnableIRQ(UART3_IRQn);
tU3BufIndex.RxHead = tU3BufIndex.RxTail;
NVIC_DisableIRQ(UART3_IRQn);
}
else
#endif
{}
}
/*******************************************************************************
//函数名称: UART_InitTxBuffer()
//功能描述: 发送头尾指针都清零
//入口参数: pUARTx:选择的UART外设,必须是以下值之一
// - LPC_UART0: UART0外设
// - LPC_UART1: UART1外设
// - LPC_UART2: UART2外设
// - LPC_UART3: UART3外设
//出口参数: 无
//返回值 : 无
*******************************************************************************/
void UART_InitTxBuffer(LPC_UART_TypeDef *pUARTx)
{
u32 tmp;
if ((pUARTx == LPC_UART0)
||(((LPC_UART1_TypeDef *)pUARTx) == LPC_UART1)
||(pUARTx == LPC_UART2)
||(pUARTx == LPC_UART3))
{
tmp = pUARTx->FCR;
pUARTx->FCR = UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS;
pUARTx->FCR = tmp & UART_FCR_BITMASK;
tmp = pUARTx->TER;
pUARTx->TER = UART_TER_TXEN;
while (!(pUARTx->LSR & UART_LSR_THRE));
pUARTx->TER = tmp & UART_TER_BITMASK;
}
#if defined(U3_TX_SIZE) && U3_TX_SIZE
if (pUARTx == LPC_UART3)
{
NVIC_EnableIRQ(UART3_IRQn);
tU3BufIndex.TxHead = tU3BufIndex.TxTail = 0;
NVIC_DisableIRQ(UART3_IRQn);
}
else
#endif
{}
}
/*******************************************************************************
//函数名称: UART_ClearTxBuffer()
//功能描述: 发送尾指针赋值给头指针,但不一定是零
//入口参数: pUARTx:选择的UART外设,必须是以下值之一
// - LPC_UART0: UART0外设
// - LPC_UART1: UART1外设
// - LPC_UART2: UART2外设
// - LPC_UART3: UART3外设
//出口参数: 无
//返回值 : 无
*******************************************************************************/
void UART_ClearTxBuffer(LPC_UART_TypeDef *pUARTx)
{
u32 tmp;
if ((pUARTx == LPC_UART0)
||(((LPC_UART1_TypeDef *)pUARTx) == LPC_UART1)
||(pUARTx == LPC_UART2)
||(pUARTx == LPC_UART3))
{
tmp = pUARTx->FCR;
pUARTx->FCR = UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS;
pUARTx->FCR = tmp & UART_FCR_BITMASK;
tmp = pUARTx->TER;
pUARTx->TER = UART_TER_TXEN;
while (!(pUARTx->LSR & UART_LSR_THRE));
pUARTx->TER = tmp & UART_TER_BITMASK;
}
#if defined(U3_TX_SIZE) && U3_TX_SIZE
if (pUARTx == LPC_UART3)
{
NVIC_EnableIRQ(UART3_IRQn);
tU3BufIndex.TxHead = tU3BufIndex.TxTail;
NVIC_DisableIRQ(UART3_IRQn);
}
else
#endif
{}
}
/*******************************************************************************
//函数名称: UART_GetRxBufSize()
//功能描述: 获取接收缓冲区的字节大小
//入口参数: pUARTx:选择的UART外设,必须是以下值之一
// - LPC_UART0: UART0外设
// - LPC_UART1: UART1外设
// - LPC_UART2: UART2外设
// - LPC_UART3: UART3外设
//出口参数: 无
//返回值 : 串口存在则接收缓冲区的字节大小
// 串口不存在则返回0
*******************************************************************************/
u32 UART_GetRxBufSize(LPC_UART_TypeDef *pUARTx)
{
#if defined(U3_RX_SIZE) && U3_RX_SIZE
if (pUARTx == LPC_UART3)
{
return U3_RX_SIZE;
}
else
#endif
{}
return 0;
}
/*******************************************************************************
//函数名称: UART_GetTxBufSize()
//功能描述: 获取发送缓冲区的字节大小
//入口参数: pUARTx:选择的UART外设,必须是以下值之一
// - LPC_UART0: UART0外设
// - LPC_UART1: UART1外设
// - LPC_UART2: UART2外设
// - LPC_UART3: UART3外设
//出口参数: 无
//返回值 : 串口存在则发送缓冲区的字节大小
// 串口不存在则返回0
*******************************************************************************/
u32 UART_GetTxBufSize(LPC_UART_TypeDef *pUARTx)
{
#if defined(U3_TX_SIZE)