文章目錄
- 一.概要
- 二.RTC基本特點
- 三.GD32單片機RTC內部結構圖
- 四.配置一個RTC走秒例程
- 五.工程源代碼下載
- 六.小結
一.概要
RTC(Real-Time Clock)是一種用于追蹤和記錄實際時間的時鐘系統。RTC模塊提供了一個包含日期(年/月/日)和時間(時/分/秒/亞秒)的日歷功能。除亞秒用二進制碼顯示外,時間和日期都以BCD碼的形式顯示。RTC可以進行夏令時補償。RTC可以工作在省電模式下,并通過軟件配置來智能喚醒。RTC支持外接更高精度的低頻時鐘,用以達到更高的日歷精度。
本文介紹了GD32 RTC實時時鐘的基本概念,內部結構,以及用內部RTC進行時間計時的例程。
二.RTC基本特點
1.通過軟件設置來實現夏令時補償
2.參考時鐘檢測功能:通過外接更高精度的低頻率時鐘源(50Hz或60Hz)來提高日歷精度
3.數字校準功能:通過調整最小時間單位(最大可調精度0.95ppm)來進行日歷校準
4.通過移位功能進行亞秒級調整
5.記錄事件時間的時間戳功能
6.兩個模式可配置的獨立的侵入檢測
7.可編程的日歷和兩個位域可屏蔽的鬧鐘
8.可屏蔽的中斷源: 鬧鐘0和鬧鐘1,時間戳檢測,侵入檢測,自動喚醒事件
9.20個32位(共80字節)通用備份寄存器,能夠在省電模式下保存數據。當有外部事件侵入時,備份寄存器將會復位
三.GD32單片機RTC內部結構圖
RTC內部結構圖如下
RTC單元有三個可選的獨立時鐘源:LXTAL、IRC32K和HXTAL的2-31(由RCU_CFG寄存器配置)分頻后的時鐘。
ck_spre用于為日歷寄存器提供時鐘,每個時鐘增加一秒。
異步預分頻器(Asynchronous Prescaler):將輸入時鐘分頻為中間頻率(如從32.768 kHz分頻至1 kHz)。異步分頻器主要用來降低功率消耗。
同步預分頻器(Synchronous Prescaler):進一步分頻中間頻率至1 Hz信號,驅動計數器。
可編程鬧鐘:通過比較器匹配計數器值,觸發中斷或喚醒事件。
四.配置一個RTC走秒例程
STLINK接GD32F407VET6開發板,STLINK接電腦USB口。
主要代碼
#define RTC_CLOCK_SOURCE_LXTAL //配置時鐘源為外部32.768K晶振/*!\brief get current time and date\param[in] none\param[out] rtc_initpara_struct: pointer to a rtc_parameter_struct structure which contains parameters for initialization of the rtc peripheralmembers of the structure and the member values are shown as below:year: 0x0 - 0x99(BCD format)month: RTC_JAN, RTC_FEB, RTC_MAR, RTC_APR, RTC_MAY, RTC_JUN,RTC_JUL, RTC_AUG, RTC_SEP, RTC_OCT, RTC_NOV, RTC_DECdate: 0x1 - 0x31(BCD format)day_of_week: RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAYRTC_FRIDAY, RTC_SATURDAY, RTC_SUNDAYhour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format choseminute: 0x0 - 0x59(BCD format)second: 0x0 - 0x59(BCD format)factor_asyn: 0x0 - 0x7Ffactor_syn: 0x0 - 0x7FFFam_pm: RTC_AM, RTC_PMdisplay_format: RTC_24HOUR, RTC_12HOUR\retval none
*/
void rtc_current_time_get(rtc_parameter_struct* rtc_initpara_struct)
{uint32_t temp_tr = 0U, temp_dr = 0U, temp_pscr = 0U, temp_ctlr = 0U;temp_tr = (uint32_t)RTC_TIME; temp_dr = (uint32_t)RTC_DATE;temp_pscr = (uint32_t)RTC_PSC;temp_ctlr = (uint32_t)RTC_CTL;/* get current time and construct rtc_parameter_struct structure */rtc_initpara_struct->year = (uint8_t)GET_DATE_YR(temp_dr);rtc_initpara_struct->month = (uint8_t)GET_DATE_MON(temp_dr);rtc_initpara_struct->date = (uint8_t)GET_DATE_DAY(temp_dr);rtc_initpara_struct->day_of_week = (uint8_t)GET_DATE_DOW(temp_dr); rtc_initpara_struct->hour = (uint8_t)GET_TIME_HR(temp_tr);rtc_initpara_struct->minute = (uint8_t)GET_TIME_MN(temp_tr);rtc_initpara_struct->second = (uint8_t)GET_TIME_SC(temp_tr);rtc_initpara_struct->factor_asyn = (uint16_t)GET_PSC_FACTOR_A(temp_pscr);rtc_initpara_struct->factor_syn = (uint16_t)GET_PSC_FACTOR_S(temp_pscr);rtc_initpara_struct->am_pm = (uint32_t)(temp_pscr & RTC_TIME_PM); rtc_initpara_struct->display_format = (uint32_t)(temp_ctlr & RTC_CTL_CS);
}
void rtc_show_time(void)
{rtc_current_time_get(&rtc_initpara);
}
//初始化時間設置
void rtc_setup(void)
{/* setup RTC time value */uint32_t tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF;rtc_initpara.factor_asyn = prescaler_a;rtc_initpara.factor_syn = prescaler_s;rtc_initpara.year = 0x16;//設置初始化時間:年rtc_initpara.day_of_week = RTC_SATURDAY;rtc_initpara.month = RTC_APR;//設置初始化時間:月rtc_initpara.date = 0x30;//設置初始化時間:日rtc_initpara.display_format = RTC_24HOUR;rtc_initpara.am_pm = RTC_AM;rtc_initpara.hour = 00; //設置初始化時間:時 rtc_initpara.minute = 00;//設置初始化時間:分rtc_initpara.second = 00;//設置初始化時間:秒/* RTC current time configuration */if(ERROR == rtc_init(&rtc_initpara)){ }else{rtc_show_time();RTC_BKP0 = BKP_VALUE;}
}
uint8_t aShowTime[16] = "hh:ms:ss";//定義時分秒
uint8_t aShowDate[16] = "dd-mm-yyyy";//定義年月日
int main(void)
{systick_config();//配置系統主頻168M,外部8M晶振,配置在#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000)/* enable PMU clock */rcu_periph_clock_enable(RCU_PMU);/* enable the access of the RTC registers */pmu_backup_write_enable();rtc_pre_config();//配置RTCrtc_setup(); //設置時間2016年4月30日,0點0分0秒while(1){delay_1ms(500);//500ms等待rtc_show_time();//讀取時間sprintf((char *)aShowTime, "%2x:%2x:%2x", rtc_initpara.hour, rtc_initpara.minute, rtc_initpara.second);sprintf((char *)aShowDate, "%2x-%2x-%2x", rtc_initpara.month, rtc_initpara.date, 0x2000 + rtc_initpara.year);}
}
實驗效果
時分秒變量會走秒,如下圖所示,把aShowTime數組放入Memory查看窗口。
五.工程源代碼下載
源碼下載鏈接如下:
CSDN
六.小結
RTC 可以為嵌入式系統提供精確的時間基準,用于各種定時任務和事件。RTC 可以用于智能家居設備中的時間控制,如智能門鎖、智能照明等。