/**
*     Copyright (c) 2022, Nations Technologies Inc.
* 
*     All rights reserved.
*
*     This software is the exclusive property of Nations Technologies Inc. (Hereinafter 
* referred to as NATIONS). This software, and the product of NATIONS described herein 
* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties
* of the People's Republic of China and other applicable jurisdictions worldwide.
*
*     NATIONS does not grant any license under its patents, copyrights, trademarks, or other 
* intellectual property rights. Names and brands of third party may be mentioned or referred 
* thereto (if any) for identification purposes only.
*
*     NATIONS reserves the right to make changes, corrections, enhancements, modifications, and 
* improvements to this software at any time without notice. Please contact NATIONS and obtain 
* the latest version of this software before placing orders.

*     Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes 
* no responsibility for the accuracy and reliability of this software.
* 
*     It is the responsibility of the user of this software to properly design, program, and test 
* the functionality and safety of any application made of this information and any resulting product. 
* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or 
* consequential damages arising in any way out of the use of this software or the Product.
*
*     NATIONS Products are neither intended nor warranted for usage in systems or equipment, any
* malfunction or failure of which may cause loss of human life, bodily injury or severe property 
* damage. Such applications are deemed, "Insecure Usage".
*
*     All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS 
* harmless from and against all claims, costs, damages, and other liabilities, arising from or related 
* to any customer's Insecure Usage.

*     Any express or implied warranty with regard to this software or the Product, including,but not 
* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement
* are disclaimed to the fullest extent permitted by law.

*     Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe
* or otherwise distribute this software for any purposes, in whole or in part.
*
*     NATIONS products and technologies shall not be used for or incorporated into any products or systems
* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. 
* User shall comply with any applicable export control laws and regulations promulgated and administered by 
* the governments of any countries asserting jurisdiction over the parties or transactions.
**/

/**
*\*\file n32a003_uart.h
*\*\author Nations
*\*\version v1.0.0
*\*\copyright Copyright (c) 2022, Nations Technologies Inc. All rights reserved.
**/

#ifndef __N32A003_UART_H
#define __N32A003_UART_H

