目錄預覽
1、引言
2、問題
3、問題解決
4、小結
01
引言
很多 STM32 系列中的 ADC 都帶有自校準的功能。它提供了一個自動校準的過程,用于驅動包括 ADC 上電/掉電序列在內的所有校準動作。在這個過程中,ADC 計算出一個校準因子,并在內部應用到此 ADC 模塊,直到下一次 ADC 掉電。在執行任何 ADC 操作之前必須校準,以消除芯片之間 ADC 結果的偏差。
02
問題
2.1. 問題詳情
客戶使用 STM32U575ZIT6Q 驗證 ADC4 時,使用 STM32CubeMX 配置后生成工程項目。因為使用 ADC 進行采樣轉換前,必須要做 ADC 的自校準。于是在 main 函數中加入自校準代碼,如圖 1 所示。
圖1.代碼:ADC 自校準
然而,在運行代碼的情況下,發現 PC 指針最后跑到這個 Calibration Error 的Error_Handler()里。也就是說,執行自校準失敗了!
再檢查進入 Error_Handler()發生的問題,發現在執行HAL_ADCEx_Calibration_Start()時陷在了下面這個 Loop 當中,如圖 2 所示。
圖2.代碼:等待 ADC 自校準完成
也就是說,ADCAL 位被置 1 后,始終沒有被硬件清 0,代表自校準始終不成功。
2.2. 問題分析
查看 STM32U5 的參考手冊 RM0456 中關于自校準的描述。考慮到校準沒有成功,那么應該看看是不是自校準需要哪些條件,而這些條件并沒有成立。
于是,在 ADC 章節中的 Calibration 小節找到了這么一段話,如圖 3 所示。
圖3.ADC 自校準要求條件
也就是說,在初始化自校準之前,需要保證 3 個條件:
1) ADC 的電壓調整器已經使能并正常工作(ADVREGEN = 1 且 LDORDY =1)
2) ADC 沒有打開(ADEN=0)
3) 自動掉電模式沒有使能(AUTOFF = 0)
回到剛才等待 ADC 自校準完成的代碼,當指針停留到這邊時,在線調試檢查各個標志位情況,發現 ADVREGEN=1,ADEN=0,AUTOFF=0,LDORDY=0。所以,可以肯定的是就是 LDORDY 不為 1,也就是說 ADC 的電壓調整器還沒有準備好,導致了自校準無法成功并退出。
在 STM32U5 中,引入了一個新的 ADC 特性,叫 ADC 電壓調整器(ADC voltageregulator)。在使用 ADC 之前,這個電壓調整器必須被使能并且能夠穩定工作??梢酝ㄟ^將 ADC_CR 寄存器中的 ADVREGEN 位置 1 來使能它,然后必須要等這個電壓調整器的啟動時間之后,才可以正常啟動自校準或者使用 ADC。這個 LDO 有沒有準備好,可以通過 ADC_ISR 寄存器中的 LDORDY 這個位來判斷。LDORDY=1 才代表了 LDO 已經準備好了。
回到客戶的問題,可以知道即使 ADVREGEN 置 1 了,LDORDY 始終沒有置起來,電壓調整器沒有啟動工作,難道是 ADC 的這個電壓調整器壞掉了?
別急,想到電源的問題,還不能忘了參考手冊的另一個章節 :電源控制 PWR。翻到PWR 這一章,先要考慮到,與 ADC 相關的電源為 VDDA,所以要重點查看 VDDA 的內容。找到 Independent analog peripherals supply 這一小節,可以看以下關鍵的句子,如圖 4。
從圖中黃色高亮的文字,我們可以了解到,STM32U5 的 VDDA 在控制上還跟其他系列不一樣,它有一個開關來選擇是否隔離。芯片復位后,VDDA 提供的 ADC 和模擬開關控制在邏輯和電氣上是隔離的,因此不可用。一旦 VDDA 電源存在,就必須在使用模擬外設之前,通過在 PWR_SVMCR 寄存器中將 ASV 置位來消除隔離。也就是說,要想使用ADC,必須先將 ASV 置位來消除隔離。
在 PWR_SVMCR 寄存器的解釋中,也可以看到 ASV 位的描述中要求將此位強制置 1才可以使用模擬外設,如圖 5。
圖5.ASV 位描述
ASV 的配置是沒有在 STM32CubeMX 中進行配置的,所以需要在后期添加。所以,很可能就是因為沒有將 ASV 置位以使能 VDDA,導致 ADC 外設被隔離,并沒有得到供電,所以 ADC 的電壓調整器不可能正常工作,LDORDY 也不可能為 1。
03
問題解決
在工程項目中搜索 ASV,可以找到兩個 API,如圖 6。
圖6.VDDA 使能或禁用 API
也就是說,我們需要先將 HAL_PWREx_EnableVddA()添加到代碼中。因為其屬于MSP 硬件配置,所以將其加到 HAL_MspInit()函數,如圖 7 所示。
圖7.修改過的 HAL_MspInit()函數
再重新編譯,然后執行指令代碼,就可以看到 ADC 的自校準可以正常完成,PC 指針已經可以正常跑到自校準后面的代碼了。
04
小結
在 STM32U5 中,為了更好地控制功耗,ADC 中加入電壓調整器和 VDDA 隔離功能。這與以往的 STM32 有所不同,需要注意一下。使用 ADC 等模擬外設前,需要注意將PWR_SVMCR 寄存器中將 ASV 置位來消除隔離。
其實不僅僅是 VDDA 可以隔離,VDDIO2 也是可以的,通過 PWR_SVMCR 寄存器的IO2SV 位進行控制。
如果仔細看過 STM32U5 的 ADC 例程,可以看到 HAL_MspInit()的內容是這么寫的,如圖 8 所示。
圖8.例程的 HAL_MspInit()函數
可以看到,在 MSP 初始化里,不僅使能了 VDDA,還使能了 VDDIO2。所以要使用VDDIO2 相關 I/O 的,也需要注意一下。
完整內容請點擊“閱讀原文”下載原文檔。
原文標題:實戰經驗 | STM32U5 ADC 自校準不成功的問題分析
文章出處:【微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
-
單片機
+關注
關注
6023文章
44378瀏覽量
628606 -
STM32
+關注
關注
2258文章
10828瀏覽量
352546
原文標題:實戰經驗 | STM32U5 ADC 自校準不成功的問題分析
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論