打印
[其他ST产品]

基于STM32使用HAL库,串口收发经验分享

[复制链接]
117|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2023-6-15 10:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
问题及解决方法

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


问题1:串口溢出

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


解决方法

使能RXNE中断和ORE中断:

  • if(HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE)!-HAL_OK)
  • {
  • __HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
  • }

复制代码


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

  • /* 中断错误处理函数,在此处理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库搞成了半双工。


解决办法

手动解锁

  •   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);
  •     }
  •   }

复制代码


使用特权

评论回复
沙发
Bowclad| | 2023-6-15 23:40 | 只看该作者
不上锁会不会影响变量重复访问啊?

使用特权

评论回复
板凳
Jacquetry| | 2023-6-18 23:09 | 只看该作者
是不是为了防止重复读写啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1414

主题

3814

帖子

5

粉丝