[其他ST产品] STM32解决串口频繁接收串口死所问题

[复制链接]
744|13
 楼主| 漫天星yl 发表于 2023-9-22 12:02 | 显示全部楼层 |阅读模式
最近在使用STM32空闲中断接收数据的时候发现一旦发送端发送数据较频繁,串口就会出现死锁的情况,即使在接收到数据以后关闭空闲中断,解析完数据后立马打开中断,也会有这个情况。修改串口解析后打开中断部分内容后解决此问题,详解如下:


CubeMX串口配置如下:

59695650d11a92d900.png

29672650d11baf065e.png

11578650d11c21ab59.png
 楼主| 漫天星yl 发表于 2023-9-22 12:02 | 显示全部楼层
修改后内容如下:
stm32fl0xx_it.c
  1. #define RECV_BUFFER_SIZE  20

  2. uint8_t uart_dma_recv_buff[RECV_BUFFER_SIZE] = {0};
  3. uint8_t uart_dma_recv_buff_bak[RECV_BUFFER_SIZE] = {0}

  4. void USART1_IRQHandler(void)
  5. {
  6.   /* USER CODE BEGIN USART1_IRQn 0 */

  7.   /* USER CODE END USART1_IRQn 0 */
  8.   HAL_UART_IRQHandler(&huart1);
  9.   /* USER CODE BEGIN USART1_IRQn 1 */
  10.                 if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))//Check whether the specified UART flag is set or not.
  11.         {
  12.                 __HAL_UART_CLEAR_IDLEFLAG(&huart1);//Clear the UART IDLE pending flag.(Otherwise it will continue to interrupt)
  13. //                HAL_UART_DMAStop(&huart1);
  14.                 /*关闭接收的DMA*/
  15.                 ret_Value = HAL_IS_BIT_SET(huart1.Instance->CR3, USART_CR3_DMAR);
  16.                 if ((huart1.RxState == HAL_UART_STATE_BUSY_RX) && ret_Value)
  17.                 {
  18.                         CLEAR_BIT(huart1.Instance->CR3, USART_CR3_DMAR);

  19.                         /* Abort the UART DMA Rx stream */
  20.                         if (huart1.hdmarx != NULL)
  21.                         {
  22.                                 HAL_DMA_Abort(huart1.hdmarx);
  23.                         }
  24.                         CLEAR_BIT(huart1.Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
  25.                         CLEAR_BIT(huart1.Instance->CR3, USART_CR3_EIE);

  26.                         /* At end of Rx process, restore huart->RxState to Ready */
  27.                         huart1.RxState = HAL_UART_STATE_READY;
  28.                 }               
  29.                 /*******************/
  30.                 Uart_recv_len = RECV_BUFFER_SIZE - (__HAL_DMA_GET_COUNTER(&hdma_usart1_rx));//获取接收数据的长度
  31.                 Uart_recv_flag = 1;
  32.                 memset(uart_dma_recv_buff_bak,0,RECV_BUFFER_SIZE);
  33.                 memcpy(uart_dma_recv_buff_bak,uart_dma_recv_buff,RECV_BUFFER_SIZE);
  34.                 memset(uart_dma_recv_buff,0,RECV_BUFFER_SIZE);
  35.                 __HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE);//关闭空闲中断
  36.         }




 楼主| 漫天星yl 发表于 2023-9-22 12:02 | 显示全部楼层
接收打开中断部分:
main.c
  1. if (Uart_recv_flag == 1) //串口接收到信恿
  2.         {
  3.                 Uart_recv_flag = 0;
  4.                
  5.                 /*此处解析接收到的数据*/
  6.                
  7.                 HAL_UART_AbortReceive(&huart1);
  8.                 HAL_UART_MspInit(&huart1);
  9.                 memset(uart_dma_recv_buff_bak,0,RECV_BUFFER_SIZE);
  10.                 HAL_UART_Receive_DMA(&huart1, (uint8_t*)uart_dma_recv_buff, RECV_BUFFER_SIZE);
  11.                 __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  12.         }
  13. }
Pulitzer 发表于 2024-8-11 07:30 | 显示全部楼层

在信号线中串联小电阻其主要目的是对引脚的保护
童雨竹 发表于 2024-8-11 09:26 | 显示全部楼层

驱动脉冲变压器原边时,
公羊子丹 发表于 2024-8-11 12:25 | 显示全部楼层

开模的话,模具不会塌踏。。
万图 发表于 2024-8-11 13:28 | 显示全部楼层

就导通接地放掉
Uriah 发表于 2024-8-11 14:31 | 显示全部楼层

需要靠近在外部添加一个钳位二极管
帛灿灿 发表于 2024-8-11 16:27 | 显示全部楼层

ESD电压通过接地放掉
Bblythe 发表于 2024-8-11 17:30 | 显示全部楼层

电阻消耗过电压的能量
周半梅 发表于 2024-8-11 19:26 | 显示全部楼层

当电路正常工作时,它处于截止状态(高阻态)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

350

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部