287 lines
7.8 KiB
C
287 lines
7.8 KiB
C
/**
|
|
* Copyright (c) 2024 Wei-Lun Hsu. All Rights Reserved.
|
|
*/
|
|
/** @file hal_uart.h
|
|
*
|
|
* @author Wei-Lun Hsu
|
|
* @version 0.1
|
|
* @date 2024/09/10
|
|
* @license
|
|
* @description
|
|
*/
|
|
|
|
#ifndef __hal_uart_H_wrM7moXg_lQUd_HTJv_sOBv_uu2tvbtzutNR__
|
|
#define __hal_uart_H_wrM7moXg_lQUd_HTJv_sOBv_uu2tvbtzutNR__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
#include "hal_def.h"
|
|
//=============================================================================
|
|
// Constant Definition
|
|
//=============================================================================
|
|
typedef enum
|
|
{
|
|
UART_ERR_OK = 0,
|
|
UART_ERR_NULL_POINTER,
|
|
|
|
} UART_ErrTypeDef;
|
|
|
|
/**
|
|
* UART Word Length
|
|
*/
|
|
typedef enum
|
|
{
|
|
UART_WordLength_8b = (UART_CR_MODE_8D << UART_CR_MODE_Pos),
|
|
UART_WordLength_8b1P = (UART_CR_MODE_8D1P << UART_CR_MODE_Pos),
|
|
UART_WordLength_9b = (UART_CR_MODE_9D << UART_CR_MODE_Pos),
|
|
|
|
} UART_WordLengthTypeDef;
|
|
|
|
|
|
/**
|
|
* UART Stop Bits
|
|
*/
|
|
typedef enum
|
|
{
|
|
UART_StopBits_1 = (UART_CR_STOPB_1B << UART_CR_STOPB_Pos),
|
|
UART_StopBits_2 = (UART_CR_STOPB_2B << UART_CR_STOPB_Pos),
|
|
} UART_StopBitsTypeDef;
|
|
|
|
|
|
/**
|
|
* UART Parity
|
|
*/
|
|
typedef enum
|
|
{
|
|
UART_Parity_No = (UART_CR_PAR_EVEN << UART_CR_PAR_Pos),
|
|
UART_Parity_Even = (UART_CR_PAR_EVEN << UART_CR_PAR_Pos),
|
|
UART_Parity_Odd = (UART_CR_PAR_ODD << UART_CR_PAR_Pos),
|
|
} UART_ParityTypeDef;
|
|
|
|
|
|
/**
|
|
* UART Mode
|
|
*/
|
|
typedef enum
|
|
{
|
|
UART_Mode_Tx = 0,
|
|
UART_Mode_TxRx = UART_CR_RXEN_Msk,
|
|
|
|
} UART_ModeTypeDef;
|
|
|
|
typedef enum
|
|
{
|
|
/* tx type */
|
|
UART_IT_TX_FIFO_EMPTY = UART_IE_TXEE_Msk,
|
|
UART_IT_TX_FIFO_FULL = UART_IE_TXFE_Msk,
|
|
UART_IT_TX_FIFO_HEMPTY = UART_IE_TXHEE_Msk, // Half-Empty
|
|
UART_IT_TX_DONE = UART_IE_TXENDE_Msk,
|
|
|
|
/* rx type */
|
|
UART_IT_RX_FIFO_NO_EMPTY = UART_IE_RXNEE_Msk,
|
|
UART_IT_RX_FIFO_FULL = UART_IE_RXFE_Msk,
|
|
UART_IT_RX_FIFO_HFULL = UART_IE_RXHFE_Msk, // Half-Full
|
|
|
|
/* error type */
|
|
#if 1
|
|
UART_IT_ERR = (UART_IE_PERRE_Msk | UART_IE_FERRE_Msk | UART_IE_OVERRE_Msk | \
|
|
UART_IE_TONEE_Msk | UART_IE_TOIDLEE_Msk)
|
|
#else
|
|
UART_IT_ERR_PARITY = UART_IE_PERRE_Msk,
|
|
UART_IT_ERR_FRAME = UART_IE_FERRE_Msk,
|
|
UART_IT_ERR_OVERFLOW = UART_IE_OVERRE_Msk,
|
|
UART_IT_ERR_CLR_FIFO_TIMEOUT = UART_IE_TONEE_Msk,
|
|
UART_IT_ERR_IDLE_TIMEOUT = UART_IE_TOIDLEE_Msk,
|
|
#endif
|
|
|
|
} UART_ITTypeDef;
|
|
|
|
|
|
/**
|
|
* UART_Flags
|
|
*/
|
|
typedef enum
|
|
{
|
|
UART_FLAG_RXNE = UART_SR_RXNE_Msk, /*!< Read data register not empty */
|
|
UART_FLAG_TXE = UART_SR_TXE_Msk, /*!< Transmit data register Empty */
|
|
UART_FLAG_TXHE = UART_SR_TXHE_Msk, /*!< Transmit data register half Empty */
|
|
UART_FLAG_PERR = UART_SR_PERR_Msk, /*!< Parity error */
|
|
UART_FLAG_FERR = UART_SR_FERR_Msk, /*!< Framing error */
|
|
UART_FLAG_OVERR = UART_SR_OVERR_Msk, /*!< Overrun error */
|
|
UART_FLAG_TONE = UART_SR_TONE_Msk, /*!< TONE Interrupt enable */
|
|
UART_FLAG_TOIDLE = UART_SR_TOIDLE_Msk, /*!< TOIDLE interrupt enable */
|
|
UART_FLAG_RXHF = UART_SR_RXHF_Msk, /*!< Read data register half empty */
|
|
UART_FLAG_RXF = UART_SR_RXF_Msk, /*!< Read data register empty */
|
|
UART_FLAG_TXEND = UART_SR_TXEND_Msk, /*!< TXEND interrupt enable */
|
|
UART_FLAG_TXF = UART_SR_TXF_Msk, /*!< TXF interrupt enable */
|
|
} UART_FlagTypeDef;
|
|
|
|
//=============================================================================
|
|
// Macro Definition
|
|
//=============================================================================
|
|
/**
|
|
* \brief Uart reset/clear reception FIFO
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \return
|
|
* None
|
|
*/
|
|
__STATIC_FORCEINLINE void UART_ResetRxFIFO(UART_Type *pHUart)
|
|
{
|
|
REG_WRITE(pHUart->RXFR, 0xe930);
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* \brief Uart reset/clear transmission FIFO
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \return
|
|
* None
|
|
*/
|
|
__STATIC_FORCEINLINE void UART_ResetTxFIFO(UART_Type *pHUart)
|
|
{
|
|
REG_WRITE(pHUart->TXFR, 0xe930);
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* \brief Start UART module
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \return
|
|
* None
|
|
*/
|
|
__STATIC_FORCEINLINE void UART_Start(UART_Type *pHUart)
|
|
{
|
|
REG_SET_BITS(pHUart->CR, UART_CR_RUN_Msk);
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* \brief Stop UART module
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \return
|
|
*
|
|
*/
|
|
__STATIC_FORCEINLINE void UART_Stop(UART_Type *pHUart)
|
|
{
|
|
REG_CLR_BITS(pHUart->CR, UART_CR_RUN_Msk);
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* \brief Wait UART module Tx FIFO empty
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \return
|
|
* None
|
|
*/
|
|
__STATIC_FORCEINLINE void UART_WaitTxFifoEmpty(UART_Type *pHUart)
|
|
{
|
|
while( !REG_READ_MASK(pHUart->SR, UART_SR_TXE_Msk) );
|
|
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* \brief Get the interrupt status
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \param [in] flags The target interrupt types, @ref UART_ITTypeDef
|
|
* \return
|
|
* status, @ref UART_ITTypeDef
|
|
*/
|
|
__STATIC_FORCEINLINE uint32_t UART_GetITStatus(UART_Type *pHUart, uint32_t flags)
|
|
{
|
|
return REG_READ_MASK(pHUart->SR, flags);
|
|
}
|
|
|
|
/**
|
|
* \brief Get the status of UART
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \param [in] flags The specifies flags to check, @ref UART_FlagTypeDef
|
|
* \return
|
|
* The new state of flags (SET or RESET)
|
|
*/
|
|
__STATIC_FORCEINLINE FlagStatus UART_GetFlagStatus(UART_Type *pHUart, UART_FlagTypeDef flags)
|
|
{
|
|
return (pHUart->SR & flags) ? SET : RESET;
|
|
}
|
|
//=============================================================================
|
|
// Structure Definition
|
|
//=============================================================================
|
|
typedef struct
|
|
{
|
|
uint32_t BaudRate;
|
|
UART_WordLengthTypeDef WordLength;
|
|
UART_StopBitsTypeDef StopBits;
|
|
UART_ParityTypeDef Parity;
|
|
UART_ModeTypeDef Mode;
|
|
|
|
} UART_InitTypeDef;
|
|
//=============================================================================
|
|
// Global Data Definition
|
|
//=============================================================================
|
|
|
|
//=============================================================================
|
|
// Private Function Definition
|
|
//=============================================================================
|
|
|
|
//=============================================================================
|
|
// Public Function Definition
|
|
//=============================================================================
|
|
/**
|
|
* \brief Initialize UART module
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \param [in] pInit Pointer to a init structure, @ref UART_InitTypeDef
|
|
* \return
|
|
* Error number, @ref UART_ErrTypeDef
|
|
*/
|
|
UART_ErrTypeDef UART_Init(UART_Type *pHUart, UART_InitTypeDef *pInit);
|
|
|
|
/**
|
|
* \brief Send data througn UART module
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \param [in] value the sent data
|
|
* \return
|
|
* None
|
|
*/
|
|
void UART_SendData(UART_Type *pHUart, uint16_t value);
|
|
|
|
/**
|
|
* \brief Receive data through UART module
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \return
|
|
* received data
|
|
*/
|
|
uint16_t UART_ReceiveData(UART_Type *pHUart);
|
|
|
|
/**
|
|
* \brief Configure the interrupts of UART module
|
|
*
|
|
* \param [in] pHUart Pointer to a UART handle
|
|
* \param [in] flags The target interrupt types, @ref UART_ITTypeDef
|
|
* \param [in] is_enable enable or disable interrupts (0: disable, others: enable)
|
|
* \return
|
|
* Error number, @ref UART_ErrTypeDef
|
|
*/
|
|
UART_ErrTypeDef UART_ITConfig(UART_Type *pHUart, uint32_t flags, uint32_t is_enable);
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|