问题:用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)
第一句话就把我遇到的问题给解决了。