硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1336|回复: 5
收起左侧

[UART] STM32串口DMA收发同时使用的HAL库BUG如何解决?

[复制链接]

61

主题

62

回帖

245

积分

高级会员

积分
245
发表于 2022-1-19 09:19:38 | 显示全部楼层 |阅读模式
本帖最后由 vzhaodan 于 2022-1-19 09:21 编辑

UART同时使用了DMA接收与DMA发送,因为使用了RS485要同时满足modbus和另一种二进制通讯协议,也跑了ucos系统,在ucos上modbus的数据发送帧间隙是不允许打断的,所以使用DMA发送,由于是RS485所以开启DMA发送完成中断来“立即”改变RS485_DE脚电平为接收状态。
当外围设备对STM32在不匹配的波特率下发送一串数据就会导致进入错误中断ORE标志。

除了STM32F1xx怎样测试都没有问题外,STM32F2、STM32F4、STM32H7的HAL库均有这个问题。通过比较库他们对DMA操作各不相同,我现在只能舍弃DMA发送的功能,使用ucos全局中断屏蔽发送RS485的数据包解决这个问题。因为一旦开启了DMA发送中断就会导致ORE的错误一直存在。
网上有非常多类似遇到和我相同的问题,也有人修改HAL库解决过:https://blog.csdn.net/qq_24130227/article/details/100106532   但是他这种方式修改到STM32F1上未必能行的通。


回复

使用道具 举报

61

主题

62

回帖

245

积分

高级会员

积分
245
 楼主| 发表于 2022-1-19 09:36:43 | 显示全部楼层
最简单的解决办法,不调用HAL库的中断函数,自定义可以避免在中断中操作DMA带来的ORE错误。

void BSP_UART_IRQ(u8 id)
{
    u8 data=0;
   
    if((__HAL_UART_GET_FLAG(&BSP_UART_Handle[id],UART_FLAG_RXNE)!=RESET))
    {
        HAL_UART_Receive(&BSP_UART_Handle[id],&data,1,1000);
        if (BSP_UART_RevFun[id]!=0) BSP_UART_RevFun[id](data);
        else
        {
            if (BSP_UART_Rx_Len[id]<BSP_UART_Rx_Max[id]) BSP_UART_Rx_Buff[id][BSP_UART_Rx_Len[id]++]=data;
        }
    }
   
    if (__HAL_UART_GET_FLAG(&BSP_UART_Handle[id],USART_SR_TC)!=RESET)
    {
        __HAL_UART_DISABLE_IT(&BSP_UART_Handle[id], UART_IT_TC);
        HAL_UART_TxCpltCallback(&BSP_UART_Handle[id]);
    }
}


经过反复测试完全正常
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2022-1-19 10:27:16 | 显示全部楼层
收藏一下。单485通讯,还没有碰到这个问题,毕竟DMA发送和接收是完全分开的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2022-1-19 10:31:32 | 显示全部楼层
串口FIFO也可以,随意使用任何系统。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2022-1-19 16:28:48 | 显示全部楼层
在err callback中清一下ORE
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2022-1-20 10:05:00 | 显示全部楼层
oneV 发表于 2022-1-19 16:28
在err callback中清一下ORE

调用HAL库的中断处理,自动各种标志清楚。

      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);

      huart->ErrorCode |= HAL_UART_ERROR_ORE;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 20:12 , Processed in 0.208236 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表