|
|
@ -12,34 +12,35 @@ extern DMA_HandleTypeDef hdma_uart7_rx; |
|
|
|
|
|
|
|
|
#ifdef CONFIG_UART_IT_IDLEDMA |
|
|
#ifdef CONFIG_UART_IT_IDLEDMA |
|
|
static TUartTab g_ptUartTab[] = { |
|
|
static TUartTab g_ptUartTab[] = { |
|
|
{&hlpuart1, &hdma_usart2_rx}, |
|
|
{&hlpuart1, &hdma_usart2_rx, 0}, |
|
|
{&huart1, &hdma_usart1_rx}, |
|
|
{&huart1, &hdma_usart1_rx, 0}, |
|
|
{&huart2, &hdma_usart2_rx}, |
|
|
{&huart2, &hdma_usart2_rx, 0}, |
|
|
{&huart3, &hdma_usart3_rx}, |
|
|
{&huart3, &hdma_usart3_rx, 0}, |
|
|
#ifdef IOC_100PIN |
|
|
#ifdef IOC_100PIN |
|
|
{&huart4, &hdma_uart4_rx}, |
|
|
{&huart4, &hdma_uart4_rx, 0}, |
|
|
{&huart5, &hdma_uart5_rx}, |
|
|
{&huart5, &hdma_uart5_rx, 0}, |
|
|
{&huart6, &hdma_usart6_rx}, |
|
|
{&huart6, &hdma_usart6_rx, 0}, |
|
|
{&huart7, &hdma_uart7_rx} |
|
|
{&huart7, &hdma_uart7_rx, 0} |
|
|
#endif |
|
|
#endif |
|
|
}; |
|
|
}; |
|
|
#else |
|
|
#else |
|
|
static TUartTab g_ptUartTab[] = { |
|
|
static TUartTab g_ptUartTab[] = { |
|
|
{&hlpuart1, NULL}, |
|
|
{&hlpuart1, NULL, 0}, |
|
|
{&huart1, NULL}, |
|
|
{&huart1, NULL, 0}, |
|
|
{&huart2, NULL}, |
|
|
{&huart2, NULL, 0}, |
|
|
{&huart3, NULL}, |
|
|
{&huart3, NULL, 0}, |
|
|
#ifdef IOC_100PIN |
|
|
#ifdef IOC_100PIN |
|
|
{&huart4, NULL}, |
|
|
{&huart4, NULL, 0}, |
|
|
{&huart5, NULL}, |
|
|
{&huart5, NULL, 0}, |
|
|
{&huart6, NULL}, |
|
|
{&huart6, NULL, 0}, |
|
|
{&huart7, NULL} |
|
|
{&huart7, NULL, 0} |
|
|
#endif |
|
|
#endif |
|
|
}; |
|
|
}; |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
static void bsp_uart_set_baudrate(UART_HandleTypeDef *_pUartHandle, uint32_t _uiBaudRate) |
|
|
static void bsp_uart_set_baudrate(UART_HandleTypeDef *_pUartHandle, uint32_t _uiBaudRate) |
|
|
{ |
|
|
{ |
|
|
|
|
|
if (NULL == _pUartHandle) return; |
|
|
_pUartHandle->Init.BaudRate = _uiBaudRate; |
|
|
_pUartHandle->Init.BaudRate = _uiBaudRate; |
|
|
if (HAL_UART_Init(_pUartHandle) != HAL_OK) |
|
|
if (HAL_UART_Init(_pUartHandle) != HAL_OK) |
|
|
{ |
|
|
{ |
|
|
@ -51,6 +52,7 @@ TUartUserData *UART_userdata_init(int _iID, int32_t _uiBaudRate, uint32_t _uiSiz |
|
|
{ |
|
|
{ |
|
|
if (_iID < 0 || _iID >= (sizeof(g_ptUartTab)/sizeof(g_ptUartTab[0]))) |
|
|
if (_iID < 0 || _iID >= (sizeof(g_ptUartTab)/sizeof(g_ptUartTab[0]))) |
|
|
return NULL; |
|
|
return NULL; |
|
|
|
|
|
if (g_ptUartTab[_iID].m_iUsed) return NULL; |
|
|
|
|
|
|
|
|
TUartUserData *ptUartUserData = (TUartUserData *)RD_CALLOC(1, sizeof(TUartUserData)); |
|
|
TUartUserData *ptUartUserData = (TUartUserData *)RD_CALLOC(1, sizeof(TUartUserData)); |
|
|
ptUartUserData->m_buf_size = (_uiSize == 0) ? CONFIG_UART_BUFFER_SIZE : _uiSize; |
|
|
ptUartUserData->m_buf_size = (_uiSize == 0) ? CONFIG_UART_BUFFER_SIZE : _uiSize; |
|
|
@ -67,12 +69,19 @@ TUartUserData *UART_userdata_init(int _iID, int32_t _uiBaudRate, uint32_t _uiSiz |
|
|
{ |
|
|
{ |
|
|
bsp_uart_set_baudrate(g_ptUartTab[_iID].m_uart, _uiBaudRate); |
|
|
bsp_uart_set_baudrate(g_ptUartTab[_iID].m_uart, _uiBaudRate); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (0 == g_ptUartTab[_iID].m_iUsed) |
|
|
|
|
|
{ |
|
|
|
|
|
g_ptUartTab[_iID].m_iUsed = 1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return ptUartUserData; |
|
|
return ptUartUserData; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void UART_IT_init(TComCtrl *_ptComCtrl) |
|
|
void UART_IT_init(TComCtrl *_ptComCtrl) |
|
|
{ |
|
|
{ |
|
|
TUartUserData *ptUartUserData = (TUartUserData *)_ptComCtrl->m_pUserData; |
|
|
TUartUserData *ptUartUserData = (TUartUserData *)_ptComCtrl->m_pUserData; |
|
|
|
|
|
if (NULL == ptUartUserData) return; |
|
|
#ifdef CONFIG_UART_IT_IDLEDMA |
|
|
#ifdef CONFIG_UART_IT_IDLEDMA |
|
|
// 开启串口空闲中断 (IDLE Interrupt)
|
|
|
// 开启串口空闲中断 (IDLE Interrupt)
|
|
|
// 这是核心!DMA 负责搬运,IDLE 负责通知“一帧结束了”
|
|
|
// 这是核心!DMA 负责搬运,IDLE 负责通知“一帧结束了”
|
|
|
@ -93,6 +102,7 @@ void UART_DMA_RX_IRQHandler(TComCtrl *_ptComCtrl) |
|
|
{ |
|
|
{ |
|
|
#ifdef CONFIG_UART_IT_IDLEDMA |
|
|
#ifdef CONFIG_UART_IT_IDLEDMA |
|
|
TUartUserData *ptUartUserData = (TUartUserData *)_ptComCtrl->m_pUserData; |
|
|
TUartUserData *ptUartUserData = (TUartUserData *)_ptComCtrl->m_pUserData; |
|
|
|
|
|
if (NULL == ptUartUserData) return; |
|
|
// 1. 检查是否是空闲中断 (IDLE)
|
|
|
// 1. 检查是否是空闲中断 (IDLE)
|
|
|
if (__HAL_UART_GET_FLAG(ptUartUserData->m_uart, UART_FLAG_IDLE) != RESET) |
|
|
if (__HAL_UART_GET_FLAG(ptUartUserData->m_uart, UART_FLAG_IDLE) != RESET) |
|
|
{ |
|
|
{ |
|
|
@ -140,6 +150,7 @@ void UART_RX_IRQHandler(TComCtrl *_ptComCtrl) |
|
|
{ |
|
|
{ |
|
|
#ifndef CONFIG_UART_IT_IDLEDMA |
|
|
#ifndef CONFIG_UART_IT_IDLEDMA |
|
|
TUartUserData *ptUartUserData = (TUartUserData *)_ptComCtrl->m_pUserData; |
|
|
TUartUserData *ptUartUserData = (TUartUserData *)_ptComCtrl->m_pUserData; |
|
|
|
|
|
if (NULL == ptUartUserData) return; |
|
|
rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_temp, 1); |
|
|
rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_temp, 1); |
|
|
HAL_UART_Receive_IT(ptUartUserData->m_uart, &ptUartUserData->m_temp, 1); |
|
|
HAL_UART_Receive_IT(ptUartUserData->m_uart, &ptUartUserData->m_temp, 1); |
|
|
#endif |
|
|
#endif |
|
|
|