1 前言
客戶反饋在批量生產(chǎn)階段,發(fā)現(xiàn)部分產(chǎn)品的MCU的RTC在低溫(0℃)下工作不正常,但是在常溫下又是正常的,且其他正常的MCU的RTC在常溫與低溫下都是正常的。
2 問題跟進與分析通過與客戶郵件溝通,了解到客戶使用的MCU型號是:STM32F030C6T6TR。在產(chǎn)品的主從結(jié)構(gòu)中主要用作電源管理和時鐘管理。通過客戶的描述,似乎相同型號不同片子都存在較大的差異。
由于時間緊急,在了解到初步信息后立即拜訪客戶,針對客戶認為有問題的MCU芯片做針對性試驗。通過STM32CubMx生成測試工程,分別使用LSI(40K),LSE(32.768K),RTC工作時每秒通過LED1(PB5)取反一次(通過LED1燈是否閃爍來指示RTC是否工作正常),然后分別測量OSC管腳與PA8腳(輸出LSI或LSE),并對比ST官方的NUCLEO-F030板,最終測試結(jié)果如下:
通過測試結(jié)果,我們得到如下信息:
當使用LSI時,無論常溫還是低溫下都能正常工作。
當使用LSE時,常溫下能正常工作,但在低溫(0℃)時,RTC不再工作(LED1停止閃爍),且PA8管腳無輸出,但保持為高電平,且此時OSC管腳此時是存在32.768K的波形的。
通過修改負載電容C1&C2的電容值從5.1pF修改到6.8pF時,原本低溫下不工作的RTC又能恢復正常工作。
對比ST官方的NUCLEO-F030板子,在常溫與低溫下均能正常工作。
從測試結(jié)果來看,通過修改負載電容的方式能讓原本不能正常工作的RTC恢復正常工作,這個似乎為客戶的負載電容不能精準的匹配系統(tǒng)的原因所致。
但客戶對于這種解釋是不接受的,理由是現(xiàn)在設計的負載電容5.1pF是通過測試后的值,精度可以達到6.5ppm,但如果改為6.8pF,那么精度將會變到大約30ppm,這個會嚴重影響到MCU的RTC的時間精準度,系統(tǒng)在長時間運行后,時間必然會偏差很大,超出設計合理范圍,這個是不允許的。
3 問題分析既然客戶不接受修改負載電容,那么首先我們重新梳理下客戶的晶振設計各種參數(shù)是否準確,客戶的LSE電路設計如下所示:
如上圖,圖中的MR10 10Mohm這個反饋電阻在實際電路中是沒有加的,晶振使用的是TXC的,從晶振廠商提供的數(shù)據(jù)手冊中得到相關參數(shù)如下:
再者,由于客戶代碼中使用的LSE drive配置的是最高等級,從下圖芯片對應的數(shù)據(jù)手冊中可以找到對應的gm值為25uA/V,此時的驅(qū)動電流為1.6uA:
上圖有提到AN2867這個文檔,于是我們打開這個文檔,在3.4節(jié),發(fā)現(xiàn)有這個要求:
也就是要求gain margin的值要求大于5,這樣晶振才能正常起振,那么gain margin又是如何計算的呢?接下來找到gainmargin 的計算公式,如下:
其中gm就是圖4中從數(shù)據(jù)手冊中提到的跨導值,STM32F030 LSE的不同驅(qū)動等級對應著不同的gm值,由于我們的測試代碼使用的是CubeMx自動生成的代碼,其默認使用的是最高等級,且客戶使用的也是最高等級,因此,這個得出的gm值為25 uA/V, gm有了,那么上面公式中的gmcrit又該如何計算,我們接下來找到它的計算公式,如:
通過晶振對應參數(shù),我們可以得出:
ESR =70KΩ, C0 =1.0pF, CL =7.0pF, 而F就是LSE的頻率,為32.768KHz.
于是:
g_mcrit =4 * 7E4 * POWER(2*PI()32768,2)POWER ((1.0E-12 + 7.0E-12),2) =7.6E-07
最終得到:
gain_magin =gm/g_mcrit =2.5E-05/7.6E-07 =32.89
這個值是遠大于5,因此,理論上不會存在晶振不起振是的問題,實際上當在低溫下,之前在測試中也有發(fā)現(xiàn)晶振也是有起振,有波形輸出的,只不過PA8腳沒有波形輸出,那個又是什么問題呢?
提交給division,最終定位到LSE的驅(qū)動等級過高,在AN2867這個文檔中,有這樣的描述:
也就是說,在STM32F0和STM32F3中,當使用最高驅(qū)動模式(gm_crit_max=5uA/V)時,對應地應該只使用在CL=12.5pF的晶振上,以此避免振蕩回路飽和,從而導致啟動失敗。若此時使用了一個較小的CL(如CL=6pF),那么會導致振蕩頻率不穩(wěn)定和工作周期可能被扭曲。
AN2867隨后給出了一張表,列出了驅(qū)動等級與gm_min、gm_crit_max的關系,如下:
如上圖,對于STM32F0,當使用最高驅(qū)動模式High時,此時的gm_min=25 uA/V,這個與數(shù)據(jù)手冊中是一致的,另外gm_crit_max =5uA/V,正是上面所描述的。
也就是說,在使用最高驅(qū)動模式下,此時與之對應的CL應該使用12.5pF,而客戶所使用的CL是7pF,這個與手冊建議的內(nèi)容是不相符的。從圖4可以看出,在最高驅(qū)動等級模式下,此時驅(qū)動電流最大(1.6uA),但這里使用了一個比較小的負載電容(CL=7pF),按AN2867所述,此時有可能導致振蕩回路飽和,振蕩不穩(wěn)定,工作周期扭曲。
此時,應該對應地下調(diào)這個LSE驅(qū)動等級,減小驅(qū)動電流,這里按比例估算的話(12.5pF/1.6uA=7pF/xuA == > x=1.6*7/12.5 =0.89uA ),這里除了最高檔可以外,其他都可以,保守起見,使用Medium High相對合適。
打開STM32F030的參考手冊,在7.4.9節(jié)中:
如上圖,將LSEDRV[1:0]這兩個為修改為10即可,將原先低溫下RTC有問題的MCU芯片修改后再次放到低溫下進行驗證,測試結(jié)果為正常。由于此問題是部分芯片有可能會出現(xiàn)的問題,客戶需要對修改后的芯片進行持續(xù)跟蹤,至今沒有再反饋出現(xiàn)過此問題,由此,此問題基本算是解決。
另外,從圖1中所作的測試結(jié)果來看,實際上,在低溫條件下,RTC出現(xiàn)問題的時候,OSC pin還是能正常捕捉到波形,只不過,PA8腳這個MCO上沒有波形,只是維持在高電平。于是,對于驅(qū)動電流過大所導致的振蕩回路飽和,振蕩不穩(wěn)定,工作周期扭曲,這里理解為MCO腳與MCU內(nèi)部振蕩回路的連接點,也就是MCO所表現(xiàn)的波形。
3 總結(jié)AN2867這個文檔總結(jié)了關于STM32晶振匹配方面的信息。里邊有提到,負載電容CL值越大,所需的驅(qū)動電流也就越大,但牽引度越小。這也就解釋了表1中通過增大C1&C2的電容值,原本出現(xiàn)問題的RTC能恢復正常的現(xiàn)象,這是由于C1&C2的電容值變大將導致負載電容CL變大,進而對應所需的驅(qū)動電流也就跟著增加,這反而減少了在高驅(qū)動模式情況下振蕩回路出現(xiàn)飽和的機會。
在一般情況下,關于晶振這方便我們往往比較關注的是gain margin的計算,它的值太小的話會導致不起振,但同時,我們也應該適當關注由驅(qū)動電流過大導致振蕩回路飽和的情況。
AN2867這個文檔的中文版是精簡版,若要真正研究的話,建議還是看英文原版。