yincheng.zhong
3 天以前 26db5e14522173c274ac954c867d2ebe5d8ca3ac
STM32H743/HAL/Uart.c
@@ -1,8 +1,8 @@
/*******************************************************************************
 * File Name         : Uart.c
 * Description       :
 * Created on        : 2018年4月24日
 * Author            : 杜键
 * Created on        : 2018��4��24��
 * Author            : �ż�
 *******************************************************************************/
/*******************************************************************************
@@ -50,6 +50,7 @@
    HIDO_UINT32 m_u32TxBufSize;
    HIDO_UINT32 m_u32TxQueueMemberCnt;
    HIDO_VLQStruct m_stTxVLQueue;
    HIDO_BOOL m_bTxBusy;
    HIDO_UINT32 m_u32RxValue;
    HIDO_UINT32 m_u32Flag;
@@ -122,12 +123,12 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
static HIDO_VOID Uart_RXDMAEnable(E_UartID _eUartID)
{
    /* 当产生溢出错误时,需要将数据读空 */
    /* �������������ʱ����Ҫ�����ݶ��� */
    while (l_astUartInfo[_eUartID].m_pstUart->Instance->ISR & UART_FLAG_ORE)
    {
        volatile HIDO_UINT16 u16Data = l_astUartInfo[_eUartID].m_pstUart->Instance->RDR;
@@ -140,7 +141,7 @@
    l_astUartInfo[_eUartID].m_pu8RxLastPos = l_astUartInfo[_eUartID].m_pu8RxBuf;
    l_astUartInfo[_eUartID].m_pu8RxBufEnd = l_astUartInfo[_eUartID].m_pu8RxBuf + l_astUartInfo[_eUartID].m_u32RxBufSize - 1;
    /* 启动DMA接收 */
    /* ����DMA���� */
    HAL_UARTEx_ReceiveToIdle_DMA(l_astUartInfo[_eUartID].m_pstUart, l_astUartInfo[_eUartID].m_pu8RxBuf, l_astUartInfo[_eUartID].m_u32RxBufSize);
}
@@ -150,12 +151,12 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
static HIDO_VOID Uart_RXINTEnable(E_UartID _eUartID)
{
    /* 当产生溢出错误时,需要将数据读空 */
    /* �������������ʱ����Ҫ�����ݶ��� */
    while (l_astUartInfo[_eUartID].m_pstUart->Instance->ISR & UART_FLAG_ORE)
    {
        volatile HIDO_UINT16 u16Data = l_astUartInfo[_eUartID].m_pstUart->Instance->RDR;
@@ -165,7 +166,7 @@
        __HAL_UART_CLEAR_OREFLAG(l_astUartInfo[_eUartID].m_pstUart);
    }
    /* 启动INT接收 */
    /* ����INT���� */
    HAL_UART_Receive_IT(l_astUartInfo[_eUartID].m_pstUart, (HIDO_UINT8 *)&l_astUartInfo[_eUartID].m_u32RxValue, sizeof(HIDO_UINT8));
}
@@ -178,8 +179,8 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
HIDO_INT32 Uart_GetHandle(E_UartID _eUartID, HIDO_VOID **_ppUart)
{
@@ -199,8 +200,8 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
HIDO_INT32 Uart_Register(E_UartID _eUartID, HIDO_VOID *_pUart)
{
@@ -209,7 +210,7 @@
        return HIDO_ERR;
    }
    /* 初始化参数 */
    /* ��ʼ������ */
    HIDO_UtilBzero(&l_astUartInfo[_eUartID], sizeof(ST_UartInfo));
    l_astUartInfo[_eUartID].m_pstUart = (UART_HandleTypeDef *)_pUart;
@@ -223,8 +224,8 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
HIDO_INT32 Uart_Init(E_UartID _eUartID, ST_UartInit *_pstInit)
{
@@ -269,16 +270,17 @@
            _pstInit->m_pu8TxBuf,
            _pstInit->m_u32TxBufSize,
            _pstInit->m_u32TxQueueMemberCnt);
        l_astUartInfo[_eUartID].m_bTxBusy = HIDO_FALSE;
    }
    if (UART_RX_MODE_DMA == _pstInit->m_eRxMode)
    {
        /* 启动DMA接收 */
        /* ����DMA���� */
        Uart_RXDMAEnable(_eUartID);
    }
    else if (UART_RX_MODE_INT == _pstInit->m_eRxMode || UART_RX_MODE_INT_ISR == _pstInit->m_eRxMode)
    {
        /* 启动INT接收 */
        /* ����INT���� */
        Uart_RXINTEnable(_eUartID);
    }
@@ -291,8 +293,8 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
HIDO_INT32 Uart_ReInit(E_UartID _eUartID)
{
@@ -317,16 +319,17 @@
            l_astUartInfo[_eUartID].m_pu8TxBuf,
            l_astUartInfo[_eUartID].m_u32TxBufSize,
            l_astUartInfo[_eUartID].m_u32TxQueueMemberCnt);
        l_astUartInfo[_eUartID].m_bTxBusy = HIDO_FALSE;
    }
    if (UART_RX_MODE_DMA == l_astUartInfo[_eUartID].m_eRxMode)
    {
        /* 启动DMA接收 */
        /* ����DMA���� */
        Uart_RXDMAEnable(_eUartID);
    }
    else if (UART_RX_MODE_INT == l_astUartInfo[_eUartID].m_eRxMode || UART_RX_MODE_INT_ISR == l_astUartInfo[_eUartID].m_eRxMode)
    {
        /* 启动INT接收 */
        /* ����INT���� */
        Uart_RXINTEnable(_eUartID);
    }
