Browse Source

【支线待合】增加MCU串口重复初始化保护

master
Lizongdi 6 days ago
parent
commit
6d1059f89f
  1. 5
      bspMCU/My_Lwip.c
  2. 7
      bspMCU/My_print.c
  3. 43
      bspMCU/bsp_uart.c
  4. 1
      bspMCU/include/bsp_uart.h
  5. 14
      bspMCU/l_uart.c

5
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;

7
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 )
*

43
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

1
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

14
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

Loading…
Cancel
Save