RTC
RTC的本質(zhì)很簡(jiǎn)單,就是一個(gè)時(shí)鐘經(jīng)過精確分頻最后得到的一個(gè)1Hz的時(shí)鐘,也可以說是計(jì)數(shù)器,其他大部分功能都是基于這個(gè)計(jì)數(shù)器設(shè)計(jì)的數(shù)字邏輯。
本文講的RTC是基于STM32F030來講的,相比與F1系列的RTC來說,M0的將很多原本需要軟件實(shí)現(xiàn)的功能硬件化了,使用起來更加便利。
先說說STM32F030的RTC有些什么功能:
1.集成日歷功能,不用像STM32F103一樣需要軟件算法來做;
2.夏令時(shí)補(bǔ)償;
3.鬧鐘功能;
4.集成了周期性自動(dòng)喚醒單元;
5.外部參考時(shí)鐘;
6.時(shí)鐘平移校準(zhǔn)(亞秒級(jí));
7.數(shù)字校準(zhǔn)
8.時(shí)間戳;
9.入侵檢測(cè);
10.備份寄存器
先看看RTC的框圖:

從框圖中圈出來的部分可以看到,上面提到的RTC功能,大部分在框圖上面都有體現(xiàn),接下來我們按照RTC的功能點(diǎn)講一講各個(gè)功能的詳細(xì)內(nèi)容
RTC的時(shí)鐘分頻
在詳述每個(gè)功能點(diǎn)之前,我們先了解下RTC的核心,即1Hz的時(shí)鐘的來歷。
從框圖中可以看到RTC的時(shí)鐘來源有3個(gè),時(shí)鐘源先經(jīng)過一個(gè)精密校準(zhǔn)后,再經(jīng)過一個(gè)異步預(yù)分頻器和一個(gè)同步預(yù)分頻器后,得到的即是我們想要的1Hz的時(shí)鐘,這個(gè)時(shí)鐘將被送到日歷模塊,供日歷計(jì)數(shù)用。
我們常用的一個(gè)時(shí)鐘源是一個(gè)32.768kHz的低速外部時(shí)鐘(LSE),為什么是這個(gè)特殊的頻率呢?因?yàn)檫@個(gè)時(shí)鐘經(jīng)過分頻后可以得到一個(gè)完美的1Hz的時(shí)鐘供給日歷模塊使用,最大程度上保證時(shí)鐘的精確性,當(dāng)然,實(shí)際上來說,32.768kHz的時(shí)鐘并不是完全精確的,所以就會(huì)導(dǎo)致實(shí)際上的時(shí)間會(huì)在一段時(shí)間后跑偏,且隨時(shí)間的推移,偏差逐漸擴(kuò)大,所以我們小時(shí)候用電子手表時(shí),會(huì)發(fā)現(xiàn)時(shí)間在我們調(diào)整準(zhǔn)確后,慢慢的又會(huì)出現(xiàn)一點(diǎn)偏差,偏差可以被RTC內(nèi)部邏輯調(diào)整縮小,后面會(huì)詳細(xì)講述。
32.768kHz為什么比較容易分頻得到1Hz時(shí)鐘呢?
由于我們單片機(jī)采用的是二進(jìn)制數(shù),所以分頻器也是以二進(jìn)制為基礎(chǔ)進(jìn)行分頻,32.768kHz在不斷的二分頻(15次)后,能得到一個(gè)精確的1Hz時(shí)鐘,也就是1秒鐘的時(shí)間。

而其他兩個(gè)時(shí)鐘源(HSE/32)和LSI經(jīng)過兩個(gè)分頻器后得到的時(shí)鐘往往都是約等于1Hz,長(zhǎng)久計(jì)數(shù)會(huì)產(chǎn)生較大的誤差,因?yàn)樗鼈兊念l率在經(jīng)過無數(shù)次2分頻后,一般來說,最后都不是一個(gè)整數(shù),都是游離在1Hz左右。
理論上來說,如果想要一個(gè)1Hz的時(shí)鐘,一個(gè)分頻器就可以做到,為什么會(huì)有兩個(gè)分頻器呢?因?yàn)镾TM32F030可以精確到亞秒級(jí),在經(jīng)過第一個(gè)時(shí)鐘分頻器后,此時(shí)得到的時(shí)鐘ck_apre(一般為256Hz)會(huì)作為亞秒計(jì)數(shù)器,提供亞秒級(jí)別的計(jì)數(shù)。
日歷模塊
日歷模塊是我覺得STM32F030相比與103最大的便捷之處,不需要軟件算法的干預(yù),就可以在預(yù)設(shè)初始年月日,時(shí)分秒的基礎(chǔ)上開始計(jì)時(shí),且還能自動(dòng)計(jì)算星期,閏年也會(huì)被自動(dòng)計(jì)算。
日歷模塊有三個(gè)寄存器:時(shí)間寄存器, 寄存器,亞秒寄存器

