/***************************************************************
 *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
 *文件名：  lib_uart.c
 *作  者：  Liut
 *版  本：  V1.00
 *日  期：  2017/07/14
 *描  述：  UART模块库函数
 *备  注：  适用于 ES8P508x芯片
 本软件仅供学习和演示使用，对用户直接引用代码所带来的风险或后果不承担任何法律责任。
 ***************************************************************/
#include "lib_uart.h"

/***************************************************************
  函数名：UART_Init
  描  述：UART初始化
  输入值：UARTx：可以是UART0/1/2/3/4/5 、 UART_InitStruct：初始化配置结构体地址
  输出值：无
  返回值：无
 ***************************************************************/
void UART_Init(UART_TypeDef *UARTx, UART_InitStruType *UART_InitStruct)
{
    uint32_t BaudClockTemp = 0, BaudTemp = 0;

    if (UART_InitStruct->UART_ClockSet == UART_Clock_1)
    {
        BaudClockTemp = (SystemCoreClock / 16) % UART_InitStruct->UART_BaudRate;

        if (UART_InitStruct->UART_BaudRate >= (2 * BaudClockTemp))
        {
            BaudTemp = (SystemCoreClock / 16 / UART_InitStruct->UART_BaudRate) - 1;
        }
        else
        {
            BaudTemp = SystemCoreClock / 16 / UART_InitStruct->UART_BaudRate;
        }
    }
    else if (UART_InitStruct->UART_ClockSet == UART_Clock_2)
    {
        BaudClockTemp = (SystemCoreClock / 32) % UART_InitStruct->UART_BaudRate;

        if (UART_InitStruct->UART_BaudRate >= (2 * BaudClockTemp))
        {
            BaudTemp = (SystemCoreClock / 32 / UART_InitStruct->UART_BaudRate) - 1;
        }
        else
        {
            BaudTemp = SystemCoreClock / 32 / UART_InitStruct->UART_BaudRate;
        }
    }
    else if (UART_InitStruct->UART_ClockSet == UART_Clock_4)
    {
        BaudClockTemp = (SystemCoreClock / 64) % UART_InitStruct->UART_BaudRate;

        if (UART_InitStruct->UART_BaudRate >= (2 * BaudClockTemp))
        {
            BaudTemp = (SystemCoreClock / 64 / UART_InitStruct->UART_BaudRate) - 1;
        }
        else
        {
            BaudTemp = SystemCoreClock / 64 / UART_InitStruct->UART_BaudRate;
        }
    }

    if (BaudTemp > 2046)
    {
        BaudTemp = 2047;
    }

    UARTx->CON.BCS = UART_InitStruct->UART_ClockSet;
    UARTx->BRR.BRR = BaudTemp ;

    UARTx->CON.TXFS = UART_InitStruct->UART_StopBits;
    UARTx->CON.TXMOD = UART_InitStruct->UART_TxMode;
    UARTx->CON.TXP = UART_InitStruct->UART_TxPolar;
    UARTx->CON.RXMOD = UART_InitStruct->UART_RxMode;
    UARTx->CON.RXP = UART_InitStruct->UART_RxPolar;
}
/***************************************************************
  函数名：UART_ITConfig
  描  述：UART中断配置
  输入值：UARTx：可以是UART0/1/2/3/4/5 、 UART_IT：中断类型 、 NewState：使能/失能
  输出值：无
  返回值：无
 ***************************************************************/
void UART_ITConfig(UART_TypeDef *UARTx, UART_TYPE_IT UART_IT, TYPE_FUNCEN NewState)
{
    if (NewState != DISABLE)
        UARTx->IE.Word = (UARTx->IE.Word & (uint32_t)0x0000FFFF) | (uint32_t) UART_IT;
    else
        UARTx->IE.Word = (UARTx->IE.Word & (uint32_t)0x0000FFFF) & (~((uint32_t) UART_IT));
}
/***************************************************************
  函数名：UART_TBIMConfig
  描  述：UART发送缓冲器空中断模式选择
  输入值：UARTx：可以是UART0/1/2/3/4/5 、 Type：空中断模式
  输出值：无
  返回值：无
 ***************************************************************/
