From 67ca69985af9109a0603a1cde71f21b940c059ff Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期四, 15 五月 2025 09:12:53 +0800
Subject: [PATCH] 完全将免布线标签代码移植过来版本

---
 keil/include/components/hal/UART.c |  472 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 472 insertions(+), 0 deletions(-)

diff --git a/keil/include/components/hal/UART.c b/keil/include/components/hal/UART.c
new file mode 100644
index 0000000..f8a7388
--- /dev/null
+++ b/keil/include/components/hal/UART.c
@@ -0,0 +1,472 @@
+/*******************************************************************************
+ * File Name         : Uart.c
+ * Description       :
+ * Created on        : 2018年4月24日
+ * Author            : 杜键
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                              Include Files                                  *
+ *******************************************************************************/
+#include "string.h"
+#ifdef _USE_OS_
+#include "cmsis_os.h"
+#endif
+#include <stdio.h>
+#include "HIDO_Util.h"
+#include "HIDO_VLQueue.h"
+#include "HIDO_ArraryQueue.h"
+#include "HIDO_Lock.h"
+#include "HIDO_ATLite.h"
+
+#include "UART.h"
+
+/*******************************************************************************
+ *                                  Macro                                      *
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                             Type Definition                                 *
+ *******************************************************************************/
+typedef struct
+{
+#ifdef _USE_OS_
+    osMutexId m_mutexLock;
+#endif
+    E_UartID m_eUartID;
+    enum UART_DEV_T m_eUartPort;
+
+    E_UartTxMode m_eTxMode;
+    E_UartRxMode m_eRxMode;
+
+    HIDO_UINT8 *m_pu8RxBuf;
+    HIDO_UINT32 m_u32RxBufSize;
+    HIDO_UINT8 *m_pu8RxLastPos;
+    HIDO_UINT8 *m_pu8RxBufEnd;
+    HIDO_ArraryQueueStruct m_stRxArraryQueue;
+
+    HIDO_UINT8 *m_pu8TxBuf;
+    HIDO_UINT32 m_u32TxBufSize;
+    HIDO_UINT32 m_u32TxQueueMemberCnt;
+    HIDO_VLQStruct m_stTxVLQueue;
+
+    HIDO_UINT8 m_u8RxValue;
+    HIDO_UINT32 m_u32Flag;
+    FN_RxISR m_fnRxISR;
+} ST_UartInfo;
+
+/*******************************************************************************
+ *                             Local Variable                                  *
+ *******************************************************************************/
+static ST_UartInfo l_astUartInfo[UART_ID_LAST];
+
+/*******************************************************************************
+ *                        Local Function Declaration                           *
+ *******************************************************************************/
+static void uart_receive_callback(void *dev, uint32_t err_code);
+
+const static struct baud_map
+{
+    enum UART_BAUD_T baud;
+    HIDO_UINT32 u32Baud;
+} baud_map[] = 
+{
+    {BAUD_1200,    1200},
+    {BAUD_2400,    2400},
+    {BAUD_4800,    4800},
+    {BAUD_9600,    9600},
+    {BAUD_19200,   19200},
+    {BAUD_38400,   38400},
+    {BAUD_57600,   57600},
+    {BAUD_115200,  115200},
+    {BAUD_230400,  230400},
+    {BAUD_460800,  460800},
+    {BAUD_921600,  921600},
+    {BAUD_1843200, 1843200},
+    {BAUD_1000000, 1000000},
+    {BAUD_2000000, 2000000},
+};
+
+/*******************************************************************************
+ *                             Local Function                                  *
+ *******************************************************************************/
+static enum UART_BAUD_T get_baud(HIDO_UINT32 u32Baud)
+{
+    for(HIDO_UINT32 i = 0; i < HIDO_ARRARY_COUNT(baud_map); i++)
+    {
+        if(u32Baud == baud_map[i].u32Baud)
+        {
+            return baud_map[i].baud;
+        }
+    }
+    
+    return BAUD_115200;
+}
+
+/*******************************************************************************
+ *                             Global Function                                 *
+ *******************************************************************************/
+
+/*******************************************************************************
+ * Function Name     : 
+ * Description       : 
+ * Input             : 
+ * Output            : 
+ * Return            : 
+ * Author            : 杜键
+ * Modified Date:    : 2018年4月24日
+ *******************************************************************************/
+HIDO_INT32 Uart_Register(E_UartID _eUartID, enum UART_DEV_T _ePort)
+{
+    /* 初始化参数 */
+    HIDO_UtilBzero(&l_astUartInfo[_eUartID], sizeof(ST_UartInfo));
+    
+    l_astUartInfo[_eUartID].m_eUartPort = _ePort;
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     :
+ * Description       :
+ * Input             :
+ * Output            :
+ * Return            :
+ * Author            : 杜键
+ * Modified Date:    : 2018年4月24日
+ *******************************************************************************/
+HIDO_INT32 Uart_Init(E_UartID _eUartID, ST_UartInit *_pstInit)
+{
+    if((HIDO_NULL == _pstInit) || (_eUartID >= UART_ID_LAST))
+    {
+        return HIDO_ERR;
+    }
+
+#ifdef _USE_OS_
+    l_astUartInfo[_eUartID].m_mutexLock =  osMutexCreate(HIDO_NULL);
+#endif
+    
+    struct UART_CFG_T uart_cfg =
+    {
+        .parity = UART_PARITY_NONE,
+        .stop = UART_STOP_BITS_1,
+        .data = UART_DATA_BITS_8,
+        .flow = UART_FLOW_CONTROL_NONE,
+        .rx_level = UART_RXFIFO_CHAR_1,
+        .tx_level = UART_TXFIFO_EMPTY,
+        .baud = get_baud(_pstInit->m_u32BaudRate),
+        .dma_en = false,
+        .int_rx = true,
+        .int_tx = false,
+    };
+
+    l_astUartInfo[_eUartID].m_eUartID = _eUartID;
+    l_astUartInfo[_eUartID].m_eTxMode = _pstInit->m_eTxMode;
+    l_astUartInfo[_eUartID].m_eRxMode = _pstInit->m_eRxMode;
+
+    l_astUartInfo[_eUartID].m_pu8RxBuf = _pstInit->m_pu8RxBuf;
+    l_astUartInfo[_eUartID].m_u32RxBufSize = _pstInit->m_u32RxBufSize;
+    if(UART_RX_MODE_DMA == _pstInit->m_eRxMode)
+    {
+        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;
+    }
+    else if(UART_RX_MODE_INT == _pstInit->m_eRxMode)
+    {
+        HIDO_ArraryQueueInit(
+                &l_astUartInfo[_eUartID].m_stRxArraryQueue,
+                _pstInit->m_pu8RxBuf,
+                _pstInit->m_u32RxBufSize,
+                sizeof(HIDO_UINT8));
+    }
+
+    l_astUartInfo[_eUartID].m_pu8TxBuf = _pstInit->m_pu8TxBuf;
+    l_astUartInfo[_eUartID].m_u32TxBufSize = _pstInit->m_u32TxBufSize;
+    l_astUartInfo[_eUartID].m_fnRxISR = _pstInit->m_fnRxISR;
+    l_astUartInfo[_eUartID].m_u32TxQueueMemberCnt = _pstInit->m_u32TxQueueMemberCnt;
+    
+    uart_open(l_astUartInfo[_eUartID].m_eUartPort, &uart_cfg);
+
+    if((UART_TX_MODE_DMA == _pstInit->m_eTxMode) || (UART_TX_MODE_INT == _pstInit->m_eTxMode))
+    {
+        HIDO_VLQInit(
+                &(l_astUartInfo[_eUartID].m_stTxVLQueue),
+                _pstInit->m_pu8TxBuf,
+                _pstInit->m_u32TxBufSize,
+                _pstInit->m_u32TxQueueMemberCnt);
+    }
+
+    if (UART_RX_MODE_INT == _pstInit->m_eRxMode)
+    {
+        uart_receive(l_astUartInfo[_eUartID].m_eUartPort, &l_astUartInfo[_eUartID].m_u8RxValue, 1, uart_receive_callback);
+    }
+
+    return HIDO_OK;
+}
+
+
+/*******************************************************************************
+ * Function Name     :
+ * Description       :
+ * Input             :
+ * Output            :
+ * Return            :
+ * Author            : 杜键
+ * Modified Date:    : 2018年4月24日
+ *******************************************************************************/
+HIDO_INT32 Uart_ReInit(E_UartID _eUartID)
+{
+    if(UART_RX_MODE_DMA == l_astUartInfo[_eUartID].m_eRxMode)
+    {
+        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;
+    }
+    else if(UART_RX_MODE_INT ==  l_astUartInfo[_eUartID].m_eRxMode)
+    {
+        HIDO_ArraryQueueInit(
+                &l_astUartInfo[_eUartID].m_stRxArraryQueue,
+                l_astUartInfo[_eUartID].m_pu8RxBuf,
+                l_astUartInfo[_eUartID].m_u32RxBufSize,
+                sizeof(HIDO_UINT8));
+    }
+
+    if((UART_TX_MODE_DMA == l_astUartInfo[_eUartID].m_eTxMode) || (UART_TX_MODE_INT == l_astUartInfo[_eUartID].m_eTxMode))
+    {
+        HIDO_VLQInit(
+                &(l_astUartInfo[_eUartID].m_stTxVLQueue),
+                l_astUartInfo[_eUartID].m_pu8TxBuf,
+                l_astUartInfo[_eUartID].m_u32TxBufSize,
+                l_astUartInfo[_eUartID].m_u32TxQueueMemberCnt);
+    }
+
+    uart_receive(l_astUartInfo[_eUartID].m_eUartPort, &l_astUartInfo[_eUartID].m_u8RxValue, 1, uart_receive_callback);
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     :
+ * Description       :
+ * Input             :
+ * Output            :
+ * Return            :
+ * Author            : 杜键
+ * Modified Date:    : 2018年4月24日
+ *******************************************************************************/
+HIDO_INT32 Uart_ReConfigBaudRate(E_UartID _eUartID, HIDO_UINT32 _u32BaudRate)
+{
+    uart_close(l_astUartInfo[_eUartID].m_eUartPort);
+
+    struct UART_CFG_T uart_cfg =
+    {
+        .parity = UART_PARITY_NONE,
+        .stop = UART_STOP_BITS_1,
+        .data = UART_DATA_BITS_8,
+        .flow = UART_FLOW_CONTROL_NONE,
+        .rx_level = UART_RXFIFO_CHAR_1,
+        .tx_level = UART_TXFIFO_EMPTY,
+        .baud = get_baud(_u32BaudRate),
+        .dma_en = false,
+        .int_rx = true,
+        .int_tx = false,
+    };
+    
+    uart_open(l_astUartInfo[_eUartID].m_eUartPort, &uart_cfg);
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     :
+ * Description       :
+ * Input             :
+ * Output            :
+ * Return            :
+ * Author            : 杜键
+ * Modified Date:    : 2018年4月24日
+ *******************************************************************************/
+static void uart_send_callback(void *dev, uint32_t err_code)
+{
+    E_UartID eUartID = (E_UartID) 0;
+
+    for (eUartID = (E_UartID) 0; eUartID < UART_ID_LAST; eUartID++)
+    {
+        if (l_astUartInfo[eUartID].m_eUartPort == *(enum UART_DEV_T *)dev)
+        {
+            if(UART_TX_MODE_DMA == l_astUartInfo[eUartID].m_eTxMode)
+            {
+                HIDO_VLQMemberStruct *pstMember = HIDO_NULL;
+
+                pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[eUartID].m_stTxVLQueue));
+                HIDO_VLQDequeue(&(l_astUartInfo[eUartID].m_stTxVLQueue), pstMember);
+
+                pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[eUartID].m_stTxVLQueue));
+                if (pstMember)
+                {
+                    uart_send(l_astUartInfo[eUartID].m_eUartPort, pstMember->m_pDataAddr, pstMember->m_u32DataLen, uart_send_callback);
+                }
+            }
+            else if(UART_TX_MODE_INT == l_astUartInfo[eUartID].m_eTxMode)
+            {
+                HIDO_VLQMemberStruct *pstMember = HIDO_NULL;
+
+                pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[eUartID].m_stTxVLQueue));
+                HIDO_VLQDequeue(&(l_astUartInfo[eUartID].m_stTxVLQueue), pstMember);
+
+                pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[eUartID].m_stTxVLQueue));
+                if (pstMember)
+                {
+                    uart_send(l_astUartInfo[eUartID].m_eUartPort, pstMember->m_pDataAddr, pstMember->m_u32DataLen, uart_send_callback);
+                }
+            }
+
+            break;
+        }
+    }
+}
+
+
+/*******************************************************************************
+ * Function Name     : Uart_RxOverFromISR
+ * Description       :
+ * Input             :
+ * Output            :
+ * Return            :
+ * Author            : 杜键
+ * Modified Date:    : 2018年4月24日
+ *******************************************************************************/
+static void uart_receive_callback(void *dev, uint32_t err_code)
+{
+    E_UartID eUartID = UART_ID_4G;
+    
+    HIDO_UINT8 u8RecvByte = l_astUartInfo[eUartID].m_u8RxValue;
+
+    HIDO_ArraryQueueIn(&l_astUartInfo[eUartID].m_stRxArraryQueue, &u8RecvByte);
+
+    /* 启动INT接收 */
+    uart_receive(l_astUartInfo[eUartID].m_eUartPort, &l_astUartInfo[eUartID].m_u8RxValue, 1, uart_receive_callback);
+}
+
+/*******************************************************************************
+ * Function Name     :
+ * Description       :
+ * Input             :
+ * Output            :
+ * Return            :
+ * Author            : 杜键
+ * Modified Date:    : 2018年4月24日
+ *******************************************************************************/
+HIDO_INT32 Uart_GetChar(E_UartID _eUartID, HIDO_UINT8 *_pu8Char)
+{
+    HIDO_INT32 i32Result = HIDO_ERR;
+
+    if (HIDO_NULL == _pu8Char || _eUartID >= UART_ID_LAST)
+    {
+        return HIDO_ERR;
+    }
+
+#ifdef _USE_OS_
+    osMutexWait(l_astUartInfo[_eUartID].m_mutexLock, osWaitForever);
+#endif
+
+    if (UART_RX_MODE_INT == l_astUartInfo[_eUartID].m_eRxMode)
+    {
+        if (HIDO_ArraryQueueOut(&l_astUartInfo[_eUartID].m_stRxArraryQueue, _pu8Char) == HIDO_OK)
+        {
+            i32Result = HIDO_OK;
+        }
+    }
+
+#ifdef _USE_OS_
+    osMutexRelease(l_astUartInfo[_eUartID].m_mutexLock);
+#endif
+
+    return i32Result;
+}
+
+/*******************************************************************************
+ * Function Name     :
+ * Description       :
+ * Input             :
+ * Output            :
+ * Return            :
+ * Author            : 杜键
+ * Modified Date:    : 2018年4月24日
+ *******************************************************************************/
+HIDO_INT32 Uart_Send(E_UartID _eUartID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len)
+{
+    HIDO_INT32 i32Result = HIDO_OK;
+
+    if (HIDO_NULL == _pu8Data || 0 == _u32Len || _eUartID >= UART_ID_LAST)
+    {
+        return HIDO_ERR;
+    }
+
+#ifdef _USE_OS_
+    osMutexWait(l_astUartInfo[_eUartID].m_mutexLock, osWaitForever);
+#endif
+
+    if (UART_TX_MODE_DMA == l_astUartInfo[_eUartID].m_eTxMode)
+    {
+        HIDO_VLQMemberStruct *pstMember = HIDO_NULL;
+
+        HIDO_Lock();
+        pstMember = HIDO_VLQGetEnqueueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue), _u32Len);
+
+        if (HIDO_NULL == pstMember)
+        {
+            HIDO_UnLock();
+            i32Result = HIDO_ERR;
+        }
+        else
+        {
+            HIDO_VLQEnqueue(&(l_astUartInfo[_eUartID].m_stTxVLQueue), pstMember);
+            memcpy(pstMember->m_pDataAddr, _pu8Data, _u32Len);
+            pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue));
+            HIDO_UnLock();
+            
+            uart_send(l_astUartInfo[_eUartID].m_eUartPort, pstMember->m_pDataAddr, pstMember->m_u32DataLen, uart_send_callback);
+        }
+    }
+    else if (UART_TX_MODE_INT == l_astUartInfo[_eUartID].m_eTxMode)
+    {
+        HIDO_VLQMemberStruct *pstMember = HIDO_NULL;
+
+        HIDO_Lock();
+        pstMember = HIDO_VLQGetEnqueueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue), _u32Len);
+
+        if (HIDO_NULL == pstMember)
+        {
+            HIDO_UnLock();
+            i32Result = HIDO_ERR;
+        }
+        else
+        {
+            HIDO_VLQEnqueue(&(l_astUartInfo[_eUartID].m_stTxVLQueue), pstMember);
+            memcpy(pstMember->m_pDataAddr, _pu8Data, _u32Len);
+            pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue));
+            HIDO_UnLock();
+
+            uart_send(l_astUartInfo[_eUartID].m_eUartPort, pstMember->m_pDataAddr, pstMember->m_u32DataLen, uart_send_callback);
+        }
+    }
+    else if (UART_TX_MODE_POLL == l_astUartInfo[_eUartID].m_eTxMode)
+    {
+        uart_send(l_astUartInfo[_eUartID].m_eUartPort, _pu8Data, _u32Len, NULL);
+    }
+
+#ifdef _USE_OS_
+    osMutexRelease(l_astUartInfo[_eUartID].m_mutexLock);
+#endif
+
+    return i32Result;
+}
+HIDO_VOID HIDO_Lock(void)
+{
+    int_lock();
+}
+HIDO_VOID HIDO_UnLock(void)
+{
+    uint32_t lock = int_lock();
+    int_unlock(lock);
+}

--
Gitblit v1.9.3