絕大多數STM32系列里的RTC都具有亞秒【或稱子秒】計數單元。為了了解亞秒特性及功能,不妨先看RTC的功能框圖。本文中的有關截圖若無特別說明均來自STM32L4系列參考手冊。
RTC的時鐘源【RTCCLK】可以是LSE、LSI或者HSE/32,由RTCCLK最終變成日歷的秒脈沖驅動信號經過了2次分頻。先經過上圖中A處的異步分頻單元,默認分頻系數是128,形成ck_apre時鐘,默認情況下該時鐘頻率為256Hz;然后該時鐘脈沖來到圖中B處的同步分頻單元,默認分頻系數為256,最終形成1Hz的秒脈沖【ck_spre】到日歷單元。關于兩分頻單元分頻系數的配置,通過對RTC_PRER寄存器的相關位編程實現。
其中異步分頻系數配置位【PREDIV_A】有7位,同步分頻系數【PREDIV_S】有15位。另外,同步分頻單元還包括采用向下計數方式的亞秒計數器,它基于異步分頻后的時鐘ck_apre進行計數,溢出時的重裝值等于PREDIV_S。一般來講,它的一個計數周期就是1s,其計數分辨率或精度為【1/(PREDIV_S+1)】秒。與之配套的亞秒寄存器,實時記錄亞秒計數器的計數值,有效數據位乃16位,比PREDIV_S多1位,多出的1位另有它用,此處不表。
顯然,當有了這個亞秒計數器后,我們就可以獲得少于1秒的時間,或說秒的小數部分---亞秒,其精度由同步分頻系數PREDIV_S決定,某時刻的亞秒數通過亞秒寄存器獲取,對應的亞秒時間可以通過上圖中第2個紅色方框內的算式求得【提醒:亞秒計數器采用向下計數方式】。
關于RTC的亞秒概念及基本特性就介紹到這里。稍微小結下:
1、亞秒是對少于1秒的時間稱謂,范圍在0到1秒,并非固定的值;
2、亞秒精度【分辨率】可調,由PREDIV_S參數決定,即【1/(PREDIV_S+1)】秒;
3、亞秒寄存器【RTC_SSR】實時記錄亞秒計數器的值,具體由 SS [15:0]體現;
4、亞秒時間通過算式(PREDIV_S- SS ) / (PREDIV_S+1)求得;
我們知道RTC除了提供基本的日歷功能外,還有很好的低功耗特性,常用于低功耗的喚醒。有些低功耗應用場合,雖然系統需要周期性的喚醒,但對喚醒周期的一致性要求往往并不嚴格、很多時候的周期值往往遠達不到秒級,比方在10個毫秒上下、幾十個毫秒左右、100毫秒量級不等。像這種場合,我們可以考慮使用RTC的亞秒特性和ALARM功能實現周期性喚醒。
假設某STM32用戶有這樣的需求,他的系統涉及低功耗,需要周期性地做休眠與喚醒的切換。他希望系統進入休眠后每隔50±20ms的時間范圍內被喚醒,喚醒后做些基本的檢測處理后又進入休眠。要實現這個需求,對于很多帶LPTIM的STM32系列也很方便實現。
不過,今天主要想聊聊如何通過RTC來實現該需求。了解STM32的RTC的人可能知道,RTC模塊往往還自帶一個專門的16位向下計數的喚醒定時器,即下面RTC局部框圖中紅框所在單元。我這里要分享的也不是這個專用喚醒定時器,而是想基于ALARM事件和亞秒特性來實現上面需求。
對于RTC的ALARM功能我們都不陌生,即先預設需要ALARM的時間點,當日歷時間跟設定的ALARM時間匹配時就可以觸發ALARM事件及中斷。對于ALARM時間點的報警條件可以有很多靈活的組合配置,比方我們可以設置在某月某日某時某分某秒ALARM,也可以設置在某分某秒ALARM,其它不關心,或者僅設置在某個亞秒時刻ALARM,其它不關心。
上圖中四種ALARM設置,灰色部分表示不關心項,即不參與日歷值與ALARM設定值相關項的比較。這里分別表示的警情時刻是:
第一種,只要日歷中跟ALARM設置的時、分、秒匹配時報警,其它不關心;
第二種,只要日歷中跟ALARM設置的分值、秒值匹配時報警,其它不關心;
第三種,只要日歷中跟ALARM設置的秒值和亞秒低3位值匹配時報警,其它不關心;
第四種,只要日歷中跟ALARM設置的亞秒的低4位值匹配時報警,其它不關心;
-
STM32
+關注
關注
2270文章
10895瀏覽量
355750 -
控制
+關注
關注
4文章
1011瀏覽量
122656 -
RTC
+關注
關注
2文章
538瀏覽量
66468
發布評論請先 登錄
相關推薦
評論