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

5482

被折叠的 条评论
为什么被折叠?



