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

STM32G4使用串口DMA收发数据,一直进中断卡死其他任务

[复制链接]
仲裁者 提问时间:2023-5-28 22:23 / 未解决

我用的芯片是STM32G491,用的HAL库(CubeMx生成),最近在做485通讯测试,用串口调试助手与3台设备进行通讯,串口用的DMA模式,波特率57600,1bit起始位,8bit数据,1bit停止位,无校验。

上位机每10ms对一台设备进行参数配置

程序架构简单描述一下,有一个1ms定时器中断,用来执行优先级最低的背景循环,例如看门狗喂狗、键盘扫描等。

串口中断优先级较高,主要通过串口的空闲中断来接收上位机的数据(因为上位机发送字节数不定,因此初始化DMA的缓冲区大小时,用最大字节数进行初始化)。

开始测试后,刚开始一切正常,但过了几分钟到十几分钟不等,会出现芯片复位的情况,通过仿真器发现是程序会一直进串口中断以及对应接收的DMA通道中断,从而导致看门狗复位。

我在刚刚进入串口中断时打断点,发现ISR寄存器里全是0,此外查看串口句柄相关变量,很多也是0,例如pRxBuffPtr(指定的DMA接收缓存地址)和RxXferSize(指定的接收大小)都是0,串口接收状态指示变量RxState也是0。

感觉就像是串口被DeInit了。

我在CubeMx中将Overrun和DMA on Rx Error都关掉了,发现没有任何作用,依然会卡死程序。

感觉就是上位机发送周期10ms太快了,因为我将发送周期改为100ms就没有问题,但不知道具体问题点在哪里,麻烦大家帮我看看,谢谢了

收藏 评论6 发布时间:2023-5-28 22:23

举报

6个回答
废鱼 回答时间:2023-5-29 09:03:11

检查一下串口溢出状态标志位,是否有数据处理过长导致串口数据溢出的情况。还有要检查一下数组的使用,是不是有超出的情况。比如因为数据错误导致,赋值的时候会超出当前数组的长度。

xmshao 回答时间:2023-5-29 09:34:45
你再仔细检查下有关UART和DMA传输的中断的标志位处理,比方DMA完成中断、半传输完成中断等。


还有,有无可能发生数组访问越界的问题。
仲裁者 回答时间:2023-5-29 10:03:53

废鱼 发表于 2023-5-29 09:03
检查一下串口溢出状态标志位,是否有数据处理过长导致串口数据溢出的情况。还有要检查一下数组的使用, ...

[md]我在异常的时候,通过仿真器看huart3.Instance->ISR,发现全是0

我也尝试过将DMA接收缓存数组的大小放大了3倍,但还是有同样的问题

知足- 回答时间:2023-5-29 10:59:13

每10ms发送多少字节的数据?485的TX和RX切换是怎么处理的。

废鱼 回答时间:2023-5-29 11:47:30

仲裁者 发表于 2023-5-29 10:03
我在异常的时候,通过仿真器看huart3.Instance-&gt;ISR,发现全是0</p>
<p>我也尝试过将DMA接收缓存数组的大小 ...

[md]检查一下你数据的处理函数,可以先只接收数据不处理数据,如果这样没问题,就是你处理函数的问题了,需要增加数据长度和内容的校验。超出范围的就不要使用了。

刘维 回答时间:2023-5-30 15:02:38

插眼

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