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

STM32F3系列SDADC外部触发 DMA运输的bug

[复制链接]
rui41104 提问时间:2026-7-15 16:11 / 未解决

最近公司说现场有机器卡死的情况 让复现出卡死的bug 逻辑是这样

ADC触发是外部上升沿触发 1ms触发一次 触发一次ADC采集一组 一组三个数据 一共采集15组 采集到之后 给DMA发请求 DMA把数据从ADC外设搬到内存 DMA传输完45个了 触发DMA的中断 DMA中断内先关掉ADC 再关掉PWM 然后改了一下标志位为1 主循环内一开始标志位为0 为1的时候进行数据处理 处理完了把标志位改为0 进行下一轮 现在是想复现出ADC卡死的情况 目前推测是和JDMAEN的置位时刻有关 感觉可能是时序问题 翻到数据手册发现有这么一句刚好是描述我这个的情况

In order to stop a circular transfer, the software needs to stopthe peripheral from generating DMA requests (such as quit the ADC scan mode), before disablingg the DMA channel The software must explicitly program the DMA_CNDTRX value before starting/enabling atransfer, and after having stopped a circular trans。

这个让关掉ADC前先关触发源 我想知道如果先关触发源会导致什么bug

求助求助 要复现卡死这个bug 求助

收藏 评论2 发布时间:2026-7-15 16:11

举报

2个回答
butterflyspring 回答时间:5 小时前
这段话是说要停止循环传输,软件需要在禁用 DMA 通道之前,先阻止外设生成DMA 请求(例如退出 ADC 扫描模式)。  所以如果不这样做理论上会遇到下面的问题:
1.剩余DMA 传输不保证正确完成,可能出现丢数、少搬一部分、buffer尾部数据异常
2.不会产生正常的DMA 传输完成中断,导致软件流程可能卡在等待完成事件上
3不能指望后续直接恢复这个DMA 通道;不重新配置(特别是 DMA_CNDTRx)就恢复运行,是硬件不支持
4.某些场景下还可能出现重新使能后传输意外延续、状态不一致的问题,因此才要求必须先停外设请求,再关DMA
5.另外我还遇到过进入STOP 状态后没有唤醒的故障。


所以你可以提高这段软件运行频率看看发生故障的现象是否也高频发生。

rui41104 回答时间:5 小时前

butterflyspring 发表于 2026-7-15 17:01
这段话是说要停止循环传输,软件需要在禁用 DMA 通道之前,先阻止外设生成DMA 请求(例如退出 ADC 扫描模式 ...

你好 非常感谢你的回答 目前这个丢数据我已经发现 JOVRF会置位为1 代表数据溢出 也会存在一部分数据丢失的情况 这会导致HAL_SDADC_InjectedStart_DMA的返回值是ERROE 同时JDMAEN位无法被置为1 但是这并不会导致ADC卡死的情况 我观察到如果JDMAEN位被错误置为0的话会出现ADC采样 DMA停止搬运 导致中断无法触发 造成ADC卡死的情况 但遗憾的是我目前并不知道什么情况下JDMAEN会被置为0 对于你提到的进入STOP之后无法唤醒的情况 我很感兴趣 这可能与我复现bug有关 我想知道进入stop之后无法唤醒的故障是怎么触发的 十分感谢你的回答

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版