From 6d1059f89f32b13e522d0a0313697d139aeea63d Mon Sep 17 00:00:00 2001 From: Lizongdi <1210855344@qq.com> Date: Fri, 14 Aug 2026 11:21:06 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=94=AF=E7=BA=BF=E5=BE=85=E5=90=88?= =?UTF-8?q?=E3=80=91=E5=A2=9E=E5=8A=A0MCU=E4=B8=B2=E5=8F=A3=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bspMCU/My_Lwip.c | 5 ----- bspMCU/My_print.c | 7 ------- bspMCU/bsp_uart.c | 43 ++++++++++++++++++++++++--------------- bspMCU/include/bsp_uart.h | 1 + bspMCU/l_uart.c | 14 ++----------- 5 files changed, 30 insertions(+), 40 deletions(-) diff --git a/bspMCU/My_Lwip.c b/bspMCU/My_Lwip.c index 39c9c9d..c06c0d6 100644 --- a/bspMCU/My_Lwip.c +++ b/bspMCU/My_Lwip.c @@ -87,11 +87,6 @@ void Myprint_timer(void) return; } -void Myprint_IRQHandler(void) -{ - return; -} - int Myprint_putchar(uint8_t ch) { if (connect_fd < 0) return 0; diff --git a/bspMCU/My_print.c b/bspMCU/My_print.c index c89941f..fbab615 100644 --- a/bspMCU/My_print.c +++ b/bspMCU/My_print.c @@ -169,13 +169,6 @@ WEAK void Myprint_timer(void) //rd_ComSendProc(g_ptUartCtrl); } -WEAK void Myprint_IRQHandler(void) -{ -#ifdef PRINT_ID - UART_DMA_RX_IRQHandler(g_ptUartCtrl); -#endif -} - /** * @brief 底层单字符发送 (带 \n -> \r\n 转换) * 这是发送端的“原子操作”,其他发送函数都基于它 diff --git a/bspMCU/bsp_uart.c b/bspMCU/bsp_uart.c index 55ea372..eb4fc76 100644 --- a/bspMCU/bsp_uart.c +++ b/bspMCU/bsp_uart.c @@ -12,34 +12,35 @@ extern DMA_HandleTypeDef hdma_uart7_rx; #ifdef CONFIG_UART_IT_IDLEDMA static TUartTab g_ptUartTab[] = { - {&hlpuart1, &hdma_usart2_rx}, - {&huart1, &hdma_usart1_rx}, - {&huart2, &hdma_usart2_rx}, - {&huart3, &hdma_usart3_rx}, + {&hlpuart1, &hdma_usart2_rx, 0}, + {&huart1, &hdma_usart1_rx, 0}, + {&huart2, &hdma_usart2_rx, 0}, + {&huart3, &hdma_usart3_rx, 0}, #ifdef IOC_100PIN - {&huart4, &hdma_uart4_rx}, - {&huart5, &hdma_uart5_rx}, - {&huart6, &hdma_usart6_rx}, - {&huart7, &hdma_uart7_rx} + {&huart4, &hdma_uart4_rx, 0}, + {&huart5, &hdma_uart5_rx, 0}, + {&huart6, &hdma_usart6_rx, 0}, + {&huart7, &hdma_uart7_rx, 0} #endif }; #else static TUartTab g_ptUartTab[] = { - {&hlpuart1, NULL}, - {&huart1, NULL}, - {&huart2, NULL}, - {&huart3, NULL}, + {&hlpuart1, NULL, 0}, + {&huart1, NULL, 0}, + {&huart2, NULL, 0}, + {&huart3, NULL, 0}, #ifdef IOC_100PIN - {&huart4, NULL}, - {&huart5, NULL}, - {&huart6, NULL}, - {&huart7, NULL} + {&huart4, NULL, 0}, + {&huart5, NULL, 0}, + {&huart6, NULL, 0}, + {&huart7, NULL, 0} #endif }; #endif static void bsp_uart_set_baudrate(UART_HandleTypeDef *_pUartHandle, uint32_t _uiBaudRate) { + if (NULL == _pUartHandle) return; _pUartHandle->Init.BaudRate = _uiBaudRate; 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]))) return NULL; + if (g_ptUartTab[_iID].m_iUsed) return NULL; TUartUserData *ptUartUserData = (TUartUserData *)RD_CALLOC(1, sizeof(TUartUserData)); 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); } + + if (0 == g_ptUartTab[_iID].m_iUsed) + { + g_ptUartTab[_iID].m_iUsed = 1; + } + return ptUartUserData; } void UART_IT_init(TComCtrl *_ptComCtrl) { TUartUserData *ptUartUserData = (TUartUserData *)_ptComCtrl->m_pUserData; + if (NULL == ptUartUserData) return; #ifdef CONFIG_UART_IT_IDLEDMA // 开启串口空闲中断 (IDLE Interrupt) // 这是核心!DMA 负责搬运,IDLE 负责通知“一帧结束了” @@ -93,6 +102,7 @@ void UART_DMA_RX_IRQHandler(TComCtrl *_ptComCtrl) { #ifdef CONFIG_UART_IT_IDLEDMA TUartUserData *ptUartUserData = (TUartUserData *)_ptComCtrl->m_pUserData; + if (NULL == ptUartUserData) return; // 1. 检查是否是空闲中断 (IDLE) 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 TUartUserData *ptUartUserData = (TUartUserData *)_ptComCtrl->m_pUserData; + if (NULL == ptUartUserData) return; rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_temp, 1); HAL_UART_Receive_IT(ptUartUserData->m_uart, &ptUartUserData->m_temp, 1); #endif diff --git a/bspMCU/include/bsp_uart.h b/bspMCU/include/bsp_uart.h index 794aedc..3df9c50 100644 --- a/bspMCU/include/bsp_uart.h +++ b/bspMCU/include/bsp_uart.h @@ -17,6 +17,7 @@ typedef struct { UART_HandleTypeDef *m_uart; DMA_HandleTypeDef *m_hdma_rx; + int m_iUsed; }TUartTab; typedef struct diff --git a/bspMCU/l_uart.c b/bspMCU/l_uart.c index 6d16ada..c7d7854 100644 --- a/bspMCU/l_uart.c +++ b/bspMCU/l_uart.c @@ -29,18 +29,6 @@ int COM0_Send(char *_pBuffer, uint32_t _iSize) return HAL_UART_Transmit(ptUartUserData->m_uart, (uint8_t *)_pBuffer, _iSize, 100); } -void COM1_IRQHandler(void) -{ - UART_DMA_RX_IRQHandler(g_ptCom1); -} - -void COM0_IRQHandler(void) -{ -#ifndef PRINT_ID - UART_DMA_RX_IRQHandler(g_ptCom0); -#endif -} - // 构造函数: st.COM(1, 115200) static int l_com_new(lua_State *L) { @@ -53,6 +41,7 @@ static int l_com_new(lua_State *L) if (id == 1 || id == 2) { TUartUserData *ptUartUserData = UART_userdata_init(LUACOM_ID, baudrate, 0); + if (NULL == ptUartUserData) lua_print("com is already used\n"); g_ptCom1 = rd_ComCreate(NULL, NULL, COM1_Send, ptUartUserData->m_buf_size, ptUartUserData); UART_IT_init(g_ptCom1); u->m_ptComCtrl = g_ptCom1; @@ -65,6 +54,7 @@ static int l_com_new(lua_State *L) #endif #else TUartUserData *ptUartUserData = UART_userdata_init(0, baudrate, 0); + if (NULL == ptUartUserData) lua_print("com is already used\n"); g_ptCom0 = rd_ComCreate(NULL, NULL, COM0_Send, ptUartUserData->m_buf_size, ptUartUserData); UART_IT_init(g_ptCom0); #endif