PeripheralDriver_Flagchip_F.../Inc/fc7xxx_driver_fcuart.h

435 lines
16 KiB
C

/**
* @file fc7xxx_driver_fcuart.h
* @author Flagchip
* @brief FC7xxx FCUart driver type definition and API
* @version 0.1.0
* @date 2024-01-10
*
* @copyright Copyright (c) 2023 Flagchip Semiconductors Co., Ltd.
*
*/
/********************************************************************************
* Revision History:
*
* Version Date Initials CR# Descriptions
* --------- ---------- ------------ ---------- ---------------
* 0.1.0 2024-01-10 Flagchip0122 N/A FC7xxx internal release version
********************************************************************************/
#ifndef _DRIVER_FC7XXX_DRIVER_FCUART_H_
#define _DRIVER_FC7XXX_DRIVER_FCUART_H_
#include "HwA_fcuart.h"
/**
* @addtogroup fc7xxx_driver_fcuart
* @{
*/
/********* Macro ************/
#define FCUART_FIFO_DEPTH 16U
#define ESCAPE_CHARACTER (char)0x5c
#define ENTER (uint8_t)0x0d
#define NEW_LINE (uint8_t)0x0a
#define SPACE (uint8_t)0x20
#define FLOAT_ZERO 0.00000001
/********* Local typedef ************/
/**
* @brief FCUART error status
*
*/
typedef enum
{
FCUART_ERROR_OK = 0x00U, /**< FCUART_ERROR_OK means no error */
FCUART_ERROR_INVALID_VERSION = 0x01U, /**< FCUART_ERROR_INVALID_VERSION means version is not same */
FCUART_ERROR_FAILED = 0x02U, /**< FCUART_ERROR_FAILED means operation is failed */
FCUART_ERROR_INVALID_PARAM = 0x04U, /**< FCUART_ERROR_INVALID_PARAM means parameters are invalid */
FCUART_ERROR_INVALID_SIZE = 0x08U, /**< FCUART_ERROR_INVALID_SIZE means size is invalid */
FCUART_ERROR_INVALID_SEQUENCE = 0x10U, /**< FCUART_ERROR_INVALID_SEQUENCE means sequence is error */
FCUART_ERROR_TIMEOUT = 0x20U, /**< FCUART_ERROR_TIMEOUT means operation is timeout */
}FCUART_ErrorTypeEnum;
/**
* @brief UART fifo receive idle character number
*/
typedef enum
{
FCUART_FIFO_RX_IDLE_DISABLE = 0U,
FCUART_FIFO_RX_IDLE_CHARACTER_1,
FCUART_FIFO_RX_IDLE_CHARACTER_2,
FCUART_FIFO_RX_IDLE_CHARACTER_4,
FCUART_FIFO_RX_IDLE_CHARACTER_8,
FCUART_FIFO_RX_IDLE_CHARACTER_16,
FCUART_FIFO_RX_IDLE_CHARACTER_32,
FCUART_FIFO_RX_IDLE_CHARACTER_64
} FCUART_Fifo_RxIdleCharNumType;
/**
* @brief UART CTRL register interrupt
*
*/
typedef enum
{
FCUART_INT_CTRL_ORIE = FCUART_CTRL_ORIE_MASK,
FCUART_INT_CTRL_NEIE = FCUART_CTRL_NEIE_MASK,
FCUART_INT_CTRL_FEIE = FCUART_CTRL_FEIE_MASK,
FCUART_INT_CTRL_PEIE = FCUART_CTRL_PEIE_MASK,
FCUART_INT_CTRL_TIE = FCUART_CTRL_TIE_MASK,
FCUART_INT_CTRL_TCIE = FCUART_CTRL_TCIE_MASK,
FCUART_INT_CTRL_RIE = FCUART_CTRL_RIE_MASK,
FCUART_INT_CTRL_IIE = FCUART_CTRL_IIE_MASK,
FCUART_INT_CTRL_TE = FCUART_CTRL_TE_MASK,
FCUART_INT_CTRL_RE = FCUART_CTRL_RE_MASK,
FCUART_INT_CTRL_M0IE = FCUART_CTRL_M0IE_MASK,
FCUART_INT_CTRL_M1IE = FCUART_CTRL_M1IE_MASK
} FCUART_InterruptSel;
/**
* @brief UART error status type
*
*/
typedef enum
{
FCUART_ERROR_NONE = 0x0000U, /**< FCUART_ERROR_NONE No Error, */
FCUART_ERROR_RORF = 0x0001U, /**< FCUART_ERROR_RORF Receiver Overrun Flag, */
FCUART_ERROR_NF = 0x0002U, /**< FCUART_ERROR_NF Noise Flag, */
FCUART_ERROR_FEF = 0x0004U, /**< FCUART_ERROR_FEF Frame Error Flag, */
FCUART_ERROR_PEF = 0x0008U, /**< FCUART_ERROR_PEF Parity Error Flag, */
FCUART_ERROR_RPEF = 0x0010U, /**< FCUART_ERROR_RPEF Receive Data Parity Error Flag, */
FCUART_ERROR_TPEF = 0x0020U /**< FCUART_ERROR_TPEF Transmit Data Parity Error Flag, */
}FCUART_ErrorStatusType;
/**
* @brief UART idle character number
*/
typedef enum
{
FCUART_IDLE_CHARCTER_1 = 0U,
FCUART_IDLE_CHARCTER_2,
FCUART_IDLE_CHARCTER_4,
FCUART_IDLE_CHARCTER_8,
FCUART_IDLE_CHARCTER_16,
FCUART_IDLE_CHARCTER_32,
FCUART_IDLE_CHARCTER_64,
FCUART_IDLE_CHARCTER_128
} FCUART_IdleCharNumType;
/**
* @brief UART idle type
*/
typedef enum
{
FCUART_START_AFTER_STARTBIT = 0U,
FCUART_START_AFTER_STOPBIT
} FCUART_IdleStartType;
/**
* @brief UART initial data define
*
*/
typedef struct
{
uint32_t u32ClkSrcHz; /**< module clock hz */
FCUART_BitModeType eBitMode; /**< 8bits or 9bits */
bool bParityEnable; /**< Parity Enable=1 */
FCUART_ParityType eParityType; /**< parity type */
FCUART_StopBitNumType eStopBit; /**< stop bit num; */
bool bEnTxFifo; /**< Enable Tx FIFO, 16 data words depth */
uint8_t u8TxFifoWaterMark; /**< Tx FIFO,When FIFO/buffer number equal or less than this
an interrupt or a DMA request will be generated */
bool bEnRxFifo; /**< Enable Rx FIFO, 16 data words depth */
uint8_t u8RxFifoWaterMark; /**< Rx FIFO, When FIFO/buffer number greater than this
an interrupt or a DMA request will be generated */
FCUART_Fifo_RxIdleCharNumType eFifoRxIdleCharNum; /**< Fifo Rx idle character number */
bool bEnTxEmptyDma; /**< Enable transmit DMA */
bool bEnRxFullDma; /**< Enable receiver full DMA */
bool bEnRxIdleDma; /**< Enable Rx Idle DMA */
FCUART_IdleCharNumType eIdleCharNum; /**< Idle character number */
FCUART_IdleStartType eIdleStart; /**< Idle character start type */
uint32_t u32Baudrate; /**< normal baud-rate */
uint32_t u32TransmitTimeout; /**< transmit timeout tick, default 3000U */
} FCUART_InitType;
/**
* @brief UART transmit and receive data define
*
*/
typedef struct
{
uint8_t* pDatas; /**< Data buffer point, Must be initial with a array address */
uint32_t u32DataLen; /**< data length */
}FCUART_DataType;
/** Error call back function type, errors are combine with FCUART_ErrorStatusType */
typedef void (*FCUART_ErrorInterrupt_CallBackType)(uint8_t u8UartIndex, uint32_t u32Error);
/** Transmit/Receive call back function type */
typedef void (*FCUART_TxRxInterrupt_CallBackType)(uint8_t u8UartIndex, FCUART_DataType *pTxRxCfg);
/** Idle call back function type */
typedef void (*FCUART_IdleInterrupt_CallBackType)(uint8_t u8UartIndex);
/**
* @brief UART callback functions data define
*
*/
typedef struct
{
bool bEnErrorInterrupt; /**< enable error interrupt */
FCUART_ErrorInterrupt_CallBackType pErrorNotify; /**< error interrupt callback function address */
bool bEnRxInterrupt; /**< enable receive interrupt */
FCUART_DataType *pRxBuf; /**< receive interrupt message buffer */
FCUART_TxRxInterrupt_CallBackType pRxNotify; /**< receive interrupt callback function address */
bool bEnTxInterrupt; /**< enable receive interrupt */
FCUART_DataType *pTxBuf; /**< transfer interrupt message buffer */
FCUART_TxRxInterrupt_CallBackType pTxEmptyNotify; /**< transfer empty interrupt callback function address */
FCUART_TxRxInterrupt_CallBackType pTxCompleteNotify; /**< transfer complete interrupt callback function address */
bool bEnIdleInterrupt; /**< enable idle interrupt */
FCUART_IdleInterrupt_CallBackType pIdleNotify; /**< idle interrupt callback function address */
} FCUART_InterruptType;
/**
* @brief UART WakeUp functions data define
*
*/
typedef struct
{
bool bEnWakeup; /**< enable wake-up */
uint32_t u32WakeUpData; /**< wake-up data */
} FCUART_WakeupType;
/** Errortype Define as uint8 */
typedef uint8_t FCUART_ErrorType;
/* ################################################################################## */
/* ########################### Global Prototype Functions ########################### */
/**
* @brief Initial UART variables Memory
*
*/
void FCUART_InitMemory(uint8_t u8UartIndex);
/**
* @brief This Function is used to initial UART instance
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param pInitCfg contains clock, baud-rate, Bit Mode, parity and so on.
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_Init(uint8_t u8UartIndex, FCUART_InitType *pInitCfg);
/**
* @brief This Function is used to de-initial UART instance
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_DeInit(uint8_t u8UartIndex);
/**
* @brief This Function is used to set UART interrupt
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param pInterruptCfg contains callback functions
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_SetInterrupt(uint8_t u8UartIndex, FCUART_InterruptType *pInterruptCfg);
/**
* @brief This Function is used to set UART WakeUp
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param pWakeupCfg contains UART wake-up parameters
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_SetWakeup(uint8_t u8UartIndex, FCUART_WakeupType *pWakeupCfg);
/**
* @brief This Function is used to start receiving
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_StartReceive(uint8_t u8UartIndex);
/**
* @brief This Function is used to stop receiving
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_StopReceive(uint8_t u8UartIndex);
/**
* @brief This Function is used to start transmit
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_StartTransmit(uint8_t u8UartIndex);
/**
* @brief This Function is used to stop transmitting
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_StopTransmit(uint8_t u8UartIndex);
/**
* @brief This Function is used to transmit UART data
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param pUartData contains UART data and length
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_Transmit(uint8_t u8UartIndex, FCUART_DataType *pUartData);
/**
* @brief This Function is used to print ASCII char from UART
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param fmt is char format
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_Printf(uint8_t u8UartIndex, char* fmt,...);
/**
* @brief Get Stat Flag
*
* @param u8UartIndex UART instance
* @param eStatusType stat type
* @return FCUART STAT status flag
*/
uint32_t FCUART_GetStatus(uint8_t u8UartIndex, FCUART_StatType eStatusType);
/**
* @brief This Function is used to receive data when polling (not used when rx interrupt enabled)
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param pRxMsg is data buffer address, and pDatas need to be initialed with external buffer
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_Receive_Polling(uint8_t u8UartIndex, FCUART_DataType *pRxMsg);
/**
* @brief This Function is used to get error when polling (not used when error interrupt enabled)
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param pErrorValue is error value
* @return FCUART_ERROR_OK is ok, others are not ok
*/
FCUART_ErrorType FCUART_Error_Polling(uint8_t u8UartIndex, uint32_t *pErrorValue);
/**
* @brief This Function is used to enable fcuart loop mode
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param bStatus enable/disable status of loop mode
* @return FCUART_ERROR_OK is ok, others are not ok
*
*/
FCUART_ErrorType FCUART_SetLoopMode(uint8_t u8UartIndex, bool bStatus);
/**
* @brief This Function is used to deal with FCUART TxRx interrupt
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
*
*/
void FCUARTN_RxTx_IRQHandler(uint8_t u8UartIndex);
/**
* @brief This Function is used to send 9 bits data
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param u16Data data to send
* @return FCUART_ERROR_OK is ok, others are not ok
*
*/
FCUART_ErrorType FCUART_SendData_9Bits(uint8_t u8UartIndex, uint16_t u16Data);
/**
* @brief This Function is used to Get 9 bits data
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param pData pointer to data
* @return FCUART_ERROR_OK is ok, others are not ok
*
*/
FCUART_ErrorType FCUART_GetData_9Bits(uint8_t u8UartIndex, uint16_t *pData);
/**
* @brief This Function is used to send 10 bits data
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param u16Data data to send
* @return FCUART_ERROR_OK is ok, others are not ok
*
*/
FCUART_ErrorType FCUART_SendData_10Bits(uint8_t u8UartIndex, uint16_t u16Data);
/**
* @brief This Function is used to Get 10 bits data
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param pData pointer to data
* @return FCUART_ERROR_OK is ok, others are not ok
*
*/
FCUART_ErrorType FCUART_GetData_10Bits(uint8_t u8UartIndex, uint16_t *pData);
/**
* @brief This Function is used to set bit mode,parity and stop bit
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param pData pointer to data
* @return FCUART_ERROR_OK is ok, others are not ok
*
*/
FCUART_ErrorType FCUART_SetBitModeAndParity( uint8_t u8UartIndex,
FCUART_BitModeType eBitMode,
FCUART_StopBitNumType eStopBit,
FCUART_ParityType eParityType,
bool bParityEnable
);
/**
* @brief This Function is used to Get current interrupt mode
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param u32Data Interrupt type to get
* @return true/false
*
*/
bool FCUART_GetInterruptMode(uint8_t u8UartIndex, uint32_t u32Data);
/**
* @brief This Function is used to assign data to send through interrupt
*
* @param u8UartIndex is UART instance, 0U..(FCUART_INSTANCE_COUNT-1U)
* @param pData data pointer
* @param u32Length data length to send
* @return FCUART_ERROR_OK is ok, others are not ok
*
*/
FCUART_ErrorType FCUART_AssignTxInterruptData(uint8_t u8UartIndex, uint8_t * pData, uint32_t u32Length);
/** @}*/
#endif