@@ -339,8 +342,8 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
HIDO_INT32 Uart_ReConfigBaudRate(E_UartID _eUartID, HIDO_UINT32 _u32BaudRate)
{
@@ -364,8 +367,8 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
HIDO_VOID Uart_RxErrorFromISR(HIDO_VOID *_pUart)
{
@@ -377,12 +380,12 @@
        {
            if (UART_RX_MODE_DMA == l_astUartInfo[eUartID].m_eRxMode)
            {
                /* 启动DMA接收 */
                /* ����DMA���� */
                Uart_RXDMAEnable(eUartID);
            }
            else if (UART_RX_MODE_INT == l_astUartInfo[eUartID].m_eRxMode || UART_RX_MODE_INT_ISR == l_astUartInfo[eUartID].m_eRxMode)
            {
                /* 启动INT接收 */
                /* ����INT���� */
                Uart_RXINTEnable(eUartID);
            }
            break;
@@ -396,8 +399,8 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
HIDO_VOID Uart_TxOverFromISR(HIDO_VOID *_pUart)
{
@@ -420,6 +423,10 @@
                    HAL_UART_Transmit_DMA(l_astUartInfo[eUartID].m_pstUart, pstMember->m_pDataAddr,
                                          pstMember->m_u32DataLen);
                }
                else
                {
                    l_astUartInfo[eUartID].m_bTxBusy = HIDO_FALSE;
                }
            }
            else if (UART_TX_MODE_INT == l_astUartInfo[eUartID].m_eTxMode)
            {
@@ -434,6 +441,10 @@
                    HAL_UART_Transmit_IT(l_astUartInfo[eUartID].m_pstUart, pstMember->m_pDataAddr,
                                         pstMember->m_u32DataLen);
                }
                else
                {
                    l_astUartInfo[eUartID].m_bTxBusy = HIDO_FALSE;
                }
            }
            break;
@@ -447,8 +458,8 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
HIDO_VOID Uart_RxOverFromISR(HIDO_VOID *_pUart)
{
@@ -464,7 +475,7 @@
                HIDO_ArraryQueueIn(&l_astUartInfo[eUartID].m_stRxArraryQueue, &u8RecvByte);
                /* 启动INT接收 */
                /* ����INT���� */
                Uart_RXINTEnable(eUartID);
            }
            else if (UART_RX_MODE_INT_ISR == l_astUartInfo[eUartID].m_eRxMode)
@@ -474,7 +485,7 @@
                    l_astUartInfo[eUartID].m_fnRxISR(l_astUartInfo[eUartID].m_u32RxValue);
                }
                /* 启动INT接收 */
                /* ����INT���� */
                Uart_RXINTEnable(eUartID);
            }
@@ -489,8 +500,8 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
HIDO_INT32 Uart_GetChar(E_UartID _eUartID, HIDO_UINT8 *_pu8Char)
{
@@ -549,8 +560,8 @@
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 * Author            : �ż�
 * Modified Date:    : 2018��4��24��
 *******************************************************************************/
HIDO_INT32 Uart_Send(E_UartID _eUartID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len)
{
@@ -573,6 +584,7 @@
    if (UART_TX_MODE_DMA == l_astUartInfo[_eUartID].m_eTxMode)
    {
        HIDO_VLQMemberStruct *pstMember = HIDO_NULL;
        HIDO_BOOL bStartTx = HIDO_FALSE;
        HIDO_Lock();
        pstMember = HIDO_VLQGetEnqueueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue), _u32Len);
@@ -586,15 +598,24 @@
        {
            HIDO_VLQEnqueue(&(l_astUartInfo[_eUartID].m_stTxVLQueue), pstMember);
            memcpy(pstMember->m_pDataAddr, _pu8Data, _u32Len);
            if (HIDO_FALSE == l_astUartInfo[_eUartID].m_bTxBusy)
            {
                l_astUartInfo[_eUartID].m_bTxBusy = HIDO_TRUE;
            pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue));
                bStartTx = HIDO_TRUE;
            }
            HIDO_UnLock();
            if (bStartTx && pstMember)
            {
            HAL_UART_Transmit_DMA(l_astUartInfo[_eUartID].m_pstUart, pstMember->m_pDataAddr, pstMember->m_u32DataLen);
            }
        }
    }
    else if (UART_TX_MODE_INT == l_astUartInfo[_eUartID].m_eTxMode)
    {
        HIDO_VLQMemberStruct *pstMember = HIDO_NULL;
        HIDO_BOOL bStartTx = HIDO_FALSE;
        HIDO_Lock();
        pstMember = HIDO_VLQGetEnqueueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue), _u32Len);
@@ -608,12 +629,20 @@
        {
            HIDO_VLQEnqueue(&(l_astUartInfo[_eUartID].m_stTxVLQueue), pstMember);
            memcpy(pstMember->m_pDataAddr, _pu8Data, _u32Len);
            if (HIDO_FALSE == l_astUartInfo[_eUartID].m_bTxBusy)
            {
                l_astUartInfo[_eUartID].m_bTxBusy = HIDO_TRUE;
            pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue));
                bStartTx = HIDO_TRUE;
            }
            HIDO_UnLock();
            if (bStartTx && pstMember)
            {
            HAL_UART_Transmit_IT(l_astUartInfo[_eUartID].m_pstUart, pstMember->m_pDataAddr, pstMember->m_u32DataLen);
        }
    }
    }
    else if (UART_TX_MODE_POLL == l_astUartInfo[_eUartID].m_eTxMode)
    {
        HAL_UART_Transmit(l_astUartInfo[_eUartID].m_pstUart, _pu8Data, _u32Len, _u32Len * 100);