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