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