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