STM32 ADC DMA时EOC转换完成中断异常

当在STM32F1上使用ADC1并开启DMA进行连续通道电压采集时,发现EOC中断频率变慢。原因在于开启DMA后,读取ADC的DR寄存器会清除EOC标志位,导致中断服务函数中无法通过EOC标志判断中断。解决方案包括不依赖EOC中断,直接读取DMA传输的数据,或者修改中断判断条件。此问题的解决关键在于理解ADC与DMA的交互机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:用ADC1连续采集几个通道上的电压值,配置为规则组,没有开启ADC1的DMA的时候EOC中断是正常的。但是开启ADC1的DMA传输之后EOC中断的频率明显变慢了。

开始以为是STM32F1的DMA和CM3内核共享系统数据总线,然后DMA的开启导致CM3响应ADC中断的速度变慢。

但是,后来发现原因是开启DMA会读取ADC的DR寄存器,而ADC的DR寄存器的读操作会清除EOC(转换完成)标志位,所以ADC的中断服务函数中判断不到EOC标志位。(清除了EOC标志位,但ADC的中断服务函数还是可以正常进入的。只是判断不到EOC标志了)
然后去翻了一下数据手册中ADC的状态寄存器EOC标志位的说明:
在这里插入图片描述“读取ADC_DR时清除”。
所以,可以不用DMA,EOC中断就能正常判断了。或者仅使能EOC中断,只要进了ADC的中断服务函数中就认为是EOC中断。(但是要注意在STM32F1中ADC1和ADC2共用一个中断向量)
再或者没有必要的话就不用EOC中断了,不用使能EOC中断。直接读取DMA转换来的数据即可。

感谢一下这篇帖子的作者(https://blog.csdn.net/diyer_zhou/article/details/108698771
第一句话就把我遇到的问题给解决了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值