加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

RVMCU課堂「20」: 手把手教你玩轉(zhuǎn)RVSTAR—實時時鐘RTC篇

2021/06/20
431
閱讀需 9 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

實時時鐘(Real-Time Clock,RTC)常用于制作時鐘日歷。RTC電路分屬于兩個電源域:備份域和VDD電源域。RTC的核心計數(shù)部分在備份域中,可在VDD斷電VBAT供電時保持RTC的計數(shù),當系統(tǒng)復位或者從待機模式喚醒時,RTC的設置和時間也都保持不變。本期內(nèi)容將通過一個顯示當前時間的例程帶領(lǐng)大家初步了解GD32VF103的RTC外設的使用方法。

系統(tǒng)環(huán)境:Windows 10-64bit

軟件平臺:NucleiStudio IDE 202102版或 PlatformIO IDE

硬件需求:RV-STAR開發(fā)板

GD32VF103的RTC電路

GD32VF103的RTC電路包含兩個主要部分,分別是位于PCLK1時鐘域的APB接口和位于RTC時鐘域的RTC內(nèi)核:

APB接口與APB1總線相連,包含一組寄存器,可通過APB1總線對其進行訪問。

RTC內(nèi)核包含兩個主要模塊,一個是RTC預分頻模塊,模塊包含一個20位可編程預分頻器,該分頻器可以通過對RTC時鐘源分頻產(chǎn)生SC_CLK,如果RTC_INTEN寄存器中的秒中斷標志位被使能,在每個SC_CLK上升沿,RTC會產(chǎn)生一個秒中斷。另外一個模塊是一個32位可編程計數(shù)器,其數(shù)值可以被初始化為當前系統(tǒng)時間。如果RTC_INTEN的鬧鐘中斷標志位被使能,RTC會在系統(tǒng)時間等于鬧鐘時間(存儲于RTC_ALRMH/L寄存器)時產(chǎn)生一個鬧鐘中斷。

RTC的主要特征如下:

32位可編程計數(shù)器,用于計數(shù)運行時間

可編程的預分頻器,分頻系數(shù)最高可達2^20

 

獨立時鐘域:

PCLK1時鐘域

RTC時鐘域(該時鐘域必須比PCLK1時鐘至少慢4倍)

RTC時鐘源:

HXTAL時鐘除以128

LXTAL振蕩電路時鐘

IRC40K振蕩電路時鐘

可屏蔽的中斷源:

鬧鐘中斷

秒中斷

溢出中斷

實驗部分

本期的實驗將使用RV-STAR的RTC外設實現(xiàn)顯示當前時間的功能,例程的整體實現(xiàn)思路如下:

首先需要初始化RTC外設:使能時鐘源和配置預分頻系數(shù)等,對于是否通過串口打印輸出當前時間,聲明一個狀態(tài)變量并賦值為0;

然后用戶通過串口人工輸入當前的時間對RTC的寄存器進行配置,RTC進入自動計數(shù)模式,每秒產(chǎn)生一個中斷,在中斷服務程序中將狀態(tài)變量置1

主程序中運行一個循環(huán)體,判斷狀態(tài)變量的值,如果為1,則讀取RTC寄存器存儲的當前時間然后打印輸出到串口

重點講解一下RTC外設的初始化配置,其代碼片段如下:


 

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,同時要注意預分頻系數(shù)的設置,另外每次對RTC的寫操作,均要等待寫入完成,例程其余部分的代碼均有詳細注釋,讀者們可以自行閱讀,相關(guān)代碼請參考RVMCU網(wǎng)站專欄對應鏈接。

將完整代碼進行編譯上傳至RV-STAR開發(fā)板,打開串口終端(圖中使用PlatformIO的串口終端,也可以使用其他的串口工具):

然后在串口終端中依次輸入當前時間的時、分、秒數(shù)據(jù),時鐘功能就正常開啟了,將會每秒刷新輸出一次當前時間,如下圖:

如果按下復位按鈕,程序會重啟,但只要保持通電,RTC的計時會正常進行,數(shù)據(jù)也不會丟失,按下復位后的串口打印結(jié)果見下圖:

復位后依然正常顯示當前時間,說明RTC外設按照我們期望的功能在運行。如果拔掉USB數(shù)據(jù)線,供電完全切斷,那數(shù)據(jù)將會丟失,需要再次配置當前時間。

有條件的讀者也可以嘗試將鋰電池及底座焊接到RV-STAR背面預留的焊接處,那樣即使USB數(shù)據(jù)線的供電切斷,RTC也可以依靠電池電源保存數(shù)據(jù)并持續(xù)計時。

由于GD32VF103的RTC外設較為簡單,硬件上僅有時鐘(時/分/秒)相關(guān)的寄存器,而沒有日歷相關(guān)的寄存器,因此如果要實現(xiàn)完整的日歷時鐘顯示,需要用軟件來實現(xiàn)日歷,留給讀者自行探索。

 

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

中國大陸首家專業(yè)RISC-V處理器內(nèi)核IP和解決方案公司,助力構(gòu)建RISC-V創(chuàng)新生態(tài),公司網(wǎng)址:https://www.nucleisys.com