日歷寄存器是有兩套的,一套是RTC域的本體,一套是由系統(tǒng)時(shí)鐘控制的影子寄存器。每隔兩個(gè)RTC_CLK,就會(huì)將本體寄存器中的值復(fù)制到影子寄存器中。

由于RTC的特性,所以很多情況下在芯片斷電后,希望內(nèi)部的時(shí)間系統(tǒng)不受到影響,所以RTC域通常被要求單獨(dú)供電,即在芯片斷電后,RTC還能夠正常工作,當(dāng)下次芯片上電后,影子寄存器在和RTC域本體的日歷寄存器同步后,仍然能得到正確時(shí)間。
夏令時(shí)
支持夏令時(shí)功能,可以將日歷寄存器中的時(shí)間增加或減少一個(gè)小時(shí)。
利用 SUB1H 或 ADD1H,軟件只需單次操作便可在日歷中減去或增加一個(gè)小時(shí),無需執(zhí)行
整個(gè)初始化步驟,還可以使用 BKP 位來記錄是否曾經(jīng)執(zhí)行過此操作
因?yàn)橛械膰?guó)家實(shí)行夏令時(shí)制度,需要在夏天時(shí),將全國(guó)時(shí)間集體向前撥一個(gè)小時(shí),在夏令時(shí)結(jié)束后,又將時(shí)間往回?fù)芤粋€(gè)小時(shí),所以030集成了這個(gè)功能(有興趣的可以百度一下夏令時(shí))。
鬧鐘功能
鬧鐘功能就是通過在鬧鐘寄存器設(shè)置一個(gè)預(yù)定時(shí)間,當(dāng)日歷寄存器中的時(shí)間和鬧鐘寄存器時(shí)間匹配后,會(huì)產(chǎn)生一個(gè)鬧鐘信號(hào),在配置鬧鐘中斷以后,也會(huì)生成中斷。

要注意的是鬧鐘寄存器是沒有年份和月份的,只有日期,時(shí)分秒及亞秒。鬧鐘寄存器還有一個(gè)掩碼功能(MSK),開啟后日期,時(shí)、分、秒及亞秒都可以被單獨(dú)屏蔽,不和日歷寄存器中對(duì)應(yīng)值作比較。
周期性自動(dòng)喚醒單元
配置此功能后,可以在器件進(jìn)入低功耗模式后,根據(jù)配置時(shí)間在到達(dá)預(yù)定時(shí)間后使器件退出低功耗模式??膳渲玫臅r(shí)間范圍為1s到36小時(shí)。
外部參考時(shí)鐘,時(shí)鐘平移校準(zhǔn),數(shù)字校準(zhǔn)
把這三個(gè)功能放在一起的原因是,三個(gè)功能都是RTC的時(shí)鐘精度進(jìn)行調(diào)整的功能,但是三個(gè)功能調(diào)整時(shí)間的方法和調(diào)整精度上又是不同的。
外部參考時(shí)鐘(一般為50Hz或者60Hz):
通過特定GPIO口輸入一個(gè)參考時(shí)鐘源,外部參考時(shí)鐘的精度我們認(rèn)為是高于現(xiàn)在RTC使用的32.768kHz時(shí)鐘精度的(32.768kHz由于偏差,并非一定為該數(shù)值),具體的做法是用1Hz時(shí)鐘每次在邊沿時(shí)檢測(cè)是否有高精度外部時(shí)鐘的邊沿,如果兩個(gè)時(shí)鐘的時(shí)鐘沿正好對(duì)齊。則認(rèn)為1Hz時(shí)鐘無偏差,若時(shí)鐘不對(duì)齊,會(huì)對(duì)異步預(yù)分頻寄存器進(jìn)行重載,微調(diào)后續(xù)1Hz時(shí)鐘邊沿,使其對(duì)齊外部參考時(shí)鐘邊沿。