#ifdef __cplusplus
 extern "C" {
#endif

#include "n32a003.h"

/*** UART Structure Definition Start ***/

/** UART Init structure definition **/
typedef struct
{
    uint32_t BaudRate;   /* Configures the UART communication baud rate. */

    uint16_t WordLength; /* Specifies the number of data bits transmitted or received in a frame. */

    uint16_t StopBits;   /* Specifies the number of stop bits transmitted. */

    uint16_t Parity;     /* Specifies the parity mode. */

    uint16_t Mode;       /* Specifies wether the Receive or Transmit mode is enabled or disabled. */

} UART_InitType;

/*** UART Macro Definition Start ***/

/** All register bits are configure to 0 **/
#define UART_REG_BIT_MASK ((uint16_t)0x0000)

/** Configures the word length of UART **/
#define UART_WL_MASK   (~UART_CTRL1_WL)     /* word length Mask */
#define UART_WL_8B     (UART_REG_BIT_MASK)  /* 8 bits */
#define UART_WL_9B     (UART_CTRL1_WL)      /* 9 bits */

/** UART STOP bits **/
#define CTRL2_STPB_CLR_MASK (~UART_CTRL2_STPB)    /* UART CTRL2 STOP Bits Mask */
#define UART_STPB_1         (UART_REG_BIT_MASK)   /* 1 STOP bit */
#define UART_STPB_2         (UART_CTRL2_STPB_1)   /* 2 STOP bits */

/** UART parity selection **/
#define UART_PE_MASK        (~(UART_CTRL1_PCEN | UART_CTRL1_PSEL))  /* UART parity Mask */
#define UART_PE_NO          (UART_REG_BIT_MASK)                     /* UART parity disable */
#define UART_PE_EVEN        (UART_CTRL1_PCEN)                       /* Even parity */
#define UART_PE_ODD         (UART_CTRL1_PCEN | UART_CTRL1_PSEL)     /* Odd parity */

/** UART is configured as RX or TX **/
#define UART_MODE_MASK      (~(UART_CTRL1_RXEN | UART_CTRL1_TXEN))  /* UART mode Mask */
#define UART_MODE_RX        (UART_CTRL1_RXEN)                       /* Transmitter enable */
#define UART_MODE_TX        (UART_CTRL1_TXEN)                       /* Receiver enable */

/** UART enable or disable **/
#define CTRL1_UEN_SET   (UART_CTRL1_UEN)    /* UART Enable */
#define CTRL1_UEN_RESET (~UART_CTRL1_UEN)   /* UART Disable */

/** Configure interrupt **/
#define INT_MASK       ((uint16_t)0x001F) /* UART Interrupt Mask */
#define UART_INT_PEF   ((uint16_t)0x0028) /* Parity error interrupt */
#define UART_INT_TXDE  ((uint16_t)0x0727) /* TXDE interrupt */
#define UART_INT_TXC   ((uint16_t)0x0626) /* Transmission complete interrupt */
#define UART_INT_RXDNE ((uint16_t)0x0525) /* RXDEN interrupt */
#define UART_INT_IDLEF ((uint16_t)0x0424) /* IDLE interrupt */
#define UART_INT_OREF  ((uint16_t)0x0325) /* ORE interrupt */

/** UART address Mask **/
#define CTRL2_ADDR_MASK   (~UART_CTRL2_ADDR)

/** Wake up methods **/
#define CTRL1_WUM_MASK         (~UART_CTRL1_WUM)    /* UART WakeUp Method Mask */
#define UART_WUM_IDLELINE      (UART_REG_BIT_MASK)  /* Idle frame wake up */
#define UART_WUM_ADDRMASK      (UART_CTRL1_WUM)     /* Address mark wake up */

/** Receiver wakeup **/
#define CTRL1_RCVWU_SET   (UART_CTRL1_RCVWU)     /* UART mute mode Enable  */
#define CTRL1_RCVWU_RESET (~UART_CTRL1_RCVWU)    /* UART mute mode Disable  */

/** UART Break Character send Mask **/
#define CTRL1_SDBRK_SET   (UART_CTRL1_SDBRK)

/** UART Half-Duplex Enable or Disable **/
#define CTRL3_HDMEN_SET   (UART_CTRL3_HDMEN)    /* UART Half-Duplex Enable  */
#define CTRL3_HDMEN_RESET (~UART_CTRL3_HDMEN)   /* UART Half-Duplex Disable  */

/* Specifies the flag to check */
#define UART_FLAG_TXDE  (UART_STS_TXDE)     /* Transmit data register empty flag */
#define UART_FLAG_TXC   (UART_STS_TXC)      /* Transmission complete flag*/
#define UART_FLAG_RXDNE (UART_STS_RXDNE)    /* Read data register not empty flag*/
#define UART_FLAG_IDLEF (UART_STS_IDLEF)    /* IDLE line detected flag */
#define UART_FLAG_OREF  (UART_STS_OREF)     /* OverRun error flag */
#define UART_FLAG_NEF   (UART_STS_NEF)      /* Noise error flag */
#define UART_FLAG_FEF   (UART_STS_FEF)      /* Framing error flag*/
#define UART_FLAG_PEF   (UART_STS_PEF)      /* Parity error flag */

void UART_Reset(UART_Module* UARTx);
void UART_Initializes(UART_Module* UARTx, UART_InitType* UART_InitStruct);
void UART_Baud_Rate_Config(UART_Module* UARTx,uint32_t buad_rate);
void UART_Word_Length_Config(UART_Module* UARTx,uint16_t word_length);
void UART_Stop_Bits_Config(UART_Module* UARTx,uint16_t stop_bits);
void UART_Parity_Config(UART_Module* UARTx,uint16_t parity);
void UART_Mode_Config(UART_Module* UARTx,uint16_t mode);
void UART_Structure_Initializes(UART_InitType* UART_InitStruct);
void UART_Enable(UART_Module* UARTx);
void UART_Disable(UART_Module* UARTx);
void UART_Interrput_Enable(UART_Module* UARTx, uint16_t UART_interrupt);
void UART_Interrput_Disable(UART_Module* UARTx, uint16_t UART_interrupt);
void UART_Address_Set(UART_Module* UARTx, uint8_t UART_address);
void UART_WakeUp_Mode_Set(UART_Module* UARTx, uint16_t UART_wake_up_mode);
void UART_Receiver_Wakeup_Enable(UART_Module* UARTx);
void UART_Receiver_Wakeup_Disable(UART_Module* UARTx);
void UART_Data_Send(UART_Module* UARTx, uint16_t data);
uint16_t UART_Data_Receive(UART_Module* UARTx);
void UART_Break_Frame_Send(UART_Module* UARTx);
void UART_Half_Duplex_Enable(UART_Module* UARTx);
void UART_Half_Duplex_Disable(UART_Module* UARTx);
FlagStatus UART_Flag_Status_Get(UART_Module* UARTx, uint16_t UART_flag);
void UART_Flag_Clear(UART_Module* UARTx, uint16_t UART_flag);
ITStatus UART_Interrupt_Status_Get(UART_Module* UARTx, uint16_t UART_interrupt);
void UART_Interrupt_Status_Clear(UART_Module* UARTx, uint16_t UART_Interrupt);

#ifdef __cplusplus
}
#endif

#endif /* __N32A003_UART_H */


/******************* (C) COPYRIGHT 2022 NATIONZ *****END OF FILE****/
