** 簡述**
STM32 的實時時鐘(RTC)是一個獨立的定時器。 STM32 的 RTC 模塊擁有一組連續(xù)計數(shù)的計數(shù)器,在相應(yīng)軟件配置下,可提供時鐘日歷的功能。修改計數(shù)器的值可以重新設(shè)置系統(tǒng)當(dāng)前的時間和日期。
RTC 模塊和時鐘配置系統(tǒng) (RCC_BDCR 寄存器)是在后備區(qū)域,即在系統(tǒng)復(fù)位或從待機模式喚醒后 RTC 的設(shè)置和時間維持不變。但是在系統(tǒng)復(fù)位后,會自動禁止訪問后備寄存器和 RTC,以防止對后備區(qū)域 (BKP) 的意外寫操作。所以在要設(shè)置時間之前, 先要取消備份區(qū)域(BKP)寫保護。
RTC 由兩個主要部分組成(參見上圖), 第一部分(APB1 接口)用來和 APB1 總線相連。此單元還包含一組 16 位寄存器,可通過 APB1 總線對其進行讀寫操作。 APB1 接口由 APB1 總線時鐘驅(qū)動,用來與 APB1 總線連接。
另一部分 (RTC 核心) 由一組可編程計數(shù)器組成,分成兩個主要模塊。第一個模塊是 RTC 的預(yù)分頻模塊,它可編程產(chǎn)生 1 秒的 RTC 時間基準(zhǔn) TR_CLK。 RTC 的預(yù)分頻模塊包含了一個 20 位的可編程分頻器 (RTC 預(yù)分頻器)。如果在 RTC_CR 寄存器中設(shè)置了相應(yīng)的允許位,則在每個TR_CLK 周期中 RTC 產(chǎn)生一個中斷(秒中斷)。第二個模塊是一個 32 位的可編程計數(shù)器,可被初始化為當(dāng)前的系統(tǒng)時間,一個 32 位的時鐘計數(shù)器,按秒鐘計算,可以記錄 4294967296 秒,約合 136 年左右。
RTC 還有一個鬧鐘寄存器 RTC_ALR,用于產(chǎn)生鬧鐘。系統(tǒng)時間按 TR_CLK 周期累加并與存儲在 RTC_ALR 寄存器中的可編程時間相比較,如果 RTC_CR 控制寄存器中設(shè)置了相應(yīng)允許位,比較匹配時將產(chǎn)生一個鬧鐘中斷。RTC 內(nèi)核完全獨立于 RTC APB1 接口,而軟件是通過 APB1 接口訪問 RTC 的預(yù)分頻值、計數(shù)器值和鬧鐘值的。但是相關(guān)可讀寄存器只在 RTC APB1 時鐘進行重新同步的 RTC 時鐘的上升沿被更新, RTC 標(biāo)志也是如此。這就意味著,如果 APB1 接口剛剛被開啟之后,在第一次的內(nèi)部寄存器更新之前,從 APB1 上讀取的 RTC 寄存器值可能被破壞了(通常讀到 0)。因此,若在讀取 RTC 寄存器曾經(jīng)被禁止的 RTC APB1 接口,軟件首先必須等待 RTC_CRL 寄存器的 RSF位(寄存器同步標(biāo)志位, bit3)被硬件置 1。
2. RTC 寄存器介紹
2.1 RTC 的控制寄存器——RTC_CRH 寄存器
該寄存器用來控制中斷的。
2.2 RTC 的控制寄存器——RTC_CRL 寄存器
RTC 用到的是該寄存器的 0、 3~5 這幾個位,第 0 位是秒鐘標(biāo)志位,我們在進入鬧鐘中斷的時候,通過判斷這位來決定是不是發(fā)生了秒鐘中斷。然后必須通過軟件將該位清零(寫 0)。第 3 位為寄存器同步標(biāo)志位,我們在修改控制寄存器 RTC_CRH/CRL 之前,必須先判斷該位,是否已經(jīng)同步了,如果沒有則等待同步,在沒同步的情況下修 RTC_CRH/CRL 的值是不行的。第 4 位為配置標(biāo)位,在軟件修改 RTC_CNT/RTC_ALR/RTC_PRL 的值的時候,必須先軟件置位該位,以允許進入配置模式。第 5 位為 RTC 操作位,該位由硬件操作,軟件只讀。通過該位可以判斷上次對 RTC 寄存器的操作是否完成,如果沒有,我們必須等待上一次操作結(jié)束才能開始下一次操作。
2.3 RTC 預(yù)分頻裝載寄存器——RTC_PRLH 寄存器
這兩個寄存器用來配置 RTC 時鐘的分頻數(shù)的,比如我們使用外部 32.768K 的晶振作為時鐘的輸入頻率,那么我們要設(shè)置這兩個寄存器的值為 32767,以得到一秒鐘的計數(shù)頻率。
2.4 RTC 預(yù)分頻裝載寄存器——RTC_PRLL 寄存器
2.5 RTC 預(yù)分頻器余數(shù)寄存器——RTC_DIVH 寄存器
2.6 RTC 預(yù)分頻器余數(shù)寄存器——RTC_DIVH 寄存器
這兩個寄存器的作用就是用來獲得比秒鐘更為準(zhǔn)確的時鐘,比如可以得到 0.1 秒,或者 0.01 秒等。該寄存器的值自減的,用于保存還需要多少時鐘周期獲得一個秒信號。在一次秒鐘更新后,由硬件重新裝載。
2.7 RTC 計數(shù)器寄存器——RTC_CNT 寄存器
該寄存器由 2 個 16 位的寄存器組成 RTC_CNTH 和 RTC_CNTL,總共 32 位,用來記錄秒鐘值(一般情況下)。在修改這個寄存器的時候要先進入配置模式。
2.8 RTC 計數(shù)器寄存器——RTC 鬧鐘寄存器
該寄存器也是由 2 個 16 位的寄存器組成 RTC_ALRH 和 RTC_ALRL??偣惨彩?32 位,用來標(biāo)記鬧鐘產(chǎn)生的時間(以秒為單位),如果 RTC_CNT 的值與 RTC_ALR 的值相等,并使能了中斷的話,會產(chǎn)生一個鬧鐘中斷。該寄存器的修改也要進入配置模式才能進行。
3. 備份寄存器介紹
備份寄存器是 42 個 16 位的寄存器(Mini 開發(fā)板就是大容量的),可用來存儲 84 個字節(jié)的用戶應(yīng)用程序數(shù)據(jù)。他們處在備份域里,當(dāng) VDD 電源被切斷,他們?nèi)匀挥?VBAT 維持供電。即使系統(tǒng)在待機模式下被喚醒,或系統(tǒng)復(fù)位或電源復(fù)位時,他們也不會被復(fù)位。
復(fù)位后,對備份寄存器和 RTC 的訪問被禁止,并且備份域被保護以防止可能存在的意外的
寫操作。執(zhí)行以下操作可以使能對備份寄存器和 RTC 的訪問:
(1)通過設(shè)置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位來打開電源和后備接口的時鐘;
(2)電源控制寄存器 (PWR_CR) 的 DBP 位來使能對后備寄存器和 RTC 的訪問。
一般用 BKP 來存儲 RTC 的校驗值或者記錄一些重要的數(shù)據(jù),相當(dāng)于一個 EEPROM,不過這個 EEPROM 并不是真正的 EEPROM,而是需要電池來維持它的數(shù)據(jù)。
RTC 的時鐘源選擇及使能設(shè)置都是通過這個寄存器來實現(xiàn)的,所以我們在 RTC 操作之前先要通過這個寄存器選擇 RTC 的時鐘源,然后才能開始其他的操作。
4. RTC 配置步驟
(1) 使能電源時鐘和備份區(qū)域時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
(2) 取消備份區(qū)寫保護
PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后備寄存器訪問
(3) 復(fù)位備份區(qū)域,開啟外部低速振蕩器。
BKP_DeInit();//復(fù)位備份區(qū)域
(4) 選擇 RTC 時鐘,并使能
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇 LSE 作為 RTC 時鐘(RCC_RTCCLKSource_LSI 和 RCC_RTCCLKSource_HSE_Div128)
RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘
(5) 設(shè)置 RTC 的分頻,以及配置 RTC 時鐘
在開啟了 RTC 時鐘之后,我們要做的是設(shè)置 RTC 時鐘的分頻數(shù),通過 RTC_PRLH 和RTC_PRLL 來設(shè)置,然后等待 RTC 寄存器操作完成,并同步之后,設(shè)置秒鐘中斷。然后設(shè)置 RTC 的允許配置位(RTC_CRH 的 CNF 位),設(shè)置時間(其實就是設(shè)置RTC_CNTH 和 RTC_CNTL兩個寄存器)。
RTC_EnterConfigMode();/// 允許配置
RTC_ExitConfigMode();//退出配置模式,更新配置
void RTC_SetPrescaler(uint32_t PrescalerValue);
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中斷
void RTC_SetCounter(uint32_t CounterValue)最后在配置完成之后
(6) 更新配置,設(shè)置 RTC 中斷分組
設(shè)置完時鐘之后,我們將配置更新同時退出配置模式,這里還是通過 RTC_CRH 的 CNF 來實現(xiàn)。
RTC_ExitConfigMode();//退出配置模式,更新配置
在退出配置模式更新配置之后我們在備份區(qū)域 BKP_DR1 中寫入 0X5050 代表我們已經(jīng)初始化過時鐘了,下次開機(或復(fù)位)的時候,先讀取 BKP_DR1 的值,然后判斷是否是 0X5050 來決定是不是要配置。接著我們配置 RTC 的秒鐘中斷,并進行分組。
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//往備份區(qū)域?qū)懹脩魯?shù)據(jù)
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//讀取備份區(qū)域指定寄存器
(7) 編寫中斷服務(wù)函數(shù)
流程圖:
-
寄存器
+關(guān)注
關(guān)注
31文章
5435瀏覽量
124606 -
STM32
+關(guān)注
關(guān)注
2295文章
11032瀏覽量
365223 -
計數(shù)器
+關(guān)注
關(guān)注
32文章
2291瀏覽量
96445 -
時鐘
+關(guān)注
關(guān)注
11文章
1902瀏覽量
133259
發(fā)布評論請先 登錄
如何去實現(xiàn)STM32的實時時鐘RTC的時間計算部分
RTC是什么?RTC實時時鐘實驗
RTC實時時鐘實驗的相關(guān)資料分享
STM32CubeMX | 40 - 實時時鐘RTC的使用(日歷和鬧鐘)

stm32f4 RTC實時時鐘解析

STM32CubeMX學(xué)習(xí)筆記(14)——RTC實時時鐘使用

STM32CubeMX系列|RTC實時時鐘

STM32學(xué)習(xí)筆記之RTC實時時鐘2

評論