前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STM32使用HAL库,串口收发一段时间后出错问题及解决

STM32使用HAL库,串口收发一段时间后出错问题及解决

作者头像
跋扈洋
发布2023-09-02 10:24:02
1.3K0
发布2023-09-02 10:24:02
举报
文章被收录于专栏:物联网知识物联网知识

问题及解决方法

当STM32使用HAL库进行开发时,偶尔会遇到串口收发数据量大时,会出现问题。比如同时串口同时收发,一段时间后就只能发送,接收不工作。或是只接收,但数据量大时也不工作。下面对这些问题和其解决办法进行整理。

问题1:串口溢出

当数据量过大且传输频率快时,串口可能会因为溢出,而不进入串口中断。

解决方法

使能RXNE中断和ORE中断:

代码语言:javascript
复制
if(HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE)!-HAL_OK)
{
 __HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
}

在usart.c中加入串口错误中断回调函数的定义

代码语言:javascript
复制
/* 中断错误处理函数,在此处理overrun错误 */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    uint8_t i = 0;

    if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET) 
    {
        __HAL_UART_CLEAR_OREFLAG(huart);
        HAL_UART_Receive_IT(huart,(u8 *)&i,1);
    }
}

问题2:串口同时收发,一段时间后串口接收不工作

明明STM32的串口通信是全双工的,但使用HAL库的STM32串口收发时发现,数据量大时,同时收发会出现问题。 问题的原因锁定在, STM32 HAL库在处理接收的时候会锁一下串口一会,导致变成某个短时间的“半双工”,这个时候如果同时收发就会出现问题。

在HAL_UART_Receive_IT函数中,开始处进行了上锁

虽然最后在UART_Start_Receive_IT中进行了解锁,

但有多种情况会导致不能解锁,从而影响到了串口接收。 在使用HAL_UART_Transmit时,可以看到,此函数的源码中,也有上锁和解锁,而且还是和UART_Start_Receive_IT控制的是一个锁!!!好好的全双工被HAL库搞成了半双工。

解决办法

手动解锁

代码语言:javascript
复制
  return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);
  if(return_state!=HAL_OK)
  {
    //解除忙状态(由ORE导致,清零ORE位)
    if(return_state == HAL_BUSY)
    {
      //清除ORE错误
//      __HAL_UART_CLEAR_OREFLAG(&huart1);//清楚ORE标志位
//      huart1.RxState=HAL_UART_STATE_READY;
      huart1.Lock=HAL_UNLOCKED;
      //重新开始接收
      return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);
    }
  }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题及解决方法
    • 问题1:串口溢出
      • 解决方法
        • 问题2:串口同时收发,一段时间后串口接收不工作
          • 解决办法
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档