你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

汇报STM32F030的UART在DMA接收下的HAL BUG

[复制链接]
a208hlc-57526 提问时间:2015-7-28 03:15 /
我测试了Cube下STM32F030的DMA接收串口数据函数,如下
HAL_UART_Receive_DMA(&huart1, RxDatabuf, 32);
如果该函数被调用前,串口已经发生数据溢出,则调用该函数,DMA接收将不会正常启动,只接收1个字符,然后卡住这无法运行,无论是否重新调用该函数,都继续卡着,包括调用HAL_UART_DMAStop(&huart1) 也无济于事。
解决办法还没有仔细研究,但重新初始化串口之后可以继续运行。还没测试直接清除串口溢出位标志是否可行,但直接操作寄存器有违HAL的初衷。

如果可能的话,ST的cube能否修正一下呢?HAL用的人越来越多了,不知道其他型号是否也存在这个问题。
收藏 1 评论13 发布时间:2015-7-28 03:15

举报

13个回答
小小超 回答时间:2015-7-28 08:30:34
STM32F030 的外设好像是有点问题。上次我用SPI的也是有问题
JackieLaura 回答时间:2015-7-28 09:05:29
没用过HAL库,无能为力,帮顶。。
a208hlc-57526 回答时间:2015-7-28 10:57:21
其实STM32F0xx串口还有个新的中断,叫接收超时中断,注意,不是空闲中断哦,可以设置超时时间,STM32多少年才改进这个设计啊,有兴趣可以去测试一下
你好我好大家好! 回答时间:2015-7-28 12:01:51
帮顶                          
stary666 回答时间:2015-7-28 13:38:33
从不用HAL库
a208hlc-57526 回答时间:2015-7-28 14:24:13

HAL越来越强大,跨芯片平台,统一了STM32F系列的所有芯片,代码迁移很容易,只是现在bug还较多
stary666 回答时间:2015-7-29 12:10:17
bug最致命啊
gujiao 回答时间: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)
loook 回答时间:2016-10-19 22:49:31
楼主兄弟遇到的问题我也遇到了,我也汇报一下情况吧,希望大家共同进步,因为我解决问题的思路也是来自相关论坛。最近我在调试串口,USB,以及蓝牙模块的通信。大致流程是蓝牙接收的数据经过MCU串口接收,经过处理,在由USB转发出去。需要说明的是用的是ST公司推出的HAL库。在串口接收数据遇到了不少的麻烦,其中就是HAL_UART_Receive_DMA接收数据。遇到了楼主遇到的问题“如果该函数被调用前,串口已经发生数据溢出,则调用该函数,DMA接收将不会正常启动,只接收1个字符,然后卡住这无法运行,无论是否重新调用该函数,都继续卡着,包括调用HAL_UART_DMAStop(&huart1) 也无济于事。”为什么会这样呢?原因是蓝牙模块配置好以后收到了来自另一个蓝牙模块的命令。该命令本来是用来控制另一个模块的,但是由于没有及时检测到蓝牙已经连接,然后控制命令经过蓝牙透传模式发到了我这边,但是实际上我这边还没有,下发开始传输数据的命令,也就是说发生了串口上溢的错误,导致当发送开始传输命令时怎么也接收不到数据。我采用的解决办法是重新初始化了串口,然后问题迎刃而解。不过个人感觉应该还有其他办法解决这个问题,需要仔细研究一下HAL库和芯片的datasheet。好吧先这样了,回头接着汇报吧。我的联系方式345938198,有问题希望大家多多交流。
任风吹吹 回答时间:2016-10-20 10:23:21
除了重新初始化外,还有一种方法就是清除溢出标志,但只能使用串口读函数清除,楼主可以试下。另外请参考这个论坛内的实战经验: https://www.stmcu.org.cn/module/forum/thread-606799-1-1.html
yyq006 回答时间:2017-9-7 09:35:51
a208hlc-57526 发表于 2015-7-28 10:57
其实STM32F0xx串口还有个新的中断,叫接收超时中断,注意,不是空闲中断哦,可以设置超时时间,STM32多少年 ...

但是对于不定长的数据,超时时间设置多长是个问题
zhy233090130 回答时间:2020-2-27 16:37:22
楼主,我用F030时串口也存在问题,我重新初始化串口,发现死机了?请问如何重新初始化串口,想借鉴初始化那部分程序
zhy233090130 回答时间:2020-2-27 16:38:09
loook 发表于 2016-10-19 22:49
楼主兄弟遇到的问题我也遇到了,我也汇报一下情况吧,希望大家共同进步,因为我解决问题的思路也是来自相关 ...

您好,我这边用F030时串口也存在问题,我重新初始化串口,发现死机了?请问如何重新初始化串口,想借鉴初始化那部分程序
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版