| 前幾天發過一篇帖子,叫:關於STM32 ADC自校准的個人理解文章大體說的是自校准前要先將ADON位置1,之后再校准。 本以為徹底的了解了自校准的過程,但是昨天晚上無意間看到了一個函數說明,不禁愁雲又起, <ignore_js_op> 按照這個說明,使用這個自校准函數前應當使ADC處於掉電狀態下,但是這樣似乎就與英文的參考手冊矛盾了。經過探查,方才知道ST的參考手冊敘述文筆和結構編排是TM有多爛! 依據手冊介紹,我將STM32的ADC分為三種狀態:掉電狀態、上電狀態、工作狀態。 當芯片啟動運行時,ADC處於掉電狀態。當第一次將ADON位設定為1時,ADC從掉電狀態進入上電狀態,也就是手冊里說的“從掉電狀態下喚醒”,這時ADON位已經為1。當我們再次設定ADON位等於1時,這時ADC會按照此時的ADC_CR1、ADC_CR2等寄存器的設置開始轉換工作,也就進入了工作狀態。這也就是下圖紅框中話的含義。 <ignore_js_op> 接下來再分析HAL_ADCEx_Calibration_Start這個函數,通過一層一層查找,方知這個函數之所以要放在HAL_ADC_Start()之前或HAL_ADC_Stop()之后是因為這個函數本身就會執行將ADON置1這么一條語句。 也就是,執行自校准時ADC必須處於前面所說的上電狀態,如果ADC在工作狀態下——正在轉換或者進行過轉換——則要將ADON位清零,使ADC關閉進入掉電狀態下,之后再將ADON置1,進入上電狀態,之后再校准,再之后該注入組的注入該規則組的SCAN。也就是函數的使用說明和英文版的參考手冊並不矛盾,而是TMD ST根本就沒把這個說清楚! 接下來在順便說一下為什么當ADON=1時再次設定置ADON位為1會進入工作狀態(知道的就不必往下看了) 原因就是這句話 <ignore_js_op> 看過正點原子教程的應該都有這個印象,在ADC轉換實驗中原子將ADC_CR2的EXTSEL位設定為111,將EXTTRIG位設定為1,之后通過SWSTART位置1的方式來啟動轉換。其實根本不用這么復雜,只需要將ADON再置1就可以啟動轉換,無論這個轉換是單個通道還是還是通道組,效果與軟件觸發方式完全一樣。 接下來再說說規則組的連續轉換。 昨天晚上一直在嘗試這個,想在中斷中讀取多個通道的值,一直不成功,只能得到最后一個被轉換通道的值,現在才發現,又TM被ST的參考手冊坑!了! 關於連續轉換模式,手冊里是這么說的, <ignore_js_op> 一個規則通道被轉換完畢后EOC會被置位同時進入中斷。 但是,在ADC中斷章節又是這么說的, <ignore_js_op> 一個通道組轉換完畢后才進入中斷,而非單個通道。這也就是說,當規則組采用中斷方式時ADC_DR里必定放置的是最后被轉換的那個通道的值。那么是不是上面那個連續轉換模式的說明寫錯了。又前后翻了手冊n遍發現不是。 <ignore_js_op> 其實這里的單次轉換模式和連續轉換模式講的都是針對1個通道的,而規則組多通道的轉換在手冊里其實是叫掃描模式(還有另外一個間斷模式),然后掃描模式里再按照CONT位的不同分為單次轉換模式和連續轉換模式。 也就是,文檔里的目錄層次結構如果是這樣會更利於閱讀和理解。 <ignore_js_op> 而不是像攤大餅一樣全部放在同一級目錄里。 現在我也才明白,為什么AN3116文檔中那么強烈的建議規則通道組連續轉換要使用DMA方式,因為用中斷就是白瞎啊!!!! 另外,中文參考手冊里關於掃描模式使用DMA的傳輸時間寫錯了 <ignore_js_op> 正確的應該是 <ignore_js_op> 只要ADC_DR更新就會進行傳遞。而ADC_DR會在每個通道轉換完后就更新。同時,這里也明確指出,使用掃描模式必須使用DMA。 有句話叫:一流的翻譯能把二流的文章翻譯成一流的作品,二流的翻譯能把一流的作品翻譯成二流的文章,二流的文章如果碰到二流的翻譯,只能成為三流的shit。在我看來ST屬於最后這一種,尤其是 be set翻譯成被設置,簡直是梗到家了。 之前看着數據手冊自學AVR時順風順水,錯誤和編排不當非常少,雖說STM32相比之下更復雜、產品線更長、頁數更多但是參考手冊里這么多明顯的敘述錯誤和槽糕的層次結構就我這個門外漢也能看出來啊,這么多錯誤和含混不清簡直就是殘害生命、初學者的噩夢啊,撞牆的心都有了。那STM8和STVD更是一塊爛豆腐,第一次見ERRATA能寫那么長的。現在看ST的參考手冊無論中英文都有一種哈利波特找魂器的感覺,要上下來回翻閱n次,然后將關聯點組織在一起,之后再去進行邏輯分析判斷正誤,太累心了!!!ST為中國市場砸這么多錢就不能好好寫寫自己的文檔嗎,重新編排一下能費幾個錢。中文版的文檔5年都沒改過了,翻譯都死光了嗎。各位前輩都是怎么過來的?難道因為一直在用函數庫沒關注過底層這些? 最后分享一個AN3116文檔中提到的范例包,里面有SCAN模式DMA傳輸的范例。結合關於STM32 ADC自校准的個人理解中的AN3116文檔一起使用“更有利於鈣質吸收”。
此帖出自
stm32/stm8論壇
|
-
-
2.56 MB, 下載次數: 82
