關於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的情況)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章