搜索
查看: 9603|回复: 13

[讨论] 汇报STM32F030的UART在DMA接收下的HAL BUG

[复制链接]

该用户从未签到

4

主题

18

帖子

0

蝴蝶豆

初级会员

最后登录
2018-12-27
发表于 2015-7-28 03:15:46 | 显示全部楼层 |阅读模式
我测试了Cube下STM32F030的DMA接收串口数据函数,如下
HAL_UART_Receive_DMA(&huart1, RxDatabuf, 32);
如果该函数被调用前,串口已经发生数据溢出,则调用该函数,DMA接收将不会正常启动,只接收1个字符,然后卡住这无法运行,无论是否重新调用该函数,都继续卡着,包括调用HAL_UART_DMAStop(&huart1) 也无济于事。
解决办法还没有仔细研究,但重新初始化串口之后可以继续运行。还没测试直接清除串口溢出位标志是否可行,但直接操作寄存器有违HAL的初衷。

如果可能的话,ST的cube能否修正一下呢?HAL用的人越来越多了,不知道其他型号是否也存在这个问题。
回复

使用道具 举报

该用户从未签到

27

主题

1912

帖子

42

蝴蝶豆

论坛元老

最后登录
2022-7-11
发表于 2015-7-28 08:30:34 | 显示全部楼层
STM32F030 的外设好像是有点问题。上次我用SPI的也是有问题
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

919

帖子

0

蝴蝶豆

金牌会员

最后登录
2020-7-4
发表于 2015-7-28 09:05:29 | 显示全部楼层
没用过HAL库,无能为力,帮顶。。
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

18

帖子

0

蝴蝶豆

初级会员

最后登录
2018-12-27
 楼主| 发表于 2015-7-28 10:57:21 | 显示全部楼层
其实STM32F0xx串口还有个新的中断,叫接收超时中断,注意,不是空闲中断哦,可以设置超时时间,STM32多少年才改进这个设计啊,有兴趣可以去测试一下
回复 支持 反对

使用道具 举报

该用户从未签到

57

主题

1216

帖子

0

蝴蝶豆

金牌会员

最后登录
2023-6-4
发表于 2015-7-28 12:01:51 | 显示全部楼层
帮顶                          
回复 支持 反对

使用道具 举报

该用户从未签到

100

主题

3786

帖子

1

蝴蝶豆

论坛元老

最后登录
2024-4-24
发表于 2015-7-28 13:38:33 | 显示全部楼层
从不用HAL库
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

18

帖子

0

蝴蝶豆

初级会员

最后登录
2018-12-27
 楼主| 发表于 2015-7-28 14:24:13 | 显示全部楼层

HAL越来越强大,跨芯片平台,统一了STM32F系列的所有芯片,代码迁移很容易,只是现在bug还较多
回复 支持 反对

使用道具 举报

该用户从未签到

100

主题

3786

帖子

1

蝴蝶豆

论坛元老

最后登录
2024-4-24
发表于 2015-7-29 12:10:17 | 显示全部楼层
bug最致命啊
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

14

帖子

0

蝴蝶豆

中级会员

最后登录
2018-6-27
发表于 2016-1-15 23:05:31 | 显示全部楼层
      我用的是F103也遇到了类是问题,在仿真状态下串口接收正常,直接上电运行串口就不能有效接收数据。首先感谢楼主给出具体的问题所在。
      我发现如果在开启DMA接收前,已经使能了串口接收就有可能出现接收溢出。解决办法就是调用了HAL_UART_Receive_DMA函数后再使能串口接收。
     方法一、数据发送时串口只配置为UART_MODE_TX,收据接收时串口配置为UART_MODE_RX或UART_MODE_TX_RX。
     方法二、以#define __HAL_UART_ENABLE(__HANDLE__)               ((__HANDLE__)->Instance->CR1 |=  USART_CR1_UE)为原型,建立串口接收和发送使能失效功能函数,随时可用。
#define __HAL_UART_TX_ENABLE(__HANDLE__)               ((__HANDLE__)->Instance->CR1 |=  USART_CR1_TE)

#define __HAL_UART_TX_DISABLE(__HANDLE__)              ((__HANDLE__)->Instance->CR1 &=  ~USART_CR1_TE)
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

4

帖子

0

蝴蝶豆

初级会员

最后登录
2017-11-29
发表于 2016-10-19 22:49:31 | 显示全部楼层
楼主兄弟遇到的问题我也遇到了,我也汇报一下情况吧,希望大家共同进步,因为我解决问题的思路也是来自相关论坛。最近我在调试串口,USB,以及蓝牙模块的通信。大致流程是蓝牙接收的数据经过MCU串口接收,经过处理,在由USB转发出去。需要说明的是用的是ST公司推出的HAL库。在串口接收数据遇到了不少的麻烦,其中就是HAL_UART_Receive_DMA接收数据。遇到了楼主遇到的问题“如果该函数被调用前,串口已经发生数据溢出,则调用该函数,DMA接收将不会正常启动,只接收1个字符,然后卡住这无法运行,无论是否重新调用该函数,都继续卡着,包括调用HAL_UART_DMAStop(&huart1) 也无济于事。”为什么会这样呢?原因是蓝牙模块配置好以后收到了来自另一个蓝牙模块的命令。该命令本来是用来控制另一个模块的,但是由于没有及时检测到蓝牙已经连接,然后控制命令经过蓝牙透传模式发到了我这边,但是实际上我这边还没有,下发开始传输数据的命令,也就是说发生了串口上溢的错误,导致当发送开始传输命令时怎么也接收不到数据。我采用的解决办法是重新初始化了串口,然后问题迎刃而解。不过个人感觉应该还有其他办法解决这个问题,需要仔细研究一下HAL库和芯片的datasheet。好吧先这样了,回头接着汇报吧。我的联系方式345938198,有问题希望大家多多交流。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-14 09:54 , Processed in 1.200272 second(s), 40 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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