From 30303d366d1a0d857357c90bed876686f2d1e603 Mon Sep 17 00:00:00 2001
From: yincheng.zhong <634916154@qq.com>
Date: 星期二, 18 十一月 2025 19:44:21 +0800
Subject: [PATCH] 添加新的文件

---
 STM32H743/HAL/Uart.c |  115 ++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 72 insertions(+), 43 deletions(-)

diff --git a/STM32H743/HAL/Uart.c b/STM32H743/HAL/Uart.c
index ccb7432..3d83532 100644
--- a/STM32H743/HAL/Uart.c
+++ b/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);
-            pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue));
+            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();
 
-            HAL_UART_Transmit_DMA(l_astUartInfo[_eUartID].m_pstUart, pstMember->m_pDataAddr, pstMember->m_u32DataLen);
+            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,10 +629,18 @@
         {
             HIDO_VLQEnqueue(&(l_astUartInfo[_eUartID].m_stTxVLQueue), pstMember);
             memcpy(pstMember->m_pDataAddr, _pu8Data, _u32Len);
-            pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue));
+            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();
 
-            HAL_UART_Transmit_IT(l_astUartInfo[_eUartID].m_pstUart, pstMember->m_pDataAddr, pstMember->m_u32DataLen);
+            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)

--
Gitblit v1.9.3