使用STM32串口时遇到的“串口死机”问题解决记录

您所在的位置:网站首页 miui1257死机 使用STM32串口时遇到的“串口死机”问题解决记录

使用STM32串口时遇到的“串口死机”问题解决记录

2024-07-17 07:08| 来源: 网络整理| 查看: 265

      些日子的一个项目,采集几路PT100温度及几路电流电压并通过modbus rtu 送给上位机,CPU采用了STM32F4,在现场测试时发现,运行一段时间会出现串口不再回应上位机的读取命令,停电重起后恢复正常通讯,看起来像STM32系统死机了,运行一段时间后又重复该现象。

     该STM32系统使用了HAL库,由STM32CUBEMX生成了基础工程,采用串口空闲中断,DMA传输。 项目初步完成后也长时间测试,开始测试时用modbuspoll每1S读一次,未发现该问题。

      现场测试时,上位机读取包括该STM32系统在内的多个从机设备,每200ms读取一次,就会出现串口“”死机“”现象。网上查询了很多遇到相似问题的文章,该现象为串口接收溢出,Overrun Error标志置位,测试后发现上位机读取的越频繁,该现象出现的越快。

     看到很多解决方案是重写串口错误回调函数HAL_UART_ErrorCallback (),在里面清除USART_SR寄存器的ORE(溢出错误标志)并重新起动DMA接收即可。于是依法清除ORE标志,重新启动DMA接收,但是没有解决问题,故障依然出现。调试发现一旦出现溢出错误再收到数据后即进入错误回调函数,不再正常接收数据,清除错误标志也不行。折腾好久终于意识到DMA状态也需要重新设置。

     于是参考了博主“”天堂陌客“”的办法,在错误回调函数重新初始化串口及DMA,添加了如下代码:

                      

          memset(&huart3,0,sizeof(UART_HandleTypeDef) );

          memset(&hdma_usart3_rx,0,sizeof(DMA_HandleTypeDef) );

          memset(&hdma_usart3_tx,0,sizeof(DMA_HandleTypeDef) );  

          HAL_UART_MspDeInit(&huart3);

          MX_DMA_Init();

          MX_USART3_UART_Init();

 问题得以解决,在出现溢出错误后只影响当时的数据,不影响以后的数据接收。

非常感谢愿意分享遇到问题的各位博主!

         

     

   

   



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3