某STM32用戶使用STM32F407芯片開發(fā)產(chǎn)品。用到內(nèi)部3個(gè)ADC,其中ADC1與ADC2工作在ADC雙模式,ADC3獨(dú)立工作。運(yùn)行代碼時(shí)給FLASH開鎖編程后,發(fā)現(xiàn)ADC3不工作了(其DR數(shù)據(jù)寄存器似乎不更新了,倒是用來觸發(fā)ADC的定時(shí)器TIM2依然正常),F(xiàn)lash編程前后ADC3配置寄存器CR1、CR2沒有發(fā)生改變。如果重新配置ADC3后就能正常工作。
從問題現(xiàn)象來看,初步感覺跟flash編程有些關(guān)系。
經(jīng)了解,客戶的確做了flash編程,有一部分參數(shù)需要存放在FLASH內(nèi)。他的ADC3是由TIM2觸發(fā)的,ADC3的轉(zhuǎn)換結(jié)果是通過DMA搬運(yùn)。
鑒于此,我這邊便提醒他,如果不是基于雙BANK條件,在flash編程時(shí)CPU是堵塞的,此時(shí)若發(fā)生中斷不會得到響應(yīng),讓他注意這點(diǎn)及因此可能導(dǎo)致的問題。
客戶進(jìn)一步反饋確認(rèn):
1:通ADC結(jié)果過DMA讀取,并非中斷方式獲?。?br />
2:FLASH編程過程中禁止了所有中斷;
3:奇怪的是ADC3改為由軟件觸發(fā)則沒有異?,F(xiàn)象。用來觸發(fā)ADC的定時(shí)器一直計(jì)數(shù)正常,并且只要重新配置ADC3(無須對觸發(fā)定時(shí)器重新配置)也能恢復(fù)它的正常工作。
先說下客戶提到的在flash編程時(shí)將總中斷關(guān)閉動作。其實(shí),從效果來講,這個(gè)關(guān)中斷沒啥用,反正在Flash編程過程中即使有中斷發(fā)生CPU也不會給予響應(yīng)。
結(jié)合其反饋,軟件觸發(fā)和定時(shí)器觸發(fā)ADC有個(gè)明顯差別,就在于定時(shí)器的觸發(fā)對于我們用戶來講往往存在些未知性或不確定性,即不知它具體的觸發(fā)時(shí)間點(diǎn)??蛻粢恢睆?qiáng)調(diào)TIM工作保持正常,對ADC不能被觸發(fā)感到奇怪。
整體上,通過問題癥狀結(jié)合經(jīng)驗(yàn)初步判斷是ADC3發(fā)生溢出事件了,建議客戶做進(jìn)一步檢查確認(rèn)。
后來,他反饋的確是發(fā)生了ADC溢出事件。在FLASH編程前暫停TIM2觸發(fā)就可以避免溢出發(fā)生,不再發(fā)生ADC功能異常。
按理說他現(xiàn)在ADC結(jié)果是DMA傳輸,TIM觸發(fā)DMA時(shí)應(yīng)該可以及時(shí)讀取數(shù)據(jù)的,怎么還發(fā)生了溢出呢?那就有種可能,在某個(gè)時(shí)刻,當(dāng)ADC被TIM觸發(fā)完成轉(zhuǎn)換后,這時(shí)的DMA還沒有準(zhǔn)備好,導(dǎo)致ADC的結(jié)果沒有被及時(shí)取走。
那什么原因會導(dǎo)致ADC結(jié)果不能被及時(shí)取走呢?若DMA配置在非循環(huán)模式,當(dāng)DMA傳輸完成一輪數(shù)據(jù)后,DMA將不再繼續(xù)實(shí)施數(shù)據(jù)傳輸,這時(shí)CPU往往還會進(jìn)入DMA中斷服務(wù)程序做些必要處理或者為下輪傳輸做準(zhǔn)備。若這個(gè)DMA傳輸完成中斷發(fā)生在FLASH編程期間,這就可能導(dǎo)致問題。由于該期間它本身不能得到響應(yīng),下一輪的DMA傳輸就沒法被開啟。但此時(shí)的TIM還是依然如故地觸發(fā)ADC,其結(jié)果若不能被及時(shí)取走,導(dǎo)致溢出就再自然不過了。
當(dāng)ADC發(fā)生溢出后,如果沒有對溢出位做清零,后續(xù)的ADC轉(zhuǎn)換動作是不會觸發(fā)DMA的。具體到本案例,嚴(yán)格地講,后來客戶覺得讀不到ADC的更新數(shù)據(jù),不是因?yàn)锳DC不工作,其實(shí)它一直被定時(shí)器觸發(fā)轉(zhuǎn)換,只是因?yàn)榘l(fā)生了溢出,沒法正常觸發(fā)DMA傳輸,進(jìn)而無法實(shí)現(xiàn)ADC結(jié)果的搬運(yùn)。
所以,在上述應(yīng)用情況下,在做flash編程前可以先行關(guān)閉定時(shí)器,之后再打開?;蛘咴贒MA傳輸完成的中斷服務(wù)程序里,在重新開啟DMA之前,先暫時(shí)關(guān)閉定時(shí)器,對并ADC的溢出及出錯(cuò)做檢測處理,之后再開啟定時(shí)器和DMA傳輸。
-
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124577 -
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
365151 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3298瀏覽量
119014
原文標(biāo)題:對STM32內(nèi)部FLASH編程時(shí)遇到的ADC異常問題
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
第二十九章 讀寫內(nèi)部FLASH

請問STM32G431內(nèi)部運(yùn)放1和2輸出連接的ADC為什么不是OPAMP?
STM32F40xxx和STM32f41xx flash編程手冊
請問STM32G431內(nèi)部運(yùn)放1和2輸出連接的ADC為什么不是OPAMP?
如何通過SFL為設(shè)備添加Flash編程支持

請問STM32G431內(nèi)部運(yùn)放1和2輸出連接的ADC為什么不是OPAMP?
ad77681數(shù)據(jù)讀取異常的原因?
STM32使用外部中斷觸發(fā)ADC采樣DMA搬運(yùn)出現(xiàn)兩次進(jìn)入DMA中斷的異常情況,怎么解決?
STM32H750內(nèi)部flash讀寫的疑問求解
cubeide的代碼怎么編譯到內(nèi)部+外部FLASH里面去?
SAR ADC的工作頻率范圍是多少,AD10D1500這類的ADC屬于Flash ADC嗎?
STM32C011開發(fā)(2)----nBOOT_SEL設(shè)置

STM32WB55RG開發(fā)(2)----STM32CubeProgrammer燒錄

評論