APT32F110X單片機RTC功能強大,在所有低功耗模式下均可獨立運行,并支持系統喚醒。實時時鐘計數器(RTC)為一個獨立的 BCD 編碼計數器,提供實時的日歷和時間信息,包括星期,年、月、日和小時、分鐘、秒。支持可編程的鬧鐘中斷。RTC 具有產生周期性的中斷事件的能力。RTC 一旦初始化成功并開始工作,任何復位信號均不能影響其工作,除非重新上電。
RTC 的基本特性:
- 支持萬年歷功能,自動閏年判定。計時器包括小時、分鐘、秒和微秒,BCD 格式計數
- 二十四小時或者十二小時制可選,支持星期判斷
- 支持多個時鐘源,包括外部晶振、內部低速振蕩器和內部主振蕩器。
- 支持低功耗喚醒功能
- 兩個可編程鬧鐘
支持周期事件觸發
RTC 的系統框圖:
由于 RTC 工作時鐘與 APB 總線時鐘(PCLK)為異步時鐘,對 RTC 的讀寫操作均需要通過兩個異步時鐘同步后進行。任何對 RTC 控制器的操作不會立即產生作用,可以通過對 CR[UPD_BSY]控制位進行查詢,以獲得更新狀態。UPD_BSY 控制位在寫請求發生時,會立即置位,直到更新結束后才會自動清除。在 RTC 未初始化前,對寄存器的更新值都保存在緩沖中,所以只需要在初始化時,查詢 UPD_BSY 即可。當 RTC 已經初始化完成后(RTC 已經開始工作),任何對寄存器的修改,例如CR和ALRAR,都需要查詢 UPD_BSY,以保證更新成功。
對 RTC 的初始化,包括如下操作:
- 設置保護寄存器關閉
- 設置 TIMR、DATR、ALRAR、ALRBR
- 設置 CCR,包括時鐘選擇和分頻選擇
- 使能 RTC 時鐘(設置 CCR[CLKEN]),等待 RTC 工作時鐘穩定(通過 CCR[RTCCK_ST]控制位查詢)。
- 設置 CR 寄存器,以設置時間格式或鬧鐘使能等配置。同時清除 INIT 位,啟動初始化。
回讀 INIT 狀態位,確認 RTC 工作
void rtc_set_time_demo(void)
{
csi_rtc_config_t tRtcConfig;
csi_rtc_time_t tRtcTime,tRtcTimeRdbk;
uint32_t wSec = 0;
csi_pin_set_mux(PA03, PA03_OSC_XI);//設置PA0.3為SXIN,如果使用外部主晶振作為RTC時鐘源,必須先對管腳進行配置
csi_pin_set_mux(PA04, PA04_OSC_XO); //設置PA0.4為SXOUT,如果使用外部主晶振作為RTC時鐘源,必須先對管腳進行配置
csi_pin_set_mux(PA01,PA01_OSC_SXI); //設置PA0.1為XIN,如果使用外部副晶振作為RTC時鐘源,必須先對管腳進行配置
csi_pin_set_mux(PA02,PA02_OSC_SXO); //設置PA0.2為XOUT,如果使用外部副晶振作為RTC時鐘源,必須先對管腳進行配置
tRtcConfig.byClkSrc = RTC_CLKSRC_ESOSC;//外部副晶振作為RTC時鐘源
tRtcConfig.byFmt = RTC_24FMT;//選擇時間模式
csi_rtc_init(RTC, &tRtcConfig);//初始化設置
tRtcTime.iYear = 22;
tRtcTime.iMon = 2;
tRtcTime.iMday = 14;
//tRtcTime.iWday = 1; //星期1-7
tRtcTime.iPm = RTC_AM;// AM or PM
tRtcTime.iHour = 9;//如果是12小時制,回讀到的hour范圍為1->12;如果是24小時制,回讀到的hour范圍是0->23
tRtcTime.iHour = 9;//如果是12小時制,回讀到的hour范圍為1->12;如果是24小時制,回讀到的hour范圍是0->23
tRtcTime.iMin = 50;
tRtcTime.iSec = 59;
csi_rtc_set_time(RTC, &tRtcTime);//設置時間
csi_rtc_start(RTC);//RTC開始計時
csi_rtc_change_fmt(RTC, RTC_12FMT);//修改時間模式為12小時制
tRtcTime.iYear = 22;
tRtcTime.iMon = 2;
tRtcTime.iMday = 14;
//tRtcTime.iWday = 1; //星期1-7
tRtcTime.iPm = RTC_AM;// AM or PM
tRtcTime.iHour = 11;
tRtcTime.iHour = 9;
tRtcTime.iMin = 59;
tRtcTime.iSec = 56;
csi_rtc_set_time(RTC, &tRtcTime);//修改時間以后需要重新start rtc
csi_rtc_start(RTC);
csi_rtc_get_time(RTC, &tRtcTimeRdbk);//回讀當前時間
my_printf("12FMT: %d:%d:%d\n", tRtcTimeRdbk.iHour, tRtcTimeRdbk.iMin, tRtcTimeRdbk.iSec);
csi_rtc_change_fmt(RTC, RTC_24FMT);//修改時間模式為24小時制
csi_rtc_get_time(RTC, &tRtcTimeRdbk);//回讀當前時間
my_printf("24FMT: %d:%d:%d\n", tRtcTimeRdbk.iHour, tRtcTimeRdbk.iMin, tRtcTimeRdbk.iSec);
csi_rtc_change_fmt(RTC, RTC_12FMT);//修改時間模式為12小時制
while(1)
{
csi_rtc_get_time(RTC, &tRtcTimeRdbk);
if(wSec != tRtcTimeRdbk.iSec )
{
wSec = tRtcTimeRdbk.iSec;
my_printf("%d:%d:%d pm= %d\n", tRtcTimeRdbk.iHour, tRtcTimeRdbk.iMin, tRtcTimeRdbk.iSec, tRtcTimeRdbk.iPm);
}
}
}
經過2小時測試,RTC精度穩定良好
-
測試
+關注
關注
8文章
5361瀏覽量
126899 -
工程師
+關注
關注
59文章
1571瀏覽量
68579 -
開發板
+關注
關注
25文章
5108瀏覽量
97892
發布評論請先 登錄
相關推薦
評論