| | |
| | | /******************************************************************************* |
| | | * File Name : Uart.c |
| | | * Description : |
| | | * Created on : 2018年4月24日 |
| | | * Author : 杜键 |
| | | * Created on : 2018��4��24�� |
| | | * Author : �ż� |
| | | *******************************************************************************/ |
| | | |
| | | /******************************************************************************* |
| | |
| | | HIDO_UINT32 m_u32TxBufSize; |
| | | HIDO_UINT32 m_u32TxQueueMemberCnt; |
| | | HIDO_VLQStruct m_stTxVLQueue; |
| | | HIDO_BOOL m_bTxBusy; |
| | | |
| | | HIDO_UINT32 m_u32RxValue; |
| | | HIDO_UINT32 m_u32Flag; |
| | |
| | | * 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; |
| | |
| | | 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); |
| | | } |
| | | |
| | |
| | | * 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; |
| | |
| | | __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)); |
| | | } |
| | | |
| | |
| | | * 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) |
| | | { |
| | |
| | | * 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) |
| | | { |
| | |
| | | return HIDO_ERR; |
| | | } |
| | | |
| | | /* 初始化参数 */ |
| | | /* ��ʼ������ */ |
| | | HIDO_UtilBzero(&l_astUartInfo[_eUartID], sizeof(ST_UartInfo)); |
| | | |
| | | l_astUartInfo[_eUartID].m_pstUart = (UART_HandleTypeDef *)_pUart; |
| | |
| | | * 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) |
| | | { |
| | |
| | | _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); |
| | | } |
| | | |
| | |
| | | * Input : |
| | | * Output : |
| | | * Return : |
| | | * Author : 杜键 |
| | | * Modified Date: : 2018年4月24日 |
| | | * Author : �ż� |
| | | * Modified Date: : 2018��4��24�� |
| | | *******************************************************************************/ |
| | | HIDO_INT32 Uart_ReInit(E_UartID _eUartID) |
| | | { |
| | |
| | | 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); |
| | | } |
| | | |
| | |
| | | * 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) |
| | | { |
| | |
| | | * Input : |
| | | * Output : |
| | | * Return : |
| | | * Author : 杜键 |
| | | * Modified Date: : 2018年4月24日 |
| | | * Author : �ż� |
| | | * Modified Date: : 2018��4��24�� |
| | | *******************************************************************************/ |
| | | HIDO_VOID Uart_RxErrorFromISR(HIDO_VOID *_pUart) |
| | | { |
| | |
| | | { |
| | | 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; |
| | |
| | | * Input : |
| | | * Output : |
| | | * Return : |
| | | * Author : 杜键 |
| | | * Modified Date: : 2018年4月24日 |
| | | * Author : �ż� |
| | | * Modified Date: : 2018��4��24�� |
| | | *******************************************************************************/ |
| | | HIDO_VOID Uart_TxOverFromISR(HIDO_VOID *_pUart) |
| | | { |
| | |
| | | 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) |
| | | { |
| | |
| | | HAL_UART_Transmit_IT(l_astUartInfo[eUartID].m_pstUart, pstMember->m_pDataAddr, |
| | | pstMember->m_u32DataLen); |
| | | } |
| | | else |
| | | { |
| | | l_astUartInfo[eUartID].m_bTxBusy = HIDO_FALSE; |
| | | } |
| | | } |
| | | |
| | | break; |
| | |
| | | * Input : |
| | | * Output : |
| | | * Return : |
| | | * Author : 杜键 |
| | | * Modified Date: : 2018年4月24日 |
| | | * Author : �ż� |
| | | * Modified Date: : 2018��4��24�� |
| | | *******************************************************************************/ |
| | | HIDO_VOID Uart_RxOverFromISR(HIDO_VOID *_pUart) |
| | | { |
| | |
| | | |
| | | 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) |
| | |
| | | l_astUartInfo[eUartID].m_fnRxISR(l_astUartInfo[eUartID].m_u32RxValue); |
| | | } |
| | | |
| | | /* 启动INT接收 */ |
| | | /* ����INT���� */ |
| | | Uart_RXINTEnable(eUartID); |
| | | } |
| | | |
| | |
| | | * 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) |
| | | { |
| | |
| | | * 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) |
| | | { |
| | |
| | | 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); |
| | |
| | | { |
| | | 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); |
| | |
| | | { |
| | | 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) |