一、RTC簡介
實(shí)時時鐘是一個獨(dú)立的定時器。RTC模塊擁有一組連續(xù)計數(shù)的計數(shù)器,在相應(yīng)軟件配置下,可
提供時鐘日歷的功能。修改計數(shù)器的值可以重新設(shè)置系統(tǒng)當(dāng)前的時間和日期。
RTC模塊和時鐘配置系統(tǒng)(RCC_BDCR寄存器)處于后備區(qū)域,即在系統(tǒng)復(fù)位或從待機(jī)模式喚醒
后,RTC的設(shè)置和時間維持不變。但是在系統(tǒng)復(fù)位后,會自動禁止訪問后備寄存器和 RTC,
以防止對后備區(qū)域(BKP)的意外寫操作。所以在要設(shè)置時間之前, 先要取消備份區(qū)域(BKP)
寫保護(hù)。
二、RTC主要特性
挑了主要的特性:
1、32位的可編程計數(shù)器,可用于較長時間段的測量
2個分離的時鐘:用于APB1接口的PCLK1和RTC時鐘
3、可以選擇以下三種RTC的時鐘源:
HSE時鐘除以128
LSE振蕩器時鐘
LSI振蕩器時鐘
4、2個獨(dú)立的復(fù)位類型:
APB1接口由系統(tǒng)復(fù)位;
RTC核心(預(yù)分頻器、鬧鐘、計數(shù)器和分頻器)只能由后備域復(fù)位;
5、3個專門的可屏蔽中斷:
鬧鐘中斷,用來產(chǎn)生一個軟件可編程的鬧鐘中斷。
秒中斷,用來產(chǎn)生一個可編程的周期性中斷信號(最長可達(dá)1秒)。
溢出中斷,指示內(nèi)部可編程計數(shù)器溢出并回轉(zhuǎn)為0的狀態(tài)。
三、功能描述
RTC由兩個主要部分組成(參見下圖)。第一部分(APB1接口)用來和APB1總線相連。此單元還包
含一組16位寄存器,可通過APB1總線對其進(jìn)行讀寫操作。APB1接口由APB1總線時鐘驅(qū)動,用來與APB1總線接口。
另一部分(RTC核心)由一組可編程計數(shù)器組成,分成兩個主要模塊。第一個模塊是RTC的預(yù)分頻
模塊,它可編程產(chǎn)生最長為1秒的RTC時間基準(zhǔn)TR_CLK。第二個模塊是一個32位的可編程計數(shù)器,可被初始化為當(dāng)前的系統(tǒng)時間。
說白了APB1總線的作用是為RTC模塊提供通信和數(shù)據(jù)傳輸?shù)耐ǖ溃沟肦TC模塊能夠與其他外設(shè)進(jìn)行數(shù)據(jù)交換和通信。且在系統(tǒng)復(fù)位后需要控制APB1總線上的RCC_APB1ENR的PWREN和BKPEN位,使能電源和后備接口時鐘使能對后備寄存器和RTC的訪問
RTC預(yù)分頻器控制計數(shù)頻率,RTC_CNT與RTC_ALR值進(jìn)行對比(和定時器類似)即產(chǎn)生鬧鐘
四、RTC寄存器描述
1、RTC控制寄存器高位(RTC_CRH)
中斷使能。因為在系統(tǒng)復(fù)位之后所有的中斷都被屏蔽(即此寄存器的所有位都被置為0),如果我們需要開啟相應(yīng)的中斷則給相應(yīng)的中斷位置1(執(zhí)行此操作的前提是RTC_CRL寄存器的標(biāo)志位RTOFF=0)即對RTC寄存器的寫操作完成。
2、RTC控制寄存器低位(RTC_CRL)
此寄存器是RTC模塊的一些標(biāo)志位。第 0 位是秒鐘標(biāo)志位,我們在進(jìn)入鬧鐘中斷的時候,通過判斷這位來決定是不是發(fā)生了秒鐘中斷,此位只能通過軟件清除。第3位為寄存器同步標(biāo)志位,結(jié)合RTC框圖,只有當(dāng)寄存器同步后,才可以修改RTC_CRH和RTC_CRL的寄存器的值,否則修改的值無效。第4位是配置標(biāo)志,即要想RTC寄存器寫值時必須將此位置1。第5位,就是等待寫操作完成,否則寫入的值也無效。
所以RTC寄存器的配置過程應(yīng)該是這樣:
1. 查詢RTOFF位,直到RTOFF的值變?yōu)椤?’(判斷寫操作是否完成)
2. 置CNF值為1,進(jìn)入配置模式
3. 對一個或多個RTC寄存器進(jìn)行寫操作
4. 清除CNF標(biāo)志位,退出配置模式
5. 查詢RTOFF,直至RTOFF位變?yōu)椤?’以確認(rèn)寫操作已經(jīng)完成。
3、RTC預(yù)分頻裝載寄存器(RTC_PRLH/RTC_PRLL)
RTC_PRLH
RTC_PRLL
這兩個寄存器用來配置 RTC 時鐘的分頻數(shù)的,比如我們使用外部 32.768K 的晶振作為時鐘的輸入頻率,那么我們要設(shè)置這兩個寄存器的值為 32767,以得到一秒鐘的計數(shù)頻率。
4、RTC預(yù)分頻器余數(shù)寄存器(RTC_DIVH / RTC_DIVL)
用戶可通過讀取RTC_DIV寄存器,以獲得預(yù)分頻計數(shù)器的當(dāng)前值,此寄存器是只讀寄存器,其值在RTC_PRL或RTC_CNT寄存器中的值發(fā)生改變后,由硬件重新裝載。這兩個寄存器的作用就是用來獲得比秒鐘更為準(zhǔn)確的時鐘,比如可以得到 0.1 秒,或者 0.01 秒等。
5、RTC計數(shù)器寄存器 (RTC_CNTH / RTC_CNTL)
RTC_CNT寄存器用來存放計數(shù)器的計數(shù)值。沒過一秒此寄存器加1,可通過讀取該寄存器的值來獲得當(dāng)前的時間。
因為沒用到鬧鐘寄存器這里就不介紹了
五、其它寄存器
備份寄存器
數(shù)據(jù)備份寄存器,即使此寄存器斷電依然可以保存數(shù)據(jù),通過向此寄存器寫入數(shù)據(jù),當(dāng)斷電之后讀取此寄存器的數(shù)據(jù)進(jìn)行判斷跳過RTC的初始化環(huán)節(jié)。
2、APB1 外設(shè)時鐘使能寄存器(RCC_APB1ENR)和電源控制寄存器(PWR_CR)
系統(tǒng)復(fù)位后,對后備寄存器和RTC的訪問被禁止,這是為了防止對后備區(qū)域(BKP)的意外寫操
作。執(zhí)行以下操作將使能對后備寄存器和RTC的訪問:
設(shè)置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能電源和后備接口時鐘
設(shè)置寄存器PWR_CR的DBP位,使能對后備寄存器和RTC的訪問。
3、備份域控制寄存器 (RCC_BDCR)
將LSEON位置1使能外部低速振蕩器,判斷LSERDY外部LSE是否就緒,最后RTCSEL置為01選擇LSE最為RTC的時鐘,就完成了對RTC部分對時鐘的配置。
在RTC初始化的時候應(yīng)該將BDRST位置1,清除備份區(qū)域
六、主函數(shù)代碼文章來源:http://www.zghlxwxcb.cn/news/detail-800375.html
int main(void)
{
delay_init(); //延時函數(shù)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
LED_Init(); //LED端口初始化
OLED_Init(); //初始化OLED
RTC_Init(); //RTC初始化
OLED_ShowString(0,0,"RTC Test",12);
OLED_Refresh_Gram(); //更新顯示到OLED
// t=' ';
while(1)
{
switch(calendar.week)
{
case 0:
OLED_ShowString(0,12,"Sunday",12);
break;
case 1:
OLED_ShowString(0,12,"Monday",12);
break;
case 2:
OLED_ShowString(0,12,"Tuesday",12);
break;
case 3:
OLED_ShowString(0,12,"Wednesday",12);
break;
case 4:
OLED_ShowString(0,12,"Thursday",12);
break;
case 5:
OLED_ShowString(0,12,"Friday",12);
break;
case 6:
OLED_ShowString(0,12,"Saturday",12);
break;
default:
break ;
}
OLED_ShowNum(0,24,calendar.hour,2,12);
OLED_ShowString(12,24,":",12);
OLED_ShowNum(18,24,calendar.min,2,12);
OLED_ShowString(30,24,":",12);
OLED_ShowNum(36,24,calendar.sec,2,12);
OLED_ShowNum(0,36,calendar.w_year,4,12);
OLED_ShowString(24,36,"/",12);
OLED_ShowNum(30,36,calendar.w_month,2,12);
OLED_ShowString(42,36,"/",12);
OLED_ShowNum(48,36,calendar.w_date,2,12);
OLED_Refresh_Gram(); //更新顯示到OLED
}
}
RTC模塊是參考原子哥的,其實(shí)大家只要把RTC功能框圖和RTC相關(guān)寄存器搞熟悉之后RTC模塊還是不難的。如果有其它問題可以評論或給我留言文章來源地址http://www.zghlxwxcb.cn/news/detail-800375.html
到了這里,關(guān)于stm32-OLED屏+RTC實(shí)現(xiàn)簡易實(shí)時時鐘(下篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!