关于Keil调试STM32F407的 ADC过程异常:不进中断,EOC标志莫名清零的问题的解决。

关于Keil调试STM32F407的 ADC过程异常:不进中断,EOC标志莫名清零等问题的讨论与解决

设置了F407中的3路ADC工作于独立模式,每次转换结束后产生中断。
由于程序比较庞大了,决定采用调试方式测试代码,结果发现程序经常无法正常进入中断,每次单步运行时,启动ADC后,EOC标识置位;再运行一步,其EOC标志位会自动清零,导致调试过程中断根本无法进入。其过程如图:

ADC断点调试
从图中可以看到,启动ADC1转换后,EOC1置位了。单步运行一步如图:
运行一步后
可以看出EOC1标志位自动清零了,由于单步运行,单步过程并没有进入中断EOC1就被清0 了,同样三个ADC都是这样的情况,这个问题困扰了我很久,查看了无数遍数据手册,也怀疑了中断的问题,看了M4内核手册,看了无数遍库代码,网络搜索了相关信息都没有发现问题及找到解决办法。甚至怀疑了硬件供电问题,把所有电源情况测量了一遍。并且如果断点不设置在此位置,设置在中断中,会出现死机的情况。
后来一个一个ADC调试发现好一点,但是还是有点问题,最后不知道怎么莫名其妙的好了一些。
其实在看数据手册过程中,其有一段话图3 EOC清零方式
当时看到这个解释的时候,我一直认为我的代码没有在任何中断外度去过ADC的转换结果,怎么就会清零了,后来莫名其妙的好了,也不知道自己点了啥地方,一直磨了我6七个小时,最后无奈带小孩睡觉。
直到第二天,又出现了这样的情况,很是担心这个问题,想往下继续写代码,但是又想到这个问题以后出现咋整,频率还高。无意中我退出调试后,硬件复位自由运行,结果程序没有一点问题,反复试了几次都一样,问题就在:调试出现,复位自动运行没有任何问题。
通过反复思考:可以肯定的是调试过程中EOC标志被清0了,为什么呢?那后面的程序我是调试还是不调试了?忽然想起图3中的话,我调试过程中,添加了peripherals查看了ADC1、ADC2、ADC3寄存器,也就是图1和图2中右下角,那不是就读取了ADCx->DR么?会不会导致EOC清零?于是我取消了ADC1外设查看,调试运行如图4所示:
图4 取消ADC1外设寄存器查看后
发现ADC1的EOC标志位不会被清零了,而其他2个还是会被清零,可以肯定的是:在调试过程中,查看ADC寄出器的值读取了DR寄存器,肯定会导致ADC的EOC标志位清零。这里也明白了STM32为什么要给出C_ADC寄存器用来查看各个ADC运行状态了,原来一直觉得多余,看来还是有目的的。所以在ADC调试过程中,对于EOC标志位的查看一定要从C_ADC中的SR寄存器查看,不然会引起程序死机(如果你的程序具有在等待EOC的情况)。

发布了3 篇原创文章 · 获赞 2 · 访问量 78

猜你喜欢

转载自blog.csdn.net/weixin_42094842/article/details/104494253