RVMCU課堂「20」: 手把手教你玩轉(zhuǎn)RVSTAR—實時時鐘RTC篇
系統(tǒng)環(huán)境
軟件平臺
硬件需求
GD32VF103的RTC電路
-
APB接口與APB1總線相連,包含一組寄存器,可通過APB1總線對其進行訪問。
-
RTC內(nèi)核包含兩個主要模塊,一個是RTC預(yù)分頻模塊,模塊包含一個20位可編程預(yù)分頻器,該分頻器可以通過對RTC時鐘源分頻產(chǎn)生SC_CLK,如果RTC_INTEN寄存器中的秒中斷標(biāo)志位被使能,在每個SC_CLK上升沿,RTC會產(chǎn)生一個秒中斷。另外一個模塊是一個32位可編程計數(shù)器,其數(shù)值可以被初始化為當(dāng)前系統(tǒng)時間。如果RTC_INTEN的鬧鐘中斷標(biāo)志位被使能,RTC會在系統(tǒng)時間等于鬧鐘時間(存儲于RTC_ALRMH/L寄存器)時產(chǎn)生一個鬧鐘中斷。
RTC的主要特征如下:
-
PCLK1時鐘域
-
RTC時鐘域(該時鐘域必須比PCLK1時鐘至少慢4倍)
-
HXTAL時鐘除以128
-
LXTAL振蕩電路時鐘
-
IRC40K振蕩電路時鐘
-
鬧鐘中斷
-
秒中斷
-
溢出中斷
實驗部分
本期的實驗將使用RV-STAR的RTC外設(shè)實現(xiàn)顯示當(dāng)前時間的功能,例程的整體實現(xiàn)思路如下:
-
首先需要初始化RTC外設(shè):使能時鐘源和配置預(yù)分頻系數(shù)等
-
對于是否通過串口打印輸出當(dāng)前時間,聲明一個狀態(tài)變量并賦值為0
-
然后用戶通過串口人工輸入當(dāng)前的時間對RTC的寄存器進行配置
-
RTC進入自動計數(shù)模式,每秒產(chǎn)生一個中斷,在中斷服務(wù)程序中將狀態(tài)變量置1
-
主程序中運行一個循環(huán)體,判斷狀態(tài)變量的值,如果為1,則讀取RTC寄存器存儲的當(dāng)前時間然后打印輸出到串口
void rtc_configuration(void)
{
/* enable PMU and BKPI clocks */
rcu_periph_clock_enable(RCU_BKPI);
rcu_periph_clock_enable(RCU_PMU);
/* allow access to BKP domain */
pmu_backup_write_enable();
/* reset backup domain */
bkp_deinit();
/* enable LXTAL */
rcu_osci_on(RCU_LXTAL);
/* wait till LXTAL is ready */
rcu_osci_stab_wait(RCU_LXTAL);
/* select RCU_LXTAL as RTC clock source */
rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
/* enable RTC Clock */
rcu_periph_clock_enable(RCU_RTC);
/* wait for RTC registers synchronization */
rtc_register_sync_wait();
/* wait until last write operation on RTC registers has finished */
rtc_lwoff_wait();
/* enable the RTC second interrupt*/
rtc_interrupt_enable(RTC_INT_SECOND);
/* wait until last write operation on RTC registers has finished */
rtc_lwoff_wait();
/* set RTC prescaler: set RTC period to 1s */
rtc_prescaler_set(32767);
/* wait until last write operation on RTC registers has finished */
rtc_lwoff_wait();
}
由于使用RV-STAR板載的32.768K的晶振作為RTC時鐘源,因此配置時要選擇LXTAL,同時要注意預(yù)分頻系數(shù)的設(shè)置,另外每次對RTC的寫操作,均要等待寫入完成,例程其余部分的代碼均有詳細注釋,讀者們可以自行閱讀,相關(guān)代碼請參考RVMCU網(wǎng)站專欄對應(yīng)鏈接。
如果按下復(fù)位按鈕,程序會重啟,但只要保持通電,RTC的計時會正常進行,數(shù)據(jù)也不會丟失,按下復(fù)位后的串口打印結(jié)果見下圖:
復(fù)位后依然正常顯示當(dāng)前時間,說明RTC外設(shè)按照我們期望的功能在運行。如果拔掉USB數(shù)據(jù)線,供電完全切斷,那數(shù)據(jù)將會丟失,需要再次配置當(dāng)前時間。