/**
*     Copyright (c) 2022, Nsing Technologies Pte. Ltd.
*
*     All rights reserved.
*
*     This software is the exclusive property of Nsing Technologies Pte. Ltd. (Hereinafter
* referred to as Nsing). This software, and the product of Nsing described herein
* (Hereinafter referred to as the Product) are owned by Nsing under the laws and treaties
* of the People's Republic of China and other applicable jurisdictions worldwide.
*
*     Nsing 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.
*
*     Nsing reserves the right to make changes, corrections, enhancements, modifications, and
* improvements to this software at any time without notice. Please contact Nsing and obtain
* the latest version of this software before placing orders.

*     Although Nsing has attempted to provide accurate and reliable information, Nsing 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 Nsing 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.
*
*     Nsing 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 Nsing and hold Nsing
* 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 Nsing, anyone may not duplicate, modify, transcribe
* or otherwise distribute this software for any purposes, in whole or in part.
*
*     Nsing 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 n32g003_uart.h
 *\*\author Nsing
 *\*\version v1.0.0
 *\*\copyright Copyright (c) 2022, Nsing Technologies Pte. Ltd. All rights reserved.
 **/

#ifndef __N32G003_UART_H
#define __N32G003_UART_H

#ifdef __cplusplus
extern "C"
{
#endif

#include "n32g003.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 /* __N32G003_UART_H */

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