時(shí)鐘平移校準(zhǔn):
參考一個(gè)更高精度的遠(yuǎn)程時(shí)鐘,可以對(duì)當(dāng)前的RTC時(shí)鐘進(jìn)行秒級(jí)或者亞秒級(jí)的增加或減少時(shí)間。我的理解是,獲取到一個(gè)我們認(rèn)為的更高精度的時(shí)鐘當(dāng)前值后,手動(dòng)對(duì)自身RTC的值進(jìn)行調(diào)整,以提高RTC的精度。
數(shù)字校準(zhǔn):
數(shù)字校準(zhǔn)是三種校準(zhǔn)方式中最為細(xì)微的校準(zhǔn)方式,分為正校準(zhǔn)和負(fù)校準(zhǔn)。
正校準(zhǔn)可以在8秒或者16秒的時(shí)鐘周期內(nèi),對(duì)RTC的源時(shí)鐘。RTC_CLK,在每2的11次方的脈沖內(nèi),多插入一個(gè)脈沖。
負(fù)校準(zhǔn)可以在32秒的時(shí)鐘周期內(nèi),在每2的20次方的脈沖內(nèi),減少1~255個(gè)脈沖,由寄存器決定具體減少數(shù)值。
由于RTC的32.768KHz的時(shí)鐘源多少都會(huì)存在一點(diǎn)偏差,數(shù)字校準(zhǔn)可以做到從源頭上對(duì)RTC的精度進(jìn)行調(diào)整,但是首先我們得獲取到時(shí)鐘源的具體偏差值才能更好的對(duì)偏差進(jìn)行校準(zhǔn)。
時(shí)間戳和入侵檢測(cè)
時(shí)間戳
時(shí)間戳寄存器和日歷寄存器一樣,只是不會(huì)計(jì)數(shù),當(dāng)有時(shí)間戳事件發(fā)生的時(shí)候,日歷寄存器的當(dāng)前值就會(huì)被保存到時(shí)間戳寄存器中。
當(dāng)RTC的RTC_TS引腳檢測(cè)到時(shí)間戳事件時(shí),當(dāng)前的日歷寄存器值就會(huì)被保存到時(shí)間戳寄存器。
入侵檢測(cè)
除此之外,入侵檢測(cè)的發(fā)生也可以被當(dāng)成時(shí)間戳?xí)r間,當(dāng)特定的GPIO引腳檢測(cè)到入侵事件時(shí),時(shí)間戳就會(huì)記下當(dāng)前入侵事件發(fā)生的時(shí)間。
入侵檢測(cè)事件是當(dāng)特定的入侵檢測(cè)引腳被觸發(fā)時(shí)(可以設(shè)置觸發(fā)的電平狀態(tài)及保持時(shí)間),擦除RTC的備份域寄存器,也可以生成入侵檢測(cè)中斷,從停止模式和待機(jī)模式喚醒。
備份寄存器
備份寄存器是一小段空間,大小為16字節(jié),可以由用戶自定義寫入數(shù)據(jù),當(dāng)主電源域掉電后,只要RTC域有電,備份寄存器內(nèi)的數(shù)據(jù)就不會(huì)丟失。但是當(dāng)入侵事件發(fā)生時(shí),備份寄存器會(huì)被復(fù)位,數(shù)據(jù)丟失。
總的來說,RTC本身其實(shí)并不復(fù)雜,尤其是F030的RTC,簡(jiǎn)單易用,但是它在整個(gè)芯片系統(tǒng)中都是一個(gè)很特殊的模塊,因?yàn)樗梢员粏为?dú)供電,且RTC域的寄存器值是不受系統(tǒng)復(fù)位影響的,當(dāng)系統(tǒng)電源域有電時(shí),它由VDD供電,當(dāng)系統(tǒng)電源域掉電時(shí),它立刻會(huì)切換至后備電源域供電。大致示意圖如下:

-
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2321瀏覽量
98619 -
RTC
+關(guān)注
關(guān)注
2文章
667瀏覽量
72248 -
數(shù)字邏輯
+關(guān)注
關(guān)注
0文章
74瀏覽量
17540
發(fā)布評(píng)論請(qǐng)先 登錄
#硬聲創(chuàng)作季 #Linux 學(xué)Linux-2.22.1 RTC實(shí)驗(yàn)-6U內(nèi)部RTC詳解-1
#硬聲創(chuàng)作季 #Linux 學(xué)Linux-2.22.1 RTC實(shí)驗(yàn)-6U內(nèi)部RTC詳解-2
第22.1講 RTC實(shí)驗(yàn) 6U內(nèi)部RTC詳解 - 第1節(jié) #硬聲創(chuàng)作季
第22.1講 RTC實(shí)驗(yàn) 6U內(nèi)部RTC詳解 - 第2節(jié) #硬聲創(chuàng)作季
77 第22.1講 RTC實(shí)驗(yàn)-6U內(nèi)部RTC詳解 - 第2節(jié) #硬聲創(chuàng)作季
77 第22.1講 RTC實(shí)驗(yàn)-6U內(nèi)部RTC詳解 - 第4節(jié) #硬聲創(chuàng)作季
77 第22.1講 RTC實(shí)驗(yàn)-6U內(nèi)部RTC詳解 - 第5節(jié) #硬聲創(chuàng)作季
RTC介紹、寄存器詳解以及應(yīng)用示例
STM32開發(fā) -- RTC詳解
【STM32】RTC詳解
RTC時(shí)鐘與觸摸功能詳解(上)
RTC時(shí)鐘與觸摸功能詳解(下)
RTC詳解
評(píng)論