1.RTC簡介
RTC,英文全稱:Real-time clock,中文名稱:實時時鐘,是指可以像時鐘一様輸出實際時間的電子設備,一般會是集成電路,因此也稱為時鐘芯片。實時時鐘芯片是日常生活中應用最為廣泛的消費類電子產品之一。它為人們提供精確的實時時間,或者為電子系統提供精確的時間基準,目前實時時鐘芯片大多采用精度較高的晶體振蕩器作為時鐘源。
RTC特性
實時時鐘( RTC)是一個獨立的 BCD 定時器/計數器
軟件支持夏時令補償
可編程周期性自動喚醒定時器
兩個 32 位寄存器包含時、分、秒、年、月、日(幾號)、星期(星期幾)
獨立的 32 位寄存器包含亞秒
兩個編程鬧鐘
兩個 32 位寄存器包含編程鬧鐘時、分、秒、年、月、日(幾號)、星期(星期幾)
兩個獨立的 32 位寄存器包含編程鬧鐘亞秒
數字精密校準功能
時間戳功能
在 Backup 域復位后,所有 RTC 寄存器都受到保護, 以防止可能的意外寫訪問
多個中斷/事件喚醒源,包括鬧鐘 A、鬧鐘 B、喚醒定時器、時間戳
RCC 寄存器使能 RTC 模塊且電壓保持在工作范圍內, RTC 在任何模式下都不會停止(包括 RUN 模式、SLEEP 模式、 STOP0 模式、 STOP2 模式和 STANDBY 模式)
RTC 提供多種喚醒源可以使 MCU 從所有的低功耗模式下喚醒( SLEEP 模式, STOP0 模式, STOP2 模式和 STANDBY 模式)
RTC框圖
2.RTC功能特性
RTC 包括以下功能模塊:
Alarm A 和 Alarm B 事件/中斷
時間戳事件/中斷
RTC 輸出功能:
256 Hz 或者 1Hz 時鐘輸出(當 LSE 頻率是 32.768 kHz)
鬧鐘輸出(極性可配置),鬧鐘 A 和鬧鐘 B 可選
自動喚醒輸出(極性可配置)
RTC 輸入功能:
時間戳事件檢測
通過配置輸出寄存器控制 PC13:
設置 RTC_OPT.TYPE 位配置 PC13 開漏/推挽輸出
3.RTC相關寄存器
RTC在配置過程中,需要完成配置的有RTC寫保護相關寄存器、RTC時鐘和預分頻寄存器、日歷寄存器以及鬧鐘和校準寄存器。
RTC寄存器寫保護
PWR_CTRL.DBKP 位(見電源控制部分) 默認被清除,所以 PWR_CTRL.DBKP 必須置 1 去使能 RTC 寄存器寫功能。一旦備份域復位,所有的 RTC 寫保護寄存器都會寫保護,所有的 RTC 寫保護寄存器需要按如下步驟去解鎖寫保護:
將 0xCA 寫入 RTC_WRP 寄存器
將 0x53 寫入 RTC_WRP 寄存器
在解鎖這些寄存器后,可以通過清除 PWR_CTRL.DBKP 位激活寫保護。解鎖機制只檢查 RTC_WRP 寄存器的寫操作。在解鎖過程中、解鎖前、解鎖后,對其他寄存器的寫操作不會影響解鎖結果。
RTC時鐘和預分頻
RTC 時鐘源:
LSE 時鐘
LSI 時鐘
HSE/128 時鐘
為了降低功耗,將預分頻器分為異步預分頻器和同步預分頻器。如果同時使用兩個預分頻器,建議異步預分頻器的值盡可能大。
7 位異步預分頻器由 RTC_PRE.DIVA[6:0] 位控制
15 位同步預分頻器由 RTC_PRE.DIVS[14:0] 位控制
ck_apre 時鐘用于對 RTC_SUBS 亞秒遞減計數器提供時鐘。當到達 0 時,用 RTC_PRE.DIVS[14:0]的值重新加載 RTC_SUBS。
RTC日歷
這里有三個影子寄存器,分別是 RTC_DATE, RTC_TSH 和 RTC_SUBS。 RTC 時間和日期寄存器可以通過影子寄存器訪問。也可以直接訪問,以避免等待同步時間。這三個影子寄存器如下:
RTC_DATE: 設置和讀取日期
RTC_TSH: 設置和讀取時間
RTC_SUBS: 讀取亞秒
4.RTC電子鐘配置流程
1.RTC作為實時電子鐘外設模塊,在默認情況下只需要初始化一次即可。為了達到該目的,我們可以借助后備域寄存器BKP。
備份存儲器位于備份域里,電源 VDD 關閉后由 VBAT 供電維持。 BKP 共有 42 個 16 位的寄存器,可用來存儲并保護用戶應用數據。這 84 個字節不受系統待機模式喚醒或系統復位的影響。
根據備份存儲器復位不會清除數據特性,我們可以在第一次配置好RTC寄存器后將對應的某一個寄存器寫入標志位,這樣下次若檢測到標志位存在,則直接啟動RTC即可。
2.選擇RTC時鐘源。因為RTC時鐘源選擇有3個:HSE/128、LSE、LSI。為了讓RTC更精準,應優先選擇LSE(外部低速時鐘32.768KHZ),而我們當前開發板剛好有LSI。
在RCC_BDCRCTL的0和1位,選擇LSE時鐘源;RCC_BDCRCTL的第15位使能RTC時鐘。
3.設置RTC的工作頻率。設置RTC的工作頻率我們可以通過RTC_PRE預分頻寄存器完成。
我們選擇的是LSE=32.768KHZ時鐘源,根據時鐘頻率計算公式,我們可以設置RTC_PRE=0xFF7F來產生1HZ工作頻率。根據官方文檔,異步預分頻盡量設置大些。
4.設置電子日歷。電子日歷可通過時間寄存器RTC_TSH和日期寄存器RTC_DATE完成配置。
5.輸出1HZ頻率。在使用RTC日歷功能時,參考官方提供示例日歷功能是通過RTC校準輸出引腳PC13輸出,然后在開啟一個外部中斷器檢測該引腳,從而輸出電子日歷。
在使用RTC本身喚醒中斷時發現無法觸發,也可能是配置有問題,這個等下一次解決后再來敘述說明,本示例則按照官方示例實現。
PC13引腳模式配置
4.1 RTC配置示例
按照上述步驟,RTC電子日歷功能配置示例如下:
void RTC_Init(void) { //開啟RTC和后備域權限 RCC->APB1PCLKEN|=1<<27;//開啟備份接口時鐘 RCC->APB1PCLKEN|=1<<28;//電源接口時鐘 /* 允許訪問RTC*/ PWR->CTRL|=1<<8;//允許寫入RTC和后備區域 if(BKP->DAT2!=0xAA)//判斷是否上一次RTC初始化 { printf("進入初始化rn"); RCC->BDCTRL&=~(1<<15);//關閉RTC時鐘 //2.選擇RTC時鐘源 RCC->BDCTRL|=1<<0;//開啟32.768KHZ時鐘 while(!(RCC->BDCTRL&1<<1)){}//等待32.768KHZ時鐘準備就緒 RCC->BDCTRL&=~(0x3<<8);//清除原來寄存器中的值 RCC->BDCTRL|=0x1<<8;//時鐘源為32.768KHZ RCC->BDCTRL|=1<<15;//開啟RTC時鐘 /*解除RTC寫保護*/ RTC->WRP=0xCA; RTC->WRP=0x53; while(!(RTC->INITSTS&1<<5)){} //等待日歷影子寄存器同步 RTC->INITSTS|=1<<7;//進入初始化模式 while(!(RTC->INITSTS&1<<6)){}//等待初始化標志置1 printf("進入配置模式rn"); /*設置分頻系數,產生1HZ*/ RTC->PRE=0; RTC->PRE|=0X7F<<16; RTC->PRE|=0xFF; RTC->INITSTS&=~(1<<7);//退出初始化模式 RTC->WRP=0xff; for(int i=0;i<0x2FF;i++);//等待配置完成 BKP->DAT2=0xAA;//RTC初始化完成標志 RTC_SetDate(&RTC_Time); } RTC->WRP = 0xCA; RTC->WRP = 0x53; RTC->CTRL|=1<<19;//輸出1HZ RTC->OPT|=1<<0;//推挽輸出 RTC->CTRL|=1<<23;//開啟校準輸出 RTC->WRP = 0xFF; printf("初始化完成rn"); }
4.2 配置PA7引腳,捕獲RTC電子日歷
由于RTC產生的1HZ頻率是通過PC13引腳輸出,所以我們配置一個硬件來實現電子日歷。
void EXTI_Init(void) { //1.GPIO口配置 RCC->APB2PCLKEN|=1<<2; GPIOA->PL_CFG&=0x0FFFFFFF; GPIOA->PL_CFG|=0x80000000; //2.開AFIO時鐘,選擇觸發源 RCC->APB2PCLKEN|=1<<0;//開AFIO時鐘 /*外部中斷7--PA7*/ AFIO->EXTI_CFG[1]&=~(0xF<<3*4);//PA7 EXTI->IMASK|=1<<7;//使能中斷線7 EXTI->RT_CFG|=1<<7;//檢測上升沿 N32_NVIC_SetPriority(EXTI9_5_IRQn,1,1);//設置優先級 } void EXTI9_5_IRQHandler(void) { else if(PAin(7)) { RTC_GetDate(&RTC_Time); } EXTI->PEND|=0xf<<5;//清除標志位 }
4.3 RTC設置時間
為方便后續時間校準(串口校時或者網絡校時或其它方式)實現,這里單獨封裝一個RTC時間校準函數。
/*設置RTC時間和日期*/ void RTC_SetDate(RTC_TIME *RTC_Time) { RTC->WRP = 0xCA; RTC->WRP = 0x53; RTC->INITSTS|=1<<7;//進入初始化模式 while(!(RTC->INITSTS&1<<6)){}//等待初始化標志置1 //設置日期 RTC->DATE=0; //年 RTC->DATE=0; RTC->DATE|=(RTC_Time->year / 10)<<20; RTC->DATE|=(RTC_Time->year % 10)<<16; //星期1 RTC->DATE|=(RTC_Time->week % 8)<<13; //月 RTC->DATE|=(RTC_Time->mon / 10)<<12; RTC->DATE|=(RTC_Time->mon % 10)<<8; //日 RTC->DATE|=(RTC_Time->day / 10)<<4; RTC->DATE|=(RTC_Time->day % 10)<<0; /*設置時間*/ RTC->TSH=0; RTC->TSH&=~(1<<22);//24小時制 //時 RTC->TSH|=(RTC_Time->hour / 10)<<20; RTC->TSH|=(RTC_Time->hour % 10)<<16; //分 RTC->TSH|=(RTC_Time->min /10)<<12; RTC->TSH|=(RTC_Time->min %10)<<8; //秒 RTC->TSH|=(RTC_Time->sec /10)<<4; RTC->TSH|=(RTC_Time->sec %10)<<0; RTC->INITSTS&=~(1<<7);//退出初始化模式 RTC->WRP=0xff; }
4.4 RTC時間讀取
為方便后續做時間顯示處理,封裝時間獲取函數。
/*讀取RTC時間和日期*/ void RTC_GetDate(RTC_TIME *RTC_Time) { u32 date=RTC->DATE; u32 tsh=RTC->TSH; RTC_Time->year=((date>>20)&0xf)*10+ ((date>>16)&0xf); RTC_Time->mon=((date>>12)&0x1)*10+ ((date>>8)&0xf); RTC_Time->day=((date>>4)&0x3)*10+(date&0xf); RTC_Time->week=((date>>13)&0x7); //時間,注意,+-優先級 高于 &的優先級 RTC_Time->hour=((tsh>>20)&0x3)*10+((tsh>>16)&0xf); RTC_Time->min=((tsh>>12)&0x7)*10+((tsh>>8)&0xf); RTC_Time->sec=((tsh>>4)&0x7)*10+(tsh&0xf); // printf("%d/%d/%d -- %d:%d:%d rn",RTC_Time->year,RTC_Time->mon,RTC_Time->day, RTC_Time->hour,RTC_Time->min,RTC_Time->sec); }
4.5 串口校時
通過串口方式進行時間校準。串口數據格式如下:
if(usart1_flag) { usart1_rx_buff[usart1_cnt]='?';//字符串結束標志符 printf("usart1:%srn",usart1_rx_buff); //*20200822102540 if(usart1_rx_buff[0]=='*' && usart1_cnt==15) { RTC_Time.year=(usart1_rx_buff[3]-'0')*10+(usart1_rx_buff[4]-'0')*1; RTC_Time.mon=(usart1_rx_buff[5]-'0')*10+(usart1_rx_buff[6]-'0')*1; RTC_Time.day=(usart1_rx_buff[7]-'0')*10+(usart1_rx_buff[8]-'0')*1; RTC_Time.hour=(usart1_rx_buff[9]-'0')*10+(usart1_rx_buff[10]-'0')*1; RTC_Time.min=(usart1_rx_buff[11]-'0')*10+(usart1_rx_buff[12]-'0')*1; RTC_Time.sec=(usart1_rx_buff[13]-'0')*10+(usart1_rx_buff[14]-'0')*1; RTC_ChangeWeek(RTC_Time.year,RTC_Time.mon,RTC_Time.day);//星期 RTC_SetDate(&RTC_Time);//設置時間和日期 } usart1_flag=0; usart1_cnt=0; }
4.6 運行效果
將獲取到的時間通過OLED屏幕顯示。OLED屏幕驅動參考:http://www.xsypw.cn/d/1950506.htmltrack_id=myCenter&mod=article&share
審核編輯:湯梓紅
-
電子鐘
+關注
關注
7文章
189瀏覽量
36944 -
RTC
+關注
關注
2文章
538瀏覽量
66523 -
n32g455
+關注
關注
0文章
7瀏覽量
937
發布評論請先 登錄
相關推薦
評論