打印
[STM32F1]

Cubemx hal 库 HAL_UART_Receive_IT 的死锁问题

[复制链接]
1297|96
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qqjmjso|  楼主 | 2022-7-26 18:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题:
我在项目中最初用的是HAL_UART_Receive_IT,HAL_UART_Transmit。每次在接收到数据后会在回调函数里再次调用HAL_UART_Receive_IT。
当高频进行串口数据收发时,发现有概率不能正常接收数据。 问题发生后断电重启后,又恢复正常。


根据各种调查外加查资料,发现主要原因应是 __HAL_LOCK 的直接返回,导致HAL_UART_Receive_IT 失败后不能再开中断。

stm32f103 HAL 库的  串口中断方式接收数据的函数HAL_UART_Receive_IT、发送函数  HAL_UART_Transmit_IT、HAL_UART_Transmit 的内部实现都有   __HAL_LOCK(huart); 根据其实现,若调用时发现已经上锁,则会直接返回

HAL_BUSY。

1.有人建议说使用 HAL_UART_Transmit_IT代替HAL_UART_Transmit,但是我看内部实现都有 __HAL_LOCK(huart),这样一来只是会减小上述问题发生的概率,并未解决问题,因此并未采用。
2.我尝试在原本HAL_UART_Receive_IT的地方都追加了返回值判断,一旦返回  HAL_BUSY,就去主循环每10ms重新调用一次
HAL_UART_Receive_IT,直到返回正确。 但是经过长时间测试,又发生了问题,无法接续正常收发数据了。
3.我尝试在 HAL_UART_Receive_IT的实现里,把__HAL_LOCK(huart) 注释掉,跟2.的设备一起做长时间测试,做对比试验,目前暂未出现问题。  但网上的开发者说并不建议这样粗暴对策,我也暂不明确会有什么副作用,因此目前还在寻找更好的方法。

请问大佬们是否有什么建议? 感激不尽。

使用特权

评论回复
沙发
jackcat| | 2023-3-7 21:01 | 只看该作者
直接调用固定的函数就行。              

使用特权

评论回复
板凳
tifmill| | 2023-3-7 21:29 | 只看该作者
__HAL_LOCK 这个没哟遇到过。

使用特权

评论回复
地板
biechedan| | 2023-3-7 22:18 | 只看该作者
使能串口接收中断。               

使用特权

评论回复
5
zerorobert| | 2023-3-9 12:55 | 只看该作者
这个需要清楚中断吧              

使用特权

评论回复
6
朝生| | 2023-3-9 13:45 | 只看该作者
估计是高频数据速度太快了吧。

使用特权

评论回复
7
LLGTR| | 2023-3-9 13:45 | 只看该作者
有没可能是REC缓存溢出了。

使用特权

评论回复
8
天天向善| | 2023-3-9 13:46 | 只看该作者
接收的数据频率和速度是多少?

使用特权

评论回复
9
Undshing| | 2023-3-9 18:10 | 只看该作者
是不是要清除中断啊?

使用特权

评论回复
10
maudlu| | 2023-3-10 10:20 | 只看该作者
你的代码在哪里呢?              

使用特权

评论回复
11
1988020566| | 2023-3-10 11:07 | 只看该作者
在回调函数最后需要再次开启中断!!否则只能执行一次!!

使用特权

评论回复
12
cemaj| | 2023-3-10 14:58 | 只看该作者
http://www.stm32cube.com/article/74

使用特权

评论回复
13
pixhw| | 2023-3-10 17:56 | 只看该作者
库函数 printf使用dma吗  

使用特权

评论回复
14
AloneKaven| | 2023-3-10 22:21 | 只看该作者
是不没有清除中断?

使用特权

评论回复
15
elsaflower| | 2023-3-11 19:40 | 只看该作者
用 HAL_UART_Receive_IT()函数并配置对应的NVIC模块、调用对应的中断服务函数并且钩上对应的回调。

使用特权

评论回复
16
hearstnorman323| | 2023-3-11 21:24 | 只看该作者
它的功能是设置接收中断的参数,以及使能接收中断。

使用特权

评论回复
17
R2D2| | 2023-3-12 18:11 | 只看该作者
HAL库太辣鷄了。

使用特权

评论回复
18
vivilyly| | 2023-3-14 16:47 | 只看该作者
需要在主循环之前手动开启接收中断。

只有手动开启之后才能进入中断。

使用特权

评论回复
19
10299823| | 2023-3-14 17:34 | 只看该作者
是不是其他的中断在处理数据?              

使用特权

评论回复
20
中国龙芯CDX| | 2023-3-14 17:54 | 只看该作者
是不是要清除中断呀?

使用特权

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

本版积分规则

22

主题

50

帖子

1

粉丝