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

#include "ES8P508x.h"
#include "type.h"
#include "system_ES8P508x.h"

/* 发送帧停止位选择 */
typedef enum
{
    UART_StopBits_1 = 0x0,  //发送帧停止位：1位
    UART_StopBits_2 = 0x1,  //发送帧停止位：2位
} UART_TYPE_TXFS;

/* 数据格式 */
typedef enum
{
    UART_DataMode_7 = 0x0,     //数据格式:7位数据
    UART_DataMode_8 = 0x1,     //数据格式:8位数据
    UART_DataMode_9 = 0x2,     //数据格式:9位数据
    UART_DataMode_7Odd = 0x4,  //数据格式:7位数据+奇校验
    UART_DataMode_7Even = 0x5,  //数据格式:7位数据+偶校验
    UART_DataMode_8Odd = 0x6,  //数据格式:8位数据+奇校验
    UART_DataMode_8Even = 0x7,  //数据格式:8位数据+偶校验
} UART_TYPE_DATAMOD;

/* 端口极性 */
typedef enum
{
    UART_Polar_Normal = 0x0,    //发送端口极性:正常
    UART_Polar_Opposite = 0x1,  //发送端口极性:反向
} UART_TYPE_RTXP;

/* 波特率发生器时钟选择 */
typedef enum
{
    UART_Clock_1 = 0x1,  //波特率发生器时钟:PCLK
    UART_Clock_2 = 0x2,  //波特率发生器时钟:PCLK/2
    UART_Clock_4 = 0x3,  //波特率发生器时钟:PCLK/4
    UART_Clock_8 = 0x4,  //波特率发生器时钟:PCLK/8

} UART_TYPE_BCS;

/* UART初始化配置结构体定义 */
typedef struct
{
    UART_TYPE_TXFS  UART_StopBits;  //发送帧停止位选择
    UART_TYPE_DATAMOD  UART_TxMode; //发送数据帧格式
    UART_TYPE_RTXP  UART_TxPolar;   //发送端口极性
    UART_TYPE_DATAMOD  UART_RxMode; //接收数据帧格式
    UART_TYPE_RTXP  UART_RxPolar;   //接收端口极性
    uint32_t  UART_BaudRate;        //传输波特率
    UART_TYPE_BCS  UART_ClockSet;   //波特率发生器时钟选择
} UART_InitStruType;

/* 中断选择 */
typedef enum
{
    UART_IT_TB = 0x0001,
    UART_IT_RB = 0x0002,
    UART_IT_RO = 0x0004,
    UART_IT_FE = 0x0008,
    UART_IT_PE = 0x0010,
    UART_IT_TBWE = 0x0020,
    UART_IT_TXIDLE = 0x1000,
    UART_IT_RXIDLE = 0x2000,
} UART_TYPE_IT;

/* 标志位 */
typedef enum
{
    UART_FLAG_TB = 0x0001,
    UART_FLAG_RB = 0x0002,
    UART_FLAG_RO = 0x0004,
    UART_FLAG_FE = 0x0008,
    UART_FLAG_PE = 0x0010,
    UART_FLAG_TBWE = 0x0020,
    UART_FLAG_TXIDLE = 0x1000,
    UART_FLAG_RXIDLE = 0x2000,
} UART_TYPE_FLAG;

/*  清除中断标志位 */
typedef enum
{
    UART_Clr_RO = 0x0004,
    UART_Clr_FE = 0x0008,
    UART_Clr_PE = 0x0010,
    UART_Clr_TBWE = 0x0020,
    UART_Clr_TXIDLE = 0x1000,
    UART_Clr_RXIDLE = 0x2000,
} UART_CLR_IF;

/* 发送、接收中断模式 */
typedef enum
{
    UART_TRBIM_Byte = 0x0,      //中断:字节
    UART_TRBIM_HalfWord = 0x1,  //中断:半字
    UART_TRBIM_Word = 0x2,      //中断:字
} UART_TYPE_TRBIM;

