yincheng.zhong
3 天以前 2ebb8217f43b69f491620423ea4d5d5944d1f91d
keil/include/components/hal/UART.c
@@ -69,7 +69,7 @@
{
    enum UART_BAUD_T baud;
    HIDO_UINT32 u32Baud;
} baud_map[] =
} baud_map[] =
{
    {BAUD_1200,    1200},
    {BAUD_2400,    2400},
@@ -99,7 +99,7 @@
            return baud_map[i].baud;
        }
    }
    return BAUD_115200;
}
@@ -108,11 +108,11 @@
 *******************************************************************************/
/*******************************************************************************
 * Function Name     :
 * Description       :
 * Input             :
 * Output            :
 * Return            :
 * Function Name     :
 * Description       :
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 *******************************************************************************/
@@ -120,7 +120,7 @@
{
    /* 初始化参数 */
    HIDO_UtilBzero(&l_astUartInfo[_eUartID], sizeof(ST_UartInfo));
    l_astUartInfo[_eUartID].m_eUartPort = _ePort;
    return HIDO_OK;
@@ -145,8 +145,8 @@
#ifdef _USE_OS_
    l_astUartInfo[_eUartID].m_mutexLock =  osMutexCreate(HIDO_NULL);
#endif
struct UART_CFG_T uart_cfg =
    struct UART_CFG_T uart_cfg =
    {
        .parity = UART_PARITY_NONE,
        .stop = UART_STOP_BITS_1,
@@ -155,8 +155,8 @@
        .rx_level = UART_RXFIFO_CHAR_1,
        .tx_level = UART_TXFIFO_EMPTY,
        .baud = get_baud(_pstInit->m_u32BaudRate),
        .dma_en = false,
        .int_rx = true,
        .dma_en = true,
        .int_rx = false,
        .int_tx = false,
    };
@@ -168,32 +168,36 @@
    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;
        HIDO_ArraryQueueInit(
            &l_astUartInfo[_eUartID].m_stRxArraryQueue,
            _pstInit->m_pu8RxBuf,
            _pstInit->m_u32RxBufSize,
            sizeof(HIDO_UINT8));
        return HIDO_OK;
    }
    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_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);
            &(l_astUartInfo[_eUartID].m_stTxVLQueue),
            _pstInit->m_pu8TxBuf,
            _pstInit->m_u32TxBufSize,
            _pstInit->m_u32TxQueueMemberCnt);
    }
    if (UART_RX_MODE_INT == _pstInit->m_eRxMode)
@@ -224,19 +228,19 @@
    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));
            &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);
            &(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);
@@ -270,7 +274,7 @@
        .int_rx = true,
        .int_tx = false,
    };
    uart_open(l_astUartInfo[_eUartID].m_eUartPort, &uart_cfg);
    return HIDO_OK;
@@ -337,25 +341,14 @@
 *******************************************************************************/
static void uart_receive_callback(void *dev, uint32_t err_code)
{
    E_UartID eUartID = (E_UartID) 0;
    E_UartID eUartID = UART_ID_4G;
    for (eUartID = (E_UartID) 0; eUartID < UART_ID_LAST; eUartID++)
    {
        if (l_astUartInfo[eUartID].m_eUartPort == *(enum UART_DEV_T *)dev)
        {
            if(UART_RX_MODE_INT == l_astUartInfo[eUartID].m_eRxMode)
            {
                HIDO_UINT8 u8RecvByte = l_astUartInfo[eUartID].m_u8RxValue;
    HIDO_UINT8 u8RecvByte = l_astUartInfo[eUartID].m_u8RxValue;
                HIDO_ArraryQueueIn(&l_astUartInfo[eUartID].m_stRxArraryQueue, &u8RecvByte);
    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);
            }
            break;
        }
    }
    /* 启动INT接收 */
    uart_receive(l_astUartInfo[eUartID].m_eUartPort, &l_astUartInfo[eUartID].m_u8RxValue, 1, uart_receive_callback);
}
/*******************************************************************************
@@ -380,12 +373,17 @@
    osMutexWait(l_astUartInfo[_eUartID].m_mutexLock, osWaitForever);
#endif
    if (UART_RX_MODE_INT == l_astUartInfo[_eUartID].m_eRxMode)
    switch(l_astUartInfo[_eUartID].m_eRxMode)
    {
    case UART_RX_MODE_INT:
    case UART_RX_MODE_DMA:
    {
        if (HIDO_ArraryQueueOut(&l_astUartInfo[_eUartID].m_stRxArraryQueue, _pu8Char) == HIDO_OK)
        {
            i32Result = HIDO_OK;
        }
        break;
    }
    }
#ifdef _USE_OS_
@@ -393,6 +391,20 @@
#endif
    return i32Result;
}
/*******************************************************************************
 * Function Name     : Uart_SetChar
 * Description       :
 * Input             :
 * Output            :
 * Return            :
 * Author            : 杜键
 * Modified Date:    : 2018年4月24日
 *******************************************************************************/
HIDO_VOID Uart_SetChar(E_UartID _eUartID, HIDO_UINT8 _u8Data)
{
    HIDO_ArraryQueueIn(&l_astUartInfo[_eUartID].m_stRxArraryQueue, &_u8Data);
}
/*******************************************************************************
@@ -435,7 +447,7 @@
            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);
        }
    }
@@ -472,3 +484,12 @@
    return i32Result;
}
HIDO_VOID HIDO_Lock(void)
{
    int_lock();
}
HIDO_VOID HIDO_UnLock(void)
{
    uint32_t lock = int_lock();
    int_unlock(lock);
}