• 正文
    • 1、RTC是如何運行的
    • 2、一時省事釀成大禍
    • 3、反思
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

省去LSE的代價:一次STM32的RTC斷電停擺的排查與設(shè)計反思

05/28 15:35
1185
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

馬上就要畢設(shè)答辯了,我的畢設(shè)也基本已經(jīng)完成了,但是還一直沒有把每次上電都會重置RTC這個地方給注釋掉,所以我的設(shè)備每次上電,時間都是從0:00開始的。

于是今天把重置的這個部分給去掉了,這樣子RTC時鐘就可以正常工作了。

但是我又發(fā)現(xiàn)一件奇怪的事情:RTC在斷電后不再更新,但是上電的話都是能正常工作的。而備用電池肯定是沒有問題的,那么要么是程序上的問題,要么是硬件問題。

后來發(fā)現(xiàn)自己犯了一個很抽象的錯誤,今天來分享一下排錯過程和哪里犯錯了。

1、RTC是如何運行的

在解決這個問題之前,讓我們先回顧一下RTC時鐘的工作流程。

RTC時鐘有一個電壓檢測開關(guān),當(dāng)檢測到低電壓的時候會使用VBAT引腳即備用電池進行供電。

從RCT的時鐘樹中我們可以看到,RTC的時鐘來源可以來自于三個渠道,分別是:

LSI內(nèi)部低速時鐘、LSE外部低速時鐘、外部高速時鐘的32分頻。

RTC的主時鐘經(jīng)過兩個分配器之后會更新時鐘,前者Asynchronous Predivider(默認值128)用于亞秒寄存器的更新,配合后者Synchronous Predivider(默認值256)實現(xiàn)總時鐘的更新。

32.768kHZ的低速晶振合被這兩個分頻器分頻后正好會產(chǎn)生1HZ的時鐘用于寄存器更新。

因此如果是出現(xiàn)RTC時鐘不準的問題可以檢查一下分頻系數(shù)和LSE是否匹配,否則會產(chǎn)生過快或者過慢的情況。

那為什么我的時鐘掉電之后不走呢?

2、一時省事釀成大禍

后來我想起來自己在設(shè)計第二版原理圖的時候,當(dāng)時為了省事去掉了外部低速時鐘(LSE)當(dāng)時主要是認為外部低速時鐘在這個項目中用不到,而且引腳資源也比較緊張,腦子一熱就把LSE去掉了。

由于沒有外部LSE,我的RTC的時鐘源選擇自LSI,但是恰恰是這個選擇導(dǎo)致了問題。

我們看看電源部分的描述:

VBAT電源僅為RTC模塊,外部32KHZ晶振和備份寄存器供電。

那么問題就非常明顯了,由于沒使用外部低速晶振,而LSI并不能在掉電后繼續(xù)使用,因此就會出現(xiàn)關(guān)機后RTC時鐘不繼續(xù)運行的情況。

當(dāng)時大家對LSE的簡單描述是:STM32的LSE(低速外部振蕩器)提供32.768kHz精準時鐘,主要用于RTC和低功耗模式計時。當(dāng)時注意力主要放在了精準二字上,因為LSI的時鐘確實存在較大誤差,但是恰恰的忽略了只有LSE能在備用電池作用下繼續(xù)工作的特性。

3、反思

因此在設(shè)計的過程中還是要思考仔細,這也是源自于自己之前并沒有怎么自主設(shè)計和使用過STM32的RTC部分從而導(dǎo)致出現(xiàn)的這個錯誤。

說明在以后的學(xué)習(xí)和使用中,也要注意此類問題,不可主觀獨斷,認真閱讀參考手冊。

也希望其他學(xué)習(xí)者引以為戒,不能因為自己的主觀臆斷去設(shè)計,很多問題都可以在參考手冊中發(fā)現(xiàn)和解決,在此過程中積累經(jīng)驗。

相關(guān)推薦