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

使用HAL_UART_Transmit_DMA全局卡死,不再执行任何代码

[复制链接]
1289484181@qq.c 提问时间:2024-1-27 23:46 / 已解决

image.png

image.png

image.png

image.png

image.png

image.png

gImage是一个3184字节的图片,当执行完HAL_UART_Transmit_DMA全局卡死

数据成功发送,但是发送完不会执行下一步

使用调试时,单步执行不卡死,直接run则卡死,退出调试时小概率执行下一步

os与oss分别是单步调试时该寄存器出现的两个值,对应寄存器可在参考手册RM0090中文版第221页查询到,未给出的代码部分均为生成代码,未修改

F4版本1.27.1

收藏 评论8 发布时间:2024-1-27 23:46

举报

8个回答
xmshao 最优答案 回答时间:2024-1-30 09:23:48
我的另一猜想就是你说的卡死跟我理解的不一样。你没有卡死只是后面的Printf没有得到执行。现在你的printf和前面基于DMA方式的UART发送是同一外设,这时二者间保持足够合适的延时就变成必须了。因为你调用库函数,此时状态机管理起了作用,否则DMA和CPU打起架来了。当然,如果对延时长短敏感的话,建议查询基于DMA完成标志来决定程序走向。
xmshao 回答时间:2024-1-30 09:23:48
我的另一猜想就是你说的卡死跟我理解的不一样。你没有卡死只是后面的Printf没有得到执行。现在你的printf和前面基于DMA方式的UART发送是同一外设,这时二者间保持足够合适的延时就变成必须了。因为你调用库函数,此时状态机管理起了作用,否则DMA和CPU打起架来了。当然,如果对延时长短敏感的话,建议查询基于DMA完成标志来决定程序走向。
butterflyspring 回答时间:2024-1-29 10:23:55
看起来像发送的时间延时不够,将中间延时改为1000即1秒试试效果。
xmshao 回答时间:2024-1-29 11:38:15
意思是说基本功能没有问题了。怀疑你关于中断优先级安排方面有问题。检查下是否出现高优先级中断里等待基于低优先级中断的处理结果的情形。
1289484181@qq.c 回答时间:2024-1-29 13:08:02

xmshao 发表于 2024-1-29 11:38
意思是说基本功能没有问题了。怀疑你关于中断优先级安排方面有问题。检查下是否出现高优先级中断里等待基于 ...

感谢您的回答,我刚刚试了一下,在DMA发送后必须延迟一秒以上才可以正常运行,但是我的串口助手在不到一秒就已经发送完毕,并且显示的DMA2->HISR是0x04000000,根据手册得知发生DMA传输完成全局中断,此时进入WHILE循环有概率无法跳出,调试得知此时又是0x0C000000,发生DMA中断错误,但是我并没有修改中断级,全默认,在等待1S后变成复位值,可以正常执行,我很疑惑这是怎么产生的,我也做了串口的标志位,TC标志显示发送完毕,DMA与其他外设的初始化顺序都是正常的,DMA在前,外设在后,请问您能做个简单的猜想来帮助我更好的解决问题吗,谢谢。

1289484181@qq.c 回答时间:2024-1-29 13:08:30

butterflyspring 发表于 2024-1-29 10:23
看起来像发送的时间延时不够,将中间延时改为1000即1秒试试效果。

感谢您的回答,我刚刚试了一下,在DMA发送后必须延迟一秒以上才可以正常运行,但是我的串口助手在不到一秒就已经发送完毕,并且显示的DMA2->HISR是0x04000000,根据手册得知发生DMA传输完成全局中断,此时进入WHILE循环有概率无法跳出,调试得知此时又是0x0C000000,发生DMA中断错误,但是我并没有修改中断级,全默认,在等待1S后变成复位值,可以正常执行,我很疑惑这是怎么产生的,我也做了串口的标志位,TC标志显示发送完毕,DMA与其他外设的初始化顺序都是正常的,DMA在前,外设在后,请问您能做个简单的猜想来帮助我更好的解决问题吗,谢谢。

butterflyspring 回答时间:2024-1-29 17:00:21
我是估算你那图片(3184)个字节的发送时间会超过100ms,而printf 也用的是同一个串口,不太符合逻辑。


所以你可以去掉它后面的printf 试试或者将HAL_Delay(100)改为条件判断也行。
1289484181@qq.c 回答时间:2024-1-30 17:41:28

xmshao 发表于 2024-1-30 09:23
我的另一猜想就是你说的卡死跟我理解的不一样。你没有卡死只是后面的Printf没有得到执行。现在你的printf和 ...

感谢您的回答,也十分的有道理,我确实没有考虑好外设的问题,经过您的指点,我取消延时,采用两个串口分别发送,解决了该问题,非常感谢您的回答

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版