【STM32+cubemx】0009 HAL庫開發:RTC實時時鍾的使用、掉電時間保持


RTC (Real Time Clock)即實時時鍾。它可以提供時鍾、日歷的功能;並且可以使用外部電池供電,在極低的功耗下保持計數,使得斷電之后還能夠計算時間,所以名為實時時鍾。

STM32f103的RTC,本質上是一個32位的計數器,在斷電后,由電池供電還能保持計數;要使用時間時,需要將計數器的值換算成日期和時間。

此外,stm32的RTC還具備后備存儲區,可以利用電池供電,保存10個16bit的數據。

1)cubemx中配置RTC

我們在之前的串口中斷工程上修改,以便於打印數值查看。

使用cubemx打開串口中斷的工程,然后另存為RTC工程,增加如下設置,啟用RTC,勾選時鍾源、日歷、以及RTC OUT:

(注意這里選擇RTC OUT輸出時,固定是PC13引腳,如果我們之前的工程中設置了PC13引腳,要先設為reset模式,再選RTC OUT)

設置RTC的初始時間:

(其實這里設置的用處不大,一般都要設置成當前的時間,所以一般都會在程序運行后,輸入當前的時間再設置)

接着,設置RTC的時鍾,切換到clock configuration 選項卡,如下設置,選擇外部的低速時鍾:

這里選擇外部時鍾是因為,內部的RC振盪器精度較低;而如果使用主時鍾(高速時鍾)分頻后作為時鍾源功耗較大;一般RTC要求掉電還能運行,需要低功耗。

設置完成后,就可以生成工程代碼了。

2)keil中的程序編寫

Keil中打開工程,在rtc.c文件中,我們可以看到RTC的初始時間是通過如下方式設置的,

有需要的時候,我們可以仿照這部分代碼重新設置時間:

在main.c中添加如下代碼,編譯、下載、運行,可見右下角的串口打印信息:

這個程序先定義了兩個結構體,用來作為保存日期和時間的臨時變量;然后通過重定向后的串口打印輸出。每秒鍾打印一次,可以看到輸出時間和日期能自動進位、更新。

3)RTC時間的掉電保持

通過上面的配置,我們已經可以設置RTC開始運行,但是,這個程序還很不實用;每次掉電、上電重啟都會重新設置為初始時間;這完全不能發揮RTC的特點。

要想RTC在掉電后仍能繼續計時、再次上電后還能保持准確的時間,需要軟硬件兩方面的支持。

首先,硬件上,VBAT引腳上必須連接電池,一般我們使用3V的紐扣電池,以使得斷電后電池能為RTC供電,繼續計時。

其次,軟件上,需要修改HAL庫代碼,這里詳細說說軟件改寫這一步。

Cubemx(5.10)生成的RTC HAL庫代碼,有不完善的地方,主要體現在日期的存儲和時間的存儲是分開的;日期的存儲是在一個普通的RAM變量(就是HAL庫中DateToUpdate這個全局變量)中,它每次在累計到滿一天時,就會將日期存儲(DateToUpdate)變量加1,然后將rtc的計數器清0;這樣使用在不掉電時是沒有什么問題的,但是一旦掉電,存儲日期的變量(DateToUpdate)不能保持,會被置為初始值,而時間每次都是從rtc計數器中讀取,這就導致掉電重啟后,日期變成了2000/01/01,而時間還在正常繼續累加

正因為這個每次日期進位的清rtc計數器操作,使得原本連續的rtc計數變得不連續,因而僅僅從rtc計數器中無法恢復時間。

有些網友的辦法是,將日期值存在后備存儲器中,這樣掉電后再讀取時可以恢復,但是如果掉電時間超過了一天,讀回的日期會是前一天存儲的,也不能保證完全正確。

比較徹底的解決辦法是不用HAL庫的時間設置和時間獲取函數,把這套函數完全重寫。主要的兩個函數如下,就是設置時間和獲取時間的函數,把日期和時間看作一個整體。

設置時間時,由日期和時間換算成秒,再寫入rtc計數器:

獲取時間時,讀取rtc計數器,再由秒數換算成年月日時分秒:

實際上,rtc計數器有32位,每秒增1的話可以計時130多年不溢出,足夠一般的使用了。

另外,還需要在MX_RTC_Init()函數中添加代碼,如下:

這一段是讀取后備存儲區中的內容,然后對比是否與特定的RTC_unique_ID一致,如果不一致,則設置一個當前的時間初值,並將RTC_unique_ID寫入后備存儲區;如果一致,則說明初值已經被設置過,直接返回,不再執行HAL庫函數中設置RTC時間的操作。

這樣就設置完了,之后可以調用獲取時間的函數了:

運行結果如下,可以看到中間斷電了26分鍾,有電池為VBAT供電,再次給系統加電時,時間和日期都能正確獲取。

好了,這一節的內容基本講完了,主要講了RTC相關的知識,要想掉電后還能正確恢復時間,HAL庫函數需要大改;此外,RTC的后備存儲器,可以利用電池供電存儲一些掉電需要保存的數據。

歡迎關注我的公眾號,可留言“資料”獲取相關資料和軟件:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM