???本次課程采用單片機型號為STM32F103C8T6。
???課程鏈接:江協(xié)科技 STM32入門教程
??往期筆記鏈接:
??STM32學(xué)習(xí)筆記(一)丨建立工程丨GPIO 通用輸入輸出
??STM32學(xué)習(xí)筆記(二)丨STM32程序調(diào)試丨OLED的使用
??STM32學(xué)習(xí)筆記(三)丨中斷系統(tǒng)丨EXTI外部中斷
??STM32學(xué)習(xí)筆記(四)丨TIM定時器及其應(yīng)用(定時中斷、內(nèi)外時鐘源選擇)
??STM32學(xué)習(xí)筆記(五)丨TIM定時器及其應(yīng)用(輸出比較丨PWM驅(qū)動呼吸燈、舵機、直流電機)
??STM32學(xué)習(xí)筆記(六)丨TIM定時器及其應(yīng)用(輸入捕獲丨測量PWM波形的頻率和占空比)
??STM32學(xué)習(xí)筆記(七)丨TIM定時器及其應(yīng)用(編碼器接口丨用定時器實現(xiàn)編碼器測速)
??STM32學(xué)習(xí)筆記(八)丨ADC模數(shù)轉(zhuǎn)換器(ADC單、雙通道轉(zhuǎn)換)
??STM32學(xué)習(xí)筆記(九)丨DMA直接存儲器存取(DMA數(shù)據(jù)轉(zhuǎn)運、DMA+AD多通道轉(zhuǎn)換)
??STM32學(xué)習(xí)筆記(十)丨I2C通信(使用I2C實現(xiàn)MPU6050和STM32之間通信)
??STM32學(xué)習(xí)筆記(十一)丨SPI通信(W25Q64芯片簡介,使用SPI讀寫W25Q64存儲器芯片)
一、計算機底層計時系統(tǒng)——時間戳
1.1 時間戳簡介
??Unix 時間戳(Unix Timestamp)定義為從UTC/GMT的1970年1月1日0時0分0秒開始所經(jīng)過的秒數(shù),不考慮閏秒。
- 時間戳存儲在一個秒計數(shù)器中,秒計數(shù)器為32位/64位的整型變量。
??2038年危機:由于之前的Unix系統(tǒng)采用一個32位的有符號數(shù)來計時,這個計時系統(tǒng)最大的計時時間會在2038年的1月19日溢出,這可能會讓一部分不健全的計算機程序崩潰。STM32的32位秒計數(shù)器是一個無符號的計數(shù)器,在2106年才會溢出。
- 世界上所有時區(qū)的秒計數(shù)器相同,不同時區(qū)通過添加偏移來得到當(dāng)?shù)貢r間。
??可以看到,用時間戳來計時的方法是很簡單粗暴的一種計時方法,但是計算機底層通過時間戳來計時,有以下幾點好處:
- 硬件電路設(shè)計簡單:設(shè)計RTC時,只需要一個很大的秒計數(shù)器即可,不需要年月日、大月小月、平年閏年等寄存器來記錄。
- 計算時間間隔時很方便。
- 存儲方便,只需要一個變量。
??當(dāng)然,使用時間戳計數(shù)器來計時也有一定的缺陷,例如在將秒數(shù)轉(zhuǎn)化為我們熟知的時間格式的時候,需要進行復(fù)雜的計算,比較占用軟件資源。
1.2 GMT/UTC
-
GMT(Greenwich Mean Time)格林尼治標(biāo)準(zhǔn)時間是一種以地球自轉(zhuǎn)為基礎(chǔ)的時間計量系統(tǒng)。它將地球自轉(zhuǎn)一周的時間間隔等分為24小時,以此確定計時標(biāo)準(zhǔn)。但是由于地球自轉(zhuǎn)一周的時間實際上是不固定的,它是越來越慢的,所以這種計時系統(tǒng)已經(jīng)不再適用于現(xiàn)代科學(xué)和社會的發(fā)展。
-
UTC(Universal Time Coordinated)協(xié)調(diào)世界時是一種以原子鐘為基礎(chǔ)的時間計量系統(tǒng)。它規(guī)定銫133原子基態(tài)的兩個超精細(xì)能級間在零磁場下躍遷輻射9,192,631,770周所持續(xù)的時間為1秒。當(dāng)原子鐘計時一天的時間與地球自轉(zhuǎn)一周的時間相差超過0.9秒時,UTC會執(zhí)行閏秒來保證其計時與地球自轉(zhuǎn)的協(xié)調(diào)一致。Unix時間戳不考慮閏秒,所以每產(chǎn)生一個閏秒,國家授時中心的標(biāo)準(zhǔn)時間和時間戳的標(biāo)準(zhǔn)時間就會產(chǎn)生一秒的偏差。
1.3 C語言和time.h庫
???在一系列函數(shù)中,最復(fù)雜的函數(shù)是struct tm* localtime(const time*);
和time_t mktime(struct tm*);
,這兩個函數(shù)也是STM32的RTC編程中需要掌握的函數(shù),所以需要重點掌握,其他的了解即可。
???struct tm* localtime(const time_t*)
函數(shù)的參數(shù)是一個靜態(tài)的指針變量,如果不特殊指定為32位計時系統(tǒng),就默認(rèn)為64位的計時系統(tǒng),所以可以認(rèn)為time_t就是一個64位的int類型的變量。這個函數(shù)的返回值是一個結(jié)構(gòu)體指針,在這個結(jié)構(gòu)體中存放一些時間信息,可以供用戶方便的查看。time_t mktime(struct tm*)
函數(shù)也是同理。
二、STM32的BKP和RTC時鐘
2.1 BKP(Backup Registers)備份寄存器
???BKP可用于存儲用戶應(yīng)用程序數(shù)據(jù)。當(dāng)VDD(2.0 ~ 3.6V)電源被切斷,他們?nèi)匀挥蒝BAT(1.8 ~ 3.6V)維持供電。當(dāng)系統(tǒng)在待機模式下被喚醒,或系統(tǒng)復(fù)位或電源復(fù)位時,他們也不會被復(fù)位
- TAMPER引腳產(chǎn)生的侵入事件將所有備份寄存器內(nèi)容清除
- RTC引腳輸出RTC校準(zhǔn)時鐘(外部設(shè)備測量這個輸出時鐘,可以對內(nèi)部RTC微小的誤差進行校準(zhǔn))、RTC鬧鐘脈沖或者秒脈沖(可以輸出,為別的設(shè)備提供時鐘)
- RTC時鐘校準(zhǔn)寄存器,用于存儲校準(zhǔn)配置
- 用戶數(shù)據(jù)存儲容量:20字節(jié)(中容量和小容量)/ 84字節(jié)(大容量和互聯(lián)型)
???下圖展示了BKP的基本結(jié)構(gòu),橙色部分為后備區(qū)域。BKP是后備區(qū)域中的一部分電路,后備區(qū)域中還有RTC的相關(guān)電路。STM32F103C8T6的VBAT,TAMPER,RTC三個功能復(fù)用在了同一個引腳上,所以這三個功能在同一時間只能使用一個。
2.2 RTC(Real Time Clock)實時時鐘
2.2.1 RTC簡介
- RTC是一個獨立的定時器,可為系統(tǒng)提供時鐘和日歷的功能
- RTC和時鐘配置系統(tǒng)處于后備區(qū)域,系統(tǒng)復(fù)位時數(shù)據(jù)不清零,VDD(2.0 ~ 3.6V)斷電后可借助VBAT(1.8 ~ 3.6V)供電繼續(xù)走時
- 32位的可編程計數(shù)器,可對應(yīng)Unix時間戳的秒計數(shù)器
- 20位的可編程預(yù)分頻器(分頻系數(shù)可以為1到 2 20 2^{20} 220),可適配不同頻率的輸入時鐘
- 可選擇三種RTC時鐘源:
- HSE(高速外部時鐘)時鐘除以128(通常為8MHz/128)
- LSE(低速外部時鐘)振蕩器時鐘(通常為32.768KHz),只有這一路的時鐘可以由VBAT供電,所以如果要實現(xiàn)掉電自動走時的功能,必須使用這一路時鐘
- LSI(低速內(nèi)部時鐘)振蕩器時鐘(40KHz)
時鐘信號選擇32.768kHz的原因:
- 32.768kHz對于晶振或振蕩器的,在硬件設(shè)計或者工業(yè)生產(chǎn)時可能會有一些便利,使這一頻率的晶振或振蕩器穩(wěn)定性高,益于生產(chǎn);
- 32768恰好為2的15次方,如果要產(chǎn)生一個1Hz的信號供RTC計時,可以簡單地設(shè)計一個15位的計數(shù)器,讓其不斷計時,它的自然溢出頻率就是1Hz,不用額外設(shè)計計數(shù)器的目標(biāo)值存儲寄存器,也不用把計數(shù)值和目標(biāo)值不斷作比較,對于芯片內(nèi)部的電路設(shè)計非常友好。
2.2.2 RTC的內(nèi)部結(jié)構(gòu)及工作原理
???上圖展示了RTC的內(nèi)部框圖和工作原理?;疑牟糠譃楹髠鋮^(qū)域,在主電源斷電時可以由VBAT供電繼續(xù)工作。RTC_DIV余數(shù)寄存器是一個自減計數(shù)器。自建到0后,在下一個上升沿到來時產(chǎn)生溢出信號,并江RTC_PRL中的值裝載進來繼續(xù)自減。
???RTC電路可以產(chǎn)生三個中斷信號:
- RTC_Second秒中斷:每秒產(chǎn)生一個中斷信號。
- RTC_Overflow溢出中斷:這個中斷會在2106年觸發(fā)一次。
- RTC_Alarm鬧鐘中斷:該中斷可以讓STM32從待機模式中喚醒,并且執(zhí)行一個中斷服務(wù)函數(shù)。這可以實現(xiàn)讓STM32在一些環(huán)境惡劣的地方工作,在節(jié)約電量的前提下自動執(zhí)行定時采集數(shù)據(jù)的功能。
???實際設(shè)計的硬件電路及推薦電路如下圖所示:
2.2.3 RTC操作及注意事項
-
依次執(zhí)行以下操作將使能對BKP和RTC的訪問:
- 設(shè)置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP時鐘(需要同時開啟PWR和BKP的時鐘,RTC才能正常使用,RTC并沒有單獨開啟時鐘的函數(shù))
- 設(shè)置PWR_CR的DBP,使能對BKP和RTC的訪問
- 若在讀取RTC寄存器時,RTC的APB1接口曾經(jīng)處于禁止?fàn)顟B(tài),則軟件首先必須等待RTC_CRL寄存器中的RSF位(寄存器同步標(biāo)志)被硬件置1(RTC等待同步):由于PCLK1的時鐘頻率36MHz遠大于RTCCLK,有可能在上電開啟時,RTC的寄存器還沒有更新到APB1總線上,這時將發(fā)生讀取錯誤(讀取到的值為0)。實際使用時調(diào)用一個RTC等待同步的庫函數(shù)即可。
- 必須設(shè)置RTC_CRL寄存器中的CNF位,使RTC進入配置模式后,才能寫入RTC_PRL、RTC_CNT、RTC_ALR寄存器(庫函數(shù)中已經(jīng)包含)
- 對RTC任何寄存器的寫操作,都必須在前一次寫操作結(jié)束后進行??梢酝ㄟ^查詢RTC_CR寄存器中的RTOFF狀態(tài)位,判斷RTC寄存器是否處于更新中。僅當(dāng)RTOFF狀態(tài)位是1時,才可以寫入RTC寄存器(調(diào)用一個等待的庫 函數(shù)即可)
???課程鏈接:江協(xié)科技 STM32入門教程,歡迎大家一起交流學(xué)習(xí)。
???持續(xù)更新完善中……文章來源:http://www.zghlxwxcb.cn/news/detail-596846.html
??原創(chuàng)筆記,碼字不易,歡迎點贊,收藏~ 如有謬誤敬請在評論區(qū)不吝告知,感激不盡!博主將持續(xù)更新有關(guān)嵌入式開發(fā)、機器學(xué)習(xí)方面的學(xué)習(xí)筆記~文章來源地址http://www.zghlxwxcb.cn/news/detail-596846.html
到了這里,關(guān)于STM32學(xué)習(xí)筆記(十二)丨RTC實時時鐘的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!