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

基于RT-Thread和N32G457的電子墨水屏電子鐘設(shè)計(jì)方案
國(guó)民技術(shù)N32G45環(huán)境搭建及點(diǎn)燈測(cè)試
【國(guó)民技術(shù)N32項(xiàng)目移植】基于N32G45的電子鐘項(xiàng)目移植
【精品合集】國(guó)民技術(shù)N32開(kāi)源移植挑戰(zhàn)賽作品合集
【國(guó)民技術(shù)N32項(xiàng)目移植】5.項(xiàng)目提交-天氣顯示及預(yù)報(bào)系統(tǒng)介紹以及演示
【國(guó)民技術(shù)N32項(xiàng)目移植】基于N32G45智能家居平臺(tái)
N32G45的工程項(xiàng)目如何添加AT組件?
N32G45x_N32G4FR_N32WB452_GCC開(kāi)發(fā)環(huán)境應(yīng)用筆記
國(guó)民技術(shù)N32G45XVL-STB開(kāi)發(fā)版資料
基于N32G45的按鍵驅(qū)動(dòng)

DA45-220T051515G9N3 DA45-220T051515G9N3

評(píng)論