RTC接口簡介
RTC計數邏輯位于電池供電域,內部為一個32位遞增計數器,只要電池供電域有電,RTC便會一直運行,不受系統復位以及VDD掉電影響,RTC主要具有以下功能:
― 日歷功能:32位計數器,通過轉換得到年、月、日、時、分、秒
― 鬧鐘功能
― 入侵檢測功能
― 校準功能
圖1. RTC框圖
RTC功能
寄存器訪問
寄存器寫保護
上電復位后RTC寄存器處于寫保護狀態,需要先解除寫保護,才能寫配置RTC寄存器。
解鎖步驟:
使能PWC接口時鐘
使能BPR接口時鐘
解鎖電池供電域寫保護
RTC寄存器同步
由于RTC由電池供電域的計數邏輯和APB1接口的寄存器組成,寄存器的讀寫存在同步邏輯。
― 寄存器寫:需要等待上一次的RTC寄存器配置完成后(CFGF=1),才能進行新的寫操作。
― 寄存器讀:當寄存器值從電池供電域更新到APB1接口時UPDF標志置1。 當在系統復位、電源復位、從待機、深度睡眠模式喚醒后,有可能寄存器還未完全同步,所以需要先軟件將UPDF標志清除,然后等待UPDF標志置1,以讀取正確的值。
RTC同步相關函數
等待上一次RTC寄存器配置完成(寫寄存器之前使用)
等待RTC寄存器更新完成(讀取寄存器之前使用)
RTC寄存器寫
寫RTC_DIV、RTC_TA、RTC_CNT寄存器需要先進入配置模式(CFGEN=1),然后才能對寄存器進行寫操作,當退出配置模式(CFGEN=0)時,就會將寄存器值實際寫到電池供電域,這個過程至少需要3個RTCCLK周期。
下表列舉了RTC寄存器受寫保護狀態,以及寫入的條件:
表1. RTC寄存器
寄存器復位
RTC寄存器處于電池供電域,可以CRM_BPDC的BPDRST進行電池供電域復位,也可以由提供的庫函數對每個寄存器寫默認值進行復位。
RTC復位相關函數
電池供電域復位
或者
兩個函數功能一樣,只是bpr_reset()封裝了前一個函數。
時鐘設置
時鐘源選擇
RTC時鐘源經過選擇后輸入到分頻器,最終得到1Hz的時鐘用來更新日歷。
圖2. RTC時鐘結構
RTC的時鐘源共有3種可以選擇:
― LEXT:外部低速晶振,通常為32.768kHz
― LICK:內部低速晶振,通常典型值為40kHz范圍(30~60kHz),詳情請見各型號的datasheet
― HEXT_DIV:外部高速晶振分頻后得到的時鐘,不同型號分頻值請見下表
表2. 各型號HEXT的預分頻值
表3. 各時鐘源優缺點對比
RTC時鐘源設置相關函數
選擇對應時鐘使能
選擇RTC時鐘
使能RTC時鐘
預分頻器設置
RTC_CLK通過20位預分頻器后獲得1Hz時鐘,計算公式如下:
表4. 分頻設置舉例
RTC分頻設置相關函數
設置RTC預分頻器
獲取RTC預分頻器值
RTC時鐘初始化舉例:
日歷
RTC內部是一個32位的計數器,通常使用中該計數器1秒增加1,也就是該計數器相當于秒鐘,然后根據當前的秒鐘值,通過轉換得到年、月、日、星期、時、分、秒,實現日歷的功能,修改計數器的值便可修改時間和日期。
根據使用需要還可以產生秒中斷:若秒中斷使能(TSIEN=1),每隔一秒產生一個秒中斷。
圖3. 日歷轉換
計數相關函數
設置RTC計數值
獲取RTC計數值
秒鐘轉換成日歷
先規定一個起始時間,例如1970-1-1 0000對應計數器為0,現在比如計數值為200000,那么換算成時間為:
― 天數:200000 / 86400 = 2
― 小時:(200000 % 86400) / 3600= 7
― 分鐘:(200000 % 3600) / 60= 33
― 秒鐘:200000 % 60 = 20
所以現在的時間對應為1970-1-3 0720,對應日歷轉換成秒鐘也是相同的思路。
在BSP的例程projectat_start_f403aexamples tccalendar中,我們提供了秒鐘與日歷的相互轉換函數。
設置日歷值(日歷轉換成秒鐘)
結構體calendar_type里面參數含義如下:
― year:年
― month:月
― day:日
― hour:時
― min:分
― sec:秒
― week:星期幾
讀取日歷值(秒鐘轉換成日歷)
鬧鐘
RTC鬧鐘是一個32位的值,當鬧鐘值和計數值相等時產生鬧鐘事件(TAF置1),當中斷使能時,會產生中斷。
圖4. 鬧鐘匹配
鬧鐘相關函數
鬧鐘值設置函數
中斷使能函數
標志獲取函數
標志清除函數
計數值溢出
由于計數值為32位,所以存在溢出問題,當計數值為0xFFFFFFFF溢出到0x00000000時,產生溢出事件,OVFF標志置1當鬧鐘使能后,由于溢出后,秒與日歷的相轉換關系便不正確,所以用戶需妥善處理溢出事件。
0xFFFFFFFF所能代表的最大時間為136年,例程起始時間為1975,所以能夠到2106年不溢出。
圖5. 計數值溢出示例(分頻值為4)
中斷
當發生鬧鐘、秒、溢出事件時,RTC可產生中斷。 鬧鐘中斷有兩種配置模式:
― 不配置EXINT線使用RTC_IRQn中斷向量,此種方式不能喚醒DEEPSLEEP和STANDBY模式;
― 配置EXINT線使用RTCAlarm_IRQn中斷向量,此種方式可以喚醒DEEPSLEEP和STANDBY模式。
要使能RTC鬧鐘(不需要喚醒低功耗模式)、秒、溢出中斷可按以下操作配置:
― 使能RTC中斷對應的NVIC通道。
― 使能對應的RTC中斷控制位。
要使能RTC鬧鐘(需要喚醒低功耗模式)中斷可按以下操作配置:
― EXINT線17配置為中斷模式并使能,有效沿選擇上升沿。
― 使能RTC中斷對應的NVIC通道。
― 使能對應的RTC中斷控制位。
下表說明了RTC時鐘源、事件以及中斷對喚醒低功耗模式的影響:
表5. RTC喚醒低功耗模式
表6. 中斷控制
表7. 事件對應中斷向量
中斷、事件相關函數
中斷使能函數
標志獲取函數
標志清除函數
中斷配置示例1:以AT32F403A的鬧鐘為例,使用RTCAlarm_IRQn中斷向量
中斷處理函數
中斷配置示例2:以AT32F403A的鬧鐘為例,使用RTC_IRQn中斷向量
中斷處理函數
電池供電域功能
電池供電數據寄存器
電池供電域一共提供了42個16位電池供電數據寄存器,可以在只由電池供電下保存數據,不會被系統復位所復位,只能通過電池供電域復位或入侵事件進行復位。 在寫電池供電數據寄存器時,需要先解除讀保護,解鎖方式同2.1章節相同。
電池供電域數據操作相關函數
寫電池供電數據寄存器
讀電池供電數據寄存器
電池供電域復位
RTC校準
電池供電域還提供了RTC校準功能,通過RTC_CALVAL寄存器進行配置。
圖6. RTC校準
當RTC_CLK為32.768kHz時,校準周期為2^20^個RTC_CLK約32秒。 CALVAL[7:0]值指定了2^20^個RTC_CLK中忽略的脈沖數,最多可忽略127個脈沖,這可以將時鐘調慢,調慢范圍為0~121ppm。
可以選擇將校準前或校準后的RTC時鐘64分頻后輸出到PC13腳。
校準設置相關函數
校準值設置函數
校準時鐘輸出設置函數
入侵檢測
電池供電域提供了1組入侵檢測TAMPER,當在發生入侵事件時,TPEF標志位置1,同時將自動清除電池供電數據寄存器(RTC_BPRx)的值; 若已使能入侵中斷,將產生入侵中斷,同時TPIF標志位置1。 入侵檢測引腳固定為PC13。
圖7. 入侵檢測
入侵檢測模式分為高電平檢測和低電平檢測。
入侵檢測相關函數
入侵檢測有效電平設置
入侵檢測使能
入侵檢測標志獲取
入侵檢測標準清除
入侵檢測中斷使能
事件輸出功能
電池供電域提供了一組復用功能輸出,在PC13腳可以輸出以下事件:
― 校準輸出:校準前64分頻輸出、校準后64分頻輸出。
― 事件輸出:鬧鐘事件、秒事件
圖8. 事件輸出
當輸出模式為事件輸出時(鬧鐘事件、秒事件),可以通過OUTM選擇輸出類型為脈沖輸出(輸出脈沖的寬度為一個RTC時鐘的周期)或者是翻轉輸出(每來一次鬧鐘或秒輸出事件,相對應管腳翻轉一次)。
事件輸出相關函數
事件輸出設置并使能
審核編輯:湯梓紅
-
接口
+關注
關注
33文章
8526瀏覽量
150860 -
計數器
+關注
關注
32文章
2254瀏覽量
94371 -
RTC
+關注
關注
2文章
530瀏覽量
66325 -
雅特力
+關注
關注
0文章
157瀏覽量
7981 -
AT32
+關注
關注
1文章
113瀏覽量
2078
原文標題:AT32講堂052 | 雅特力AT32 RTC入門指南
文章出處:【微信號:AT32 MCU 雅特力科技,微信公眾號:AT32 MCU 雅特力科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論