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