STM32
直播中

卞轮辉

7年用户 999经验值
私信 关注
[问答]

STM32L051串口接收卡死的原因?

如题:实验现象是用CUBE配置好的代码,HAL库,修改中断函数,增加空闲中断处理不定长数据接收,在使用串口助手进行调试时发现,连续快速点击发送按钮,串口会卡死,为了确认卡死的地方,在所有异常中断中都加了LED指示,最后发现在接收数据时LED指示常亮,证明是卡死在数据接收中。为了验证,在串口助手中设置1MS自动发送,程序不会卡死。但只要在单次发送模式用手连续快速点击发送,100%卡死。怀疑串口助手有问题,换助手后一样。在出现卡死后,程序也不知道跑在哪里了,按复位能恢复;但在用STLINK进入DEBUG模式下跑代码测试,不会出现卡死现象。
中断部分处理代码如下:

  • void LPUART1_IRQHandler(void)
  • {
  • //        uint8_t  RCVBUF;
  •   /* USER CODE BEGIN LPUART1_IRQn 0 */
  •   /* USER CODE END LPUART1_IRQn 0 */
  • //  HAL_UART_IRQHandler( hlpuart1);
  •   /* USER CODE BEGIN LPUART1_IRQn 1 */
  •   HAL_GPIO_WritePin(led1_GPIO_Port,led1_Pin,GPIO_PIN_SET);
  • //        HAL_UART_Receive_IT( hlpuart1, RCVBUF,1);
  • //        LPUart1_RX_BUF[LPUart1_REC_Cnt++] = RCVBUF;
  • //        if(LPUart1_REC_Cnt > LPUart1_BUF_SIZE)
  • //                                        LPUart1_REC_Cnt =0;

  • if(__HAL_UART_GET_FLAG( hlpuart1, UART_FLAG_RXNE) != RESET)
  •     {
  •                         __HAL_UART_CLEAR_FLAG( hlpuart1, UART_FLAG_ORE | UART_FLAG_NE | UART_FLAG_PE | UART_FLAG_FE);
  •       __HAL_UART_CLEAR_FLAG( hlpuart1, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
  •                         if(LPUart1_End_flage == 0)
  •                         {
  •                           LPUart1_RX_BUF[LPUart1_REC_Cnt] = LPUART1->ISR;
  •         LPUart1_RX_BUF[LPUart1_REC_Cnt] = LPUART1->RDR;
  •         LPUart1_REC_Cnt++;
  •                                 if(LPUart1_REC_Cnt > LPUart1_BUF_SIZE)
  •                                         LPUart1_REC_Cnt =0;
  •                         }
  •   }
  • else if(__HAL_UART_GET_FLAG( hlpuart1,UART_FLAG_IDLE) == SET)
  •     {
  •                          __HAL_UART_CLEAR_IDLEFLAG( hlpuart1);
  •                         __HAL_UART_CLEAR_FLAG( hlpuart1, UART_FLAG_ORE | UART_FLAG_NE | UART_FLAG_PE | UART_FLAG_FE);
  •                printf("UART IT For IDEL rn");
  •         LPUart1_End_flage = 1;
  •         LPUart1_REC_SIZE = LPUart1_REC_Cnt;
  •         LPUart1_REC_Cnt = 0;
  •    }
  • HAL_GPIO_WritePin(led1_GPIO_Port,led1_Pin,GPIO_PIN_RESET);
  •   /* USER CODE END LPUART1_IRQn 1 */
  • }


回帖(1)

fanB

2024-4-12 16:01:15
STM32L051串口接收卡死的原因可能有以下几个可能性:

1. 软件bug:在接收数据时可能存在一些逻辑错误或者死循环导致卡死。你可以仔细检查接收数据的逻辑代码,确保没有错误。

2. 缓冲区溢出:如果接收数据速度过快,可能会导致接收缓冲区溢出,从而造成卡死。你可以检查接收缓冲区的大小是否合适,如果不够大,可以适当增大缓冲区的大小。

3. 中断优先级问题:如果不正确地设置了中断优先级,可能会导致中断嵌套或者中断重入,从而引发卡死。你可以检查一下中断优先级的设置是否正确。

4. 时钟问题:如果时钟设置不正确,可能会导致串口通信不稳定,进而导致卡死。你可以检查一下时钟设置是否正确。

5. 芯片硬件问题:如果芯片本身存在硬件问题,也可能会导致卡死。你可以尝试在其他开发板上测试同样的代码,看是否也会卡死。

在调试过程中,你可以尝试以下方法来定位问题:

1. 使用调试器:通过调试器逐步执行程序,观察在哪个位置发生卡死,可以帮助你定位问题所在。

2. 日志输出:在关键位置增加日志输出,观察输出的日志,可以帮助你判断程序执行到哪里。

3. 使用逻辑分析仪:使用逻辑分析仪来观察串口通信的波形,可以检查是否存在波特率、数据位等设置问题。

希望以上方法对你有帮助。如果还有其他问题,请随时追问。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分