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

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

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

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

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

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

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

1、RTC是如何運(yùn)行的

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

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

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

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

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

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

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

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

2、一時(shí)省事釀成大禍

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

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

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

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

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

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

3、反思

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

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

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

相關(guān)推薦