目錄預覽
1、引言
2、問題
3、問題解決
4、小結
01
引言
很多 STM32 系列中的 ADC 都帶有自校準的功能。它提供了一個自動校準的過程,用于驅動包括 ADC 上電/掉電序列在內的所有校準動作。在這個過程中,ADC 計算出一個校準因子,并在內部應用到此 ADC 模塊,直到下一次 ADC 掉電。在執行任何 ADC 操作之前必須校準,以消除芯片之間 ADC 結果的偏差。
02
問題
2.1. 問題詳情
客戶使用 STM32U575ZIT6Q 驗證 ADC4 時,使用 STM32CubeMX 配置后生成工程項目。因為使用 ADC 進行采樣轉換前,必須要做 ADC 的自校準。于是在 main 函數中加入自校準代碼,如圖 1 所示。
![wKgZomV1e7qAY1wgAABT0CW0xu8134.jpg](https://file1.elecfans.com//web2/M00/B5/94/wKgZomV1e7qAY1wgAABT0CW0xu8134.jpg)
圖1.代碼:ADC 自校準
然而,在運行代碼的情況下,發現 PC 指針最后跑到這個 Calibration Error 的Error_Handler()里。也就是說,執行自校準失敗了!
再檢查進入 Error_Handler()發生的問題,發現在執行HAL_ADCEx_Calibration_Start()時陷在了下面這個 Loop 當中,如圖 2 所示。
![wKgZomV1e7qATXCCAACJk9sCAkM641.jpg](https://file1.elecfans.com//web2/M00/B5/94/wKgZomV1e7qATXCCAACJk9sCAkM641.jpg)
圖2.代碼:等待 ADC 自校準完成
也就是說,ADCAL 位被置 1 后,始終沒有被硬件清 0,代表自校準始終不成功。
2.2. 問題分析
查看 STM32U5 的參考手冊 RM0456 中關于自校準的描述。考慮到校準沒有成功,那么應該看看是不是自校準需要哪些條件,而這些條件并沒有成立。
于是,在 ADC 章節中的 Calibration 小節找到了這么一段話,如圖 3 所示。
![wKgZomV1e7uAdIIgAACWubvvays217.jpg](https://file1.elecfans.com//web2/M00/B5/94/wKgZomV1e7uAdIIgAACWubvvays217.jpg)
圖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。
![wKgZomV1e7uAZofaAAG5GJGPf38431.jpg](https://file1.elecfans.com//web2/M00/B5/94/wKgZomV1e7uAZofaAAG5GJGPf38431.jpg)
從圖中黃色高亮的文字,我們可以了解到,STM32U5 的 VDDA 在控制上還跟其他系列不一樣,它有一個開關來選擇是否隔離。芯片復位后,VDDA 提供的 ADC 和模擬開關控制在邏輯和電氣上是隔離的,因此不可用。一旦 VDDA 電源存在,就必須在使用模擬外設之前,通過在 PWR_SVMCR 寄存器中將 ASV 置位來消除隔離。也就是說,要想使用ADC,必須先將 ASV 置位來消除隔離。
在 PWR_SVMCR 寄存器的解釋中,也可以看到 ASV 位的描述中要求將此位強制置 1才可以使用模擬外設,如圖 5。
![wKgZomV1e7uAQJKdAAC6z9jcInY958.jpg](https://file1.elecfans.com//web2/M00/B5/94/wKgZomV1e7uAQJKdAAC6z9jcInY958.jpg)
圖5.ASV 位描述
ASV 的配置是沒有在 STM32CubeMX 中進行配置的,所以需要在后期添加。所以,很可能就是因為沒有將 ASV 置位以使能 VDDA,導致 ADC 外設被隔離,并沒有得到供電,所以 ADC 的電壓調整器不可能正常工作,LDORDY 也不可能為 1。
03
問題解決
在工程項目中搜索 ASV,可以找到兩個 API,如圖 6。
![wKgZomV1e7uAe3w2AADPvGnknRw460.jpg](https://file1.elecfans.com//web2/M00/B5/94/wKgZomV1e7uAe3w2AADPvGnknRw460.jpg)
圖6.VDDA 使能或禁用 API
也就是說,我們需要先將 HAL_PWREx_EnableVddA()添加到代碼中。因為其屬于MSP 硬件配置,所以將其加到 HAL_MspInit()函數,如圖 7 所示。
![wKgZomV1e7uACC1ZAACpY3G4lvA520.jpg](https://file1.elecfans.com//web2/M00/B5/94/wKgZomV1e7uACC1ZAACpY3G4lvA520.jpg)
圖7.修改過的 HAL_MspInit()函數
再重新編譯,然后執行指令代碼,就可以看到 ADC 的自校準可以正常完成,PC 指針已經可以正常跑到自校準后面的代碼了。
04
小結
在 STM32U5 中,為了更好地控制功耗,ADC 中加入電壓調整器和 VDDA 隔離功能。這與以往的 STM32 有所不同,需要注意一下。使用 ADC 等模擬外設前,需要注意將PWR_SVMCR 寄存器中將 ASV 置位來消除隔離。
其實不僅僅是 VDDA 可以隔離,VDDIO2 也是可以的,通過 PWR_SVMCR 寄存器的IO2SV 位進行控制。
如果仔細看過 STM32U5 的 ADC 例程,可以看到 HAL_MspInit()的內容是這么寫的,如圖 8 所示。
![wKgZomV1e7yAZ9XYAAC98ziGubc031.jpg](https://file1.elecfans.com//web2/M00/B5/94/wKgZomV1e7yAZ9XYAAC98ziGubc031.jpg)
圖8.例程的 HAL_MspInit()函數
可以看到,在 MSP 初始化里,不僅使能了 VDDA,還使能了 VDDIO2。所以要使用VDDIO2 相關 I/O 的,也需要注意一下。
完整內容請點擊“閱讀原文”下載原文檔。
原文標題:實戰經驗 | STM32U5 ADC 自校準不成功的問題分析
文章出處:【微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
-
單片機
+關注
關注
6044文章
44628瀏覽量
638993 -
STM32
+關注
關注
2273文章
10926瀏覽量
357789
原文標題:實戰經驗 | STM32U5 ADC 自校準不成功的問題分析
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
提升開關電源效率的理論分析與實戰經驗
![提升開關電源效率的理論<b class='flag-5'>分析</b>與<b class='flag-5'>實戰經驗</b>](https://file1.elecfans.com/web3/M00/05/55/wKgZPGd_LySAYShvAAAZtQjQtaA655.jpg)
STM32項目實戰:基于STM32U5的智能大棚溫控系統(LVGL),附項目教程/源碼
![<b class='flag-5'>STM32</b>項目<b class='flag-5'>實戰</b>:基于<b class='flag-5'>STM32U5</b>的智能大棚溫控系統(LVGL),附項目教程/源碼](https://file1.elecfans.com/web1/M00/F3/AE/wKgaoWcbMkOACK3bAADR97jANBQ879.png)
STM32項目實戰:基于STM32U5的火災報警系統(LVGL),附項目教程/源碼
![<b class='flag-5'>STM32</b>項目<b class='flag-5'>實戰</b>:基于<b class='flag-5'>STM32U5</b>的火災報警系統(LVGL),附項目教程/源碼](https://file1.elecfans.com/web1/M00/F3/F3/wKgaoWch0G-AQMAiAADiP0TvLE8120.png)
ADS127L11配置ADC使用外部時鐘以及FILTER[4:0]都不成功,為什么?
STM32項目實戰:基于STM32U5的智能燈光控制系統(LVGL),附項目教程/源碼
![<b class='flag-5'>STM32</b>項目<b class='flag-5'>實戰</b>:基于<b class='flag-5'>STM32U5</b>的智能燈光控制系統(LVGL),附項目教程/源碼](https://file1.elecfans.com/web2/M00/0B/F7/wKgaomcsfiCAViRnAADVdnLw4X4123.png)
ESP-WROOM-02U用esptouch來配置路由器不成功怎么解決?
STM32H5和STM32U5在trustzone上有哪些不同?
STM32F103 USB枚舉不成功的原因?
STM32F103RGT6位帶操作不成功的原因?
STM32U5,STM32WB及STM32L4開發板,哪個開發板擁有較多數量的ADC?
STM32U5開發板ADC校準超時怎么解決?
基于STM32U5片內溫度傳感器正確測算溫度實戰經驗分享
![基于<b class='flag-5'>STM32U5</b>片內溫度傳感器正確測算溫度<b class='flag-5'>實戰經驗</b>分享](https://file1.elecfans.com/web2/M00/C0/A2/wKgZomXXFAeASCL3AAALrMVtBG8898.jpg)
評論