void UART_TBIMConfig(UART_TypeDef *UARTx, UART_TYPE_TRBIM Type)
{
    UARTx->IE.TBIM = Type;
}
/***************************************************************
  函数名：UART_RBIMConfig
  描  述：UART接收缓冲器满中断模式选择
  输入值：UARTx：可以是UART0/1/2/3 、 Type：满中断模式
  输出值：无
  返回值：无
 ***************************************************************/
void UART_RBIMConfig(UART_TypeDef *UARTx, UART_TYPE_TRBIM Type)
{
    UARTx->IE.RBIM = Type;
}
/***************************************************************
  函数名：UART_Sendxxxx
  描  述：UART发送字节、半字、字
  输入值：UARTx：可以是UART0/1/2/3/4/5 、 数据
  输出值：无
  返回值：无
 ***************************************************************/
void UART_SendByte(UART_TypeDef *UARTx, uint8_t Temp08)
{
    UARTx->TBW.Byte[0] = Temp08;
}
void UART_SendHalfWord(UART_TypeDef *UARTx, uint16_t Temp16)
{
    UARTx->TBW.HalfWord[0] = Temp16;
}
void UART_SendWord(UART_TypeDef *UARTx, uint32_t Temp32)
{
    UARTx->TBW.Word = Temp32;
}
/***************************************************************
  函数名：UART_Recxxxx
  描  述：UART接收字节、半字、字
  输入值：UARTx：可以是UART0/1/2/3/4/5
  输出值：无
  返回值：数据
 ***************************************************************/
uint8_t UART_RecByte(UART_TypeDef *UARTx)
{
    return UARTx->RBR.Byte[0];
}
uint16_t UART_RecHalfWord(UART_TypeDef *UARTx)
{
    return UARTx->RBR.HalfWord[0];
}
uint32_t UART_RecWord(UART_TypeDef *UARTx)
{
    return UARTx->RBR.Word;
}
/***************************************************************
  函数名：UART_GetFlagStatus
  描  述：UART获取标志位状态
  输入值：UARTx：可以是UART0/1/2/3/4/5 、 UART_Flag：标志位
  输出值：无
  返回值：SET/RESET
 ***************************************************************/
FlagStatus UART_GetFlagStatus(UART_TypeDef *UARTx, UART_TYPE_FLAG UART_Flag)
{
    FlagStatus bitstatus = RESET;

    if ((UARTx->IF.Word & ((uint32_t)UART_Flag)) != RESET)
        bitstatus = SET;
    else
        bitstatus = RESET;

    return bitstatus;
}

/***************************************************************
  函数名：UART_GetITStatus
  描  述：UART获取中断状态
  输入值：UARTx：可以是UART0/1/2/3/4/5 、 UART_Flag：标志位
  输出值：无
  返回值：SET/RESET
 ***************************************************************/
ITStatus UART_GetITStatus(UART_TypeDef *UARTx, UART_TYPE_IT UART_IT)
{
    FlagStatus bitstatus = RESET;

    if ((UARTx->IE.Word & ((uint32_t)UART_IT)) == 0)
        bitstatus = RESET;
    else
        bitstatus = SET;

    return bitstatus;
}
/***************************************************************
  函数名：UART_ClearIFPendingBit
  描  述：UART标志位清除
  输入值：UARTx：可以是UART0/1/2/3/4/5、 UART_Flag：标志位
  输出值：无
  返回值：无
 ***************************************************************/
void UART_ClearITPendingBit(UART_TypeDef *UARTx, UART_CLR_IF UART_Flag)
{
    UARTx->IF.Word = (uint32_t)UART_Flag;
}

/*************************END OF FILE**********************/