/*************UART模块宏定义************/
/* 发送使能控制 */
#define UART0_TxEnable() (UART0->CON.TXEN = 1)
#define UART1_TxEnable() (UART1->CON.TXEN = 1)
#define UART2_TxEnable() (UART2->CON.TXEN = 1)
#define UART3_TxEnable() (UART3->CON.TXEN = 1)
#define UART4_TxEnable() (UART4->CON.TXEN = 1)
#define UART5_TxEnable() (UART5->CON.TXEN = 1)
#define UART0_TxDisable() (UART0->CON.TXEN = 0)
#define UART1_TxDisable() (UART1->CON.TXEN = 0)
#define UART2_TxDisable() (UART2->CON.TXEN = 0)
#define UART3_TxDisable() (UART3->CON.TXEN = 0)
#define UART4_TxDisable() (UART4->CON.TXEN = 0)
#define UART5_TxDisable() (UART5->CON.TXEN = 0)

/* 接收使能控制 */
#define UART0_RxEnable() (UART0->CON.RXEN = 1)
#define UART1_RxEnable() (UART1->CON.RXEN = 1)
#define UART2_RxEnable() (UART2->CON.RXEN = 1)
#define UART3_RxEnable() (UART3->CON.RXEN = 1)
#define UART4_RxEnable() (UART4->CON.RXEN = 1)
#define UART5_RxEnable() (UART5->CON.RXEN = 1)
#define UART0_RxDisable() (UART0->CON.RXEN = 0)
#define UART1_RxDisable() (UART1->CON.RXEN = 0)
#define UART2_RxDisable() (UART2->CON.RXEN = 0)
#define UART3_RxDisable() (UART3->CON.RXEN = 0)
#define UART4_RxDisable() (UART4->CON.RXEN = 0)
#define UART5_RxDisable() (UART5->CON.RXEN = 0)

/* 发送器复位 */
#define UART0_TxRst() (UART0->CON.TRST = 1)
#define UART1_TxRst() (UART1->CON.TRST = 1)
#define UART2_TxRst() (UART2->CON.TRST = 1)
#define UART3_TxRst() (UART3->CON.TRST = 1)
#define UART4_TxRst() (UART4->CON.TRST = 1)
#define UART5_TxRst() (UART5->CON.TRST = 1)

/* 接收器复位 */
#define UART0_RxRst() (UART0->CON.RRST = 1)
#define UART1_RxRst() (UART1->CON.RRST = 1)
#define UART2_RxRst() (UART2->CON.RRST = 1)
#define UART3_RxRst() (UART3->CON.RRST = 1)
#define UART4_RxRst() (UART4->CON.RRST = 1)
#define UART5_RxRst() (UART5->CON.RRST = 1)

/************UART模块函数声明***********/
void UART_Init(UART_TypeDef *UARTx, UART_InitStruType *UART_InitStruct);
void UART_ITConfig(UART_TypeDef *UARTx, UART_TYPE_IT UART_IT, TYPE_FUNCEN NewState);
void UART_TBIMConfig(UART_TypeDef *UARTx, UART_TYPE_TRBIM Type);
void UART_RBIMConfig(UART_TypeDef *UARTx, UART_TYPE_TRBIM Type);
void UART_SendByte(UART_TypeDef *UARTx, uint8_t Temp08);
void UART_SendHalfWord(UART_TypeDef *UARTx, uint16_t Temp16);
void UART_SendWord(UART_TypeDef *UARTx, uint32_t Temp32);
uint8_t UART_RecByte(UART_TypeDef *UARTx);
uint16_t UART_RecHalfWord(UART_TypeDef *UARTx);
uint32_t UART_RecWord(UART_TypeDef *UARTx);
FlagStatus UART_GetFlagStatus(UART_TypeDef *UARTx, UART_TYPE_FLAG UART_Flag);
ITStatus UART_GetITStatus(UART_TypeDef *UARTx, UART_TYPE_IT UART_Flag);
void UART_ClearITPendingBit(UART_TypeDef *UARTx, UART_CLR_IF UART_Flag);

#endif

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