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