0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文看懂RTC實時時鐘

硬件攻城獅 ? 來源:CSDN-Z小旋 ? 2023-06-16 12:24 ? 次閱讀

什么是RTC

RTC (Real Time Clock):實時時鐘

RTC是個獨立的定時器。RTC模塊擁有一個連續(xù)計數(shù)的計數(shù)器,在相應(yīng)的軟件配置下,可以提供時鐘日歷的功能。修改計數(shù)器的值可以重新設(shè)置當(dāng)前時間和日期 RTC還包含用于管理低功耗模式的自動喚醒單元。

在斷電情況下 RTC仍可以獨立運行 只要芯片的備用電源一直供電,RTC上的時間會一直走。

RTC實質(zhì)是一個掉電后還繼續(xù)運行的定時器,從定時器的角度來看,相對于通用定時器TIM外設(shè),它的功能十分簡單,只有計時功能(也可以觸發(fā)中斷)。但其高級指出也就在于掉電之后還可以正常運行。

兩個 32 位寄存器包含二進碼十進數(shù)格式 (BCD) 的秒、分鐘、小時( 12 或 24 小時制)、星期幾、日期、月份和年份。此外,還可提供二進制格式的亞秒值。系統(tǒng)可以自動將月份的天數(shù)補償為 28、29(閏年)、30 和 31 天。

上電復(fù)位后,所有RTC寄存器都會受到保護,以防止可能的非正常寫訪問。

無論器件狀態(tài)如何(運行模式、低功耗模式或處于復(fù)位狀態(tài)),只要電源電壓保持在工作范圍內(nèi),RTC使不會停止工作。

RCT特征:

編程的預(yù)分頻系數(shù):分頻系數(shù)高為220。

32位的可編程計數(shù)器,可用于較長時間段的測量。

2個分離的時鐘:用于APB1接口的PCLK1和RTC時鐘(RTC時鐘的頻率必須小于PCLK1時鐘 頻率的四分之一以上)。

可以選擇以下三種RTC的時鐘源:

HSE時鐘除以128;

LSE振蕩器時鐘;

LSI振蕩器時鐘

2個獨立的復(fù)位類型:

APB1接口由系統(tǒng)復(fù)位;

RTC核心(預(yù)分頻器、鬧鐘、計數(shù)器和分頻器)只能由后備域復(fù)位

3個專門的可屏蔽中斷:

1.鬧鐘中斷,用來產(chǎn)生一個軟件可編程的鬧鐘中斷。

2.秒中斷,用來產(chǎn)生一個可編程的周期性中斷信號(長可達1秒)。

3.溢出中斷,指示內(nèi)部可編程計數(shù)器溢出并回轉(zhuǎn)為0的狀態(tài)。

RTC時鐘源:

三種不同的時鐘源可被用來驅(qū)動系統(tǒng)時鐘(SYSCLK):

HSI振蕩器時鐘

HSE振蕩器時鐘

PLL時鐘

這些設(shè)備有以下2種二級時鐘源:

40kHz低速內(nèi)部RC,可以用于驅(qū)動獨立看門狗和通過程序選擇驅(qū)動RTC。RTC用于從停機/待機模式下自動喚醒系統(tǒng)。

32.768kHz低速外部晶體也可用來通過程序選擇驅(qū)動RTC(RTCCLK)。

RTC原理框圖

eb8406ba-0bfb-11ee-962d-dac502259ad0.png

RTC時鐘的框圖還是比較簡單的,這里我們把他分成 兩個部分:

APB1 接口:用來和 APB1 總線相連。此單元還包含一組 16 位寄存器,可通過 APB1 總線對其進行讀寫操作。APB1 接口由 APB1 總 線時鐘驅(qū)動,用來與 APB1 總線連接。

通過APB1接口可以訪問RTC的相關(guān)寄存器(預(yù)分頻值,計數(shù)器值,鬧鐘值)。

RTC 核心接口:由一組可編程計數(shù)器組成,分成 兩個主要模塊 。

eba70dd6-0bfb-11ee-962d-dac502259ad0.png

第一個模塊是 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)生一個中斷(秒中斷)。

ebb2a056-0bfb-11ee-962d-dac502259ad0.png

第二個模塊是一個 32 位的可編程計數(shù)器 (RTC_CNT),可被初始化為當(dāng)前的系統(tǒng)時間,一個 32 位的時鐘計數(shù)器,按秒鐘計算,可以記 錄 4294967296 秒,約合 136 年左右,作為一般應(yīng)用,這已經(jīng)是足夠了的。

RTC具體流程:

RTCCLK經(jīng)過RTC_DIV預(yù)分頻,RTC_PRL設(shè)置預(yù)分頻系數(shù),然后得到TR_CLK時鐘信號,我們一般設(shè)置其周期為1s,RTC_CNT計數(shù)器計數(shù),假如1970設(shè)置為時間起點為0s,通過當(dāng)前時間的秒數(shù)計算得到當(dāng)前的時間。RTC_ALR是設(shè)置鬧鐘時間,RTC_CNT計數(shù)到RTC_ALR就會產(chǎn)生計數(shù)中斷,

RTC_Second為秒中斷,用于刷新時間,

RTC_Overflow是溢出中斷。

RTC Alarm 控制開關(guān)機

RTC時鐘選擇

使用HSE分頻時鐘或者LSI的時候,在主電源VDD掉電的情況下,這兩個時鐘來源都會受到影響,因此沒法保證RTC正常工作。所以RTC一般都時鐘低速外部時鐘LSE,頻率為實時時鐘模塊中常用的32.768KHz,因為32768 = 2^15,分頻容易實現(xiàn),所以被廣泛應(yīng)用到RTC模塊。(在主電源VDD有效的情況下(待機),RTC還可以配置鬧鐘事件使STM32退出待機模式)。

RTC復(fù)位過程

除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系統(tǒng)寄存器都由系統(tǒng)復(fù)位或電源復(fù)位進行異步復(fù)位。

RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器僅能通過備份域復(fù)位信號復(fù)位。

系統(tǒng)復(fù)位后,禁止訪問后備寄存器和RCT,防止對后衛(wèi)區(qū)域(BKP)的意外寫操作

讀RTC寄存器

RTC內(nèi)核完全獨立于APB1接口,軟件通過APB1接口對RTC相關(guān)寄存器訪問。但是相關(guān)寄存器只在RTC APB1時鐘進行重新同步的RTC時鐘的上升沿被更新。所以軟件必須先等待寄存器同步標(biāo)志位(RTC_CRL的RSF位)被硬件置1才讀。

配置RTC寄存器

必須設(shè)置RTC_CRL寄存器中的CNF位,使RTC進入配置模式后,才能寫入RTC_PRL、

RTC_CNT、RTC_ALR寄存器。

另外,對RTC任何寄存器的寫操作,都必須在前一次寫操作結(jié)束后進行。可以通過查詢

RTC_CR寄存器中的RTOFF狀態(tài)位,判斷RTC寄存器是否處于更新中。僅當(dāng)RTOFF狀態(tài)位是’1’

時,才可以寫入RTC寄存器。

RTC時鐘源

RTC是一個獨立的時鐘源

ebcc3778-0bfb-11ee-962d-dac502259ad0.png

RTC寄存器

RTC控制寄存器 (RTC_CRH, RTC_CRL)

RTC預(yù)分頻裝載寄存器 (RTC_PRLH, RTC_PRLL)

RTC預(yù)分頻余數(shù)寄存器 (RTC_DIVH, RTC_DIVL)

RTC計數(shù)器寄存器 (RTC_CNTH, RTC_CNTL)

RTC鬧鐘寄存器 (RTC_ALRH ,RTC_ALRL)

RTC控制寄存器高位——RTC_CRH 寄存器

ec0e75ac-0bfb-11ee-962d-dac502259ad0.png

作用:配置3個專門的可屏蔽中斷(溢出中斷、鬧鐘中斷、秒中斷)使能。

注意:系統(tǒng)復(fù)位后所有的中斷被屏蔽,因此可通過寫RTC寄存器來

確保在初始化后沒有掛起的中斷請求。當(dāng)外設(shè)正在完成前一次寫操作時(標(biāo)志位RTOFF=0),不

能對RTC_CRH寄存器進行寫操作。

RTC控制寄存器低位——RTC_CRL 寄存器

ec1a07d2-0bfb-11ee-962d-dac502259ad0.png

一般用到該寄存器的 3,4,5位

第 3 位為寄存器同步標(biāo)志位,我們在修改控制寄存器 RTC_CRH/CRL 之前,必須先判斷該位,是否已經(jīng)同步了,如果沒有則等待同步

第 4 位為配置標(biāo)位,在軟件修改 RTC_CNT/RTC_ALR/RTC_PRL 的值的時候,必須先軟件置位該位,以允許進入配置模式

第 5 位為 RTC 操作位,該位由硬件操作,軟件只讀。通過該位可以判斷上次對 RTC 寄存器的操作是否完成,如果沒有,我們必須等待上一次操作結(jié)束才能開始下一次,也就是判斷RTOFF位是否置位。

三個位總結(jié)如下:

① 修改CRH/CRL寄存器,必須先判斷RSF位,確定已經(jīng)同步。

② 修改CNT,ALR,PRL的時候,必須先配置CNF位進入配置模式,修改完之后,設(shè)置CNF位為0退出配置模式

③ **同時在對RTC相關(guān)寄存器寫操作之前,必須判斷上一

ec5612d6-0bfb-11ee-962d-dac502259ad0.png

RTC 預(yù)分頻裝載寄存器——(RTC_PRLH/RTC_PRLL) 寄存器

作用:配置 RTC 時鐘的分頻數(shù),

比如我們使用外部 32.768K 的晶振作為時鐘的輸入頻率,那么我們要設(shè)置這兩個寄存器的值為 7FFFh(32767),就可獲得周期為1秒鐘的信號。

ec5612d6-0bfb-11ee-962d-dac502259ad0.png

RTC預(yù)分頻器余數(shù)寄存器(RTC_DIVH、RTC_DIVL)

作用:和他的名字一樣,獲得余數(shù),也就是獲取更精確的計時,比如:0.1s ,0.01 s等

ecb72300-0bfb-11ee-962d-dac502259ad0.png

寄存器是只讀寄存器,其值在RTC_PRL或RTC_CNT寄存器中的值發(fā)生改變后,由硬件重新裝載。

RTC 計數(shù)器寄存器——RTC_CNTX 寄存器

作用:存放計數(shù)器內(nèi)的計數(shù)值。也就是用來記錄時鐘時間

ece46932-0bfb-11ee-962d-dac502259ad0.png

該寄存器由 2 個 16 位的寄存器組成 RTC_CNTH 和 RTC_CNTL,總共 32 位,當(dāng)進行讀操作時,直接返回計數(shù)器內(nèi)的計數(shù)值(系統(tǒng)時間)

ed155542-0bfb-11ee-962d-dac502259ad0.png

RTC 計數(shù)器寄存器——RTC 鬧鐘寄存器(RTC_ALRH、RTC_ALRL)

作用:RTC時鐘中斷控制寄存器

該寄存器也是由 2 個 16 位的寄存器組成 RTC_ALRH 和 RTC_ALRL,也就是32位,當(dāng)可編程計數(shù)器的值與RTC_ALR中的32位值相等時,即觸發(fā)一個鬧鐘事件,并且產(chǎn)生RTC鬧鐘中斷。

ed155542-0bfb-11ee-962d-dac502259ad0.png

BKP備份寄存器

備份寄存器是42個16位的寄存器??捎脕泶鎯?4個字節(jié)數(shù)據(jù)。

它們處在備份區(qū)域,當(dāng)VDD電源切斷,仍然由VBAT維持供電。

當(dāng)系統(tǒng)在待機模式下被喚醒,或者系統(tǒng)復(fù)位或者電源復(fù)位,它們也不會復(fù)位。

執(zhí)行以下操作將使能對后備寄存器和RTC訪問:

設(shè)置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能電源和后備時鐘。

設(shè)置寄存器PWR_CR的DBP位,使能對RTC和后備寄存器的訪問

一般用 BKP 來存儲 RTC 的校驗值或者記錄一些重要的數(shù)據(jù),

ed601226-0bfb-11ee-962d-dac502259ad0.png

配置RTC寄存器:

1.查詢RTOFF位,知道RTOFF的值為1.

2.置CNF值為1,進入配置模式。

3.對一個或者多個RTC寄存器進行寫操作。

4.清除CNF標(biāo)志位,退出配置模式。

5.查詢RTOFF,直到RTOFF位變1,已確認寫操作已經(jīng)完成。

僅當(dāng)CNF標(biāo)志位被清除時,寫操作才能進行,這個操作至少需要3個RTCCLK周期。

RTC相關(guān)庫函數(shù)

RTC時鐘源和時鐘操作函數(shù):

void RCC_RTCCLKConfig(uint32_t CLKSource);//時鐘源選擇

void RCC_RTCCLKCmd(FunctionalState NewState)//時鐘使能

RTC配置函數(shù)(預(yù)分頻,計數(shù)值):

void RTC_SetPrescaler(uint32_t PrescalerValue);//預(yù)分頻配置:PRLH/PRLL

void RTC_SetCounter(uint32_t CounterValue);//設(shè)置計數(shù)器值:CNTH/CNTL

void RTC_SetAlarm(uint32_t AlarmValue);//鬧鐘設(shè)置:ALRH/ALRL

RTC中斷設(shè)置函數(shù):

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH

RTC配置函數(shù):

void RTC_EnterConfigMode(void);//允許RTC配置 :CRL位 CNF

void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF

RTC同步函數(shù):

void RTC_WaitForLastTask(void);//等待上次操作完成:CRL位RTOFF

void RTC_WaitForSynchro(void);//等待時鐘同步:CRL位RSF

RTC相關(guān)狀態(tài)位獲取清除函數(shù):

FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);

void RTC_ClearFlag(uint16_t RTC_FLAG);

ITStatus RTC_GetITStatus(uint16_t RTC_IT);

void RTC_ClearITPendingBit(uint16_t RTC_IT);

其他相關(guān)函數(shù)(BKP等)

PWR_BackupAccessCmd();//BKP后備區(qū)域訪問使能

RCC_APB1PeriphClockCmd();//使能PWR和BKP時鐘

RCC_LSEConfig();//開啟LSE,RTC選擇LSE作為時鐘源

PWR_BackupAccessCmd();//BKP后備區(qū)域訪問使能

uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//讀BKP寄存器

void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//寫B(tài)KP

配置RTC步驟

①使能PWR和BKP時鐘:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

1

② 使能后備寄存器訪問:

PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后備寄存器訪問

1

③復(fù)位備份區(qū)域,開啟外部低速振蕩器。

BKP_DeInit();//復(fù)位備份區(qū)域

1

④ 配置RTC時鐘源,使能RTC時鐘:

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇 LSE 作為 RTC 時鐘(RCC_RTCCLKSource_LSI 和 RCC_RTCCLKSource_HSE_Div128)

RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘

⑤ 設(shè)置RTC預(yù)分頻系數(shù):RTC_SetPrescaler();

RTC_EnterConfigMode();/// 允許配置

RTC_SetPrescaler(32767); //設(shè)置RTC預(yù)分頻的值

RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成

⑥ 設(shè)置時間:RTC_SetCounter();

RTC_EnterConfigMode();/// 允許配置

void RTC_SetCounter(uint32_t CounterValue);

RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成

⑦開啟相關(guān)中斷(可選):

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中斷

⑧編寫中斷服務(wù)函數(shù):

RTC_IRQHandler();

⑨部分操作要等待寫操作完成和同步。

RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成

RTC_WaitForSynchro();//等待RTC寄存器同步

具體的代碼,庫函數(shù)寫的太多了,我會用CubeMx配置下,用HAL庫寫一個例程,幾十行就可以解決RTC。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 振蕩器
    +關(guān)注

    關(guān)注

    28

    文章

    3786

    瀏覽量

    138724
  • 實時時鐘
    +關(guān)注

    關(guān)注

    4

    文章

    233

    瀏覽量

    65606
  • 時鐘
    +關(guān)注

    關(guān)注

    10

    文章

    1700

    瀏覽量

    131180
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3226

    瀏覽量

    114143
  • RTC
    RTC
    +關(guān)注

    關(guān)注

    2

    文章

    515

    瀏覽量

    66118

原文標(biāo)題:一文看懂RTC

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    STM32 RTC實時時鐘

    STM32處理器內(nèi)部集成了實時時鐘控制器(RTC),因此在實現(xiàn)實時時鐘功能時,無須外擴時鐘芯片即可構(gòu)建實時時鐘系統(tǒng)。
    的頭像 發(fā)表于 07-22 15:41 ?4407次閱讀
    STM32 <b class='flag-5'>RTC</b><b class='flag-5'>實時時鐘</b>(<b class='flag-5'>一</b>)

    rtc實時時鐘和單片機時鐘有什么區(qū)別

    =1s?! 、劢?jīng)過工程師的經(jīng)驗總結(jié)32768Hz,時鐘最準(zhǔn)確?! 、芤?guī)范和統(tǒng)。看懂rtc
    發(fā)表于 06-06 04:22

    什么是實時時鐘RTC)?如何更改RTC的時間?

    什么是實時時鐘RTC)?實時時鐘RTC)的基本功能是什么?實時時鐘RTC)晶體誤差的主要來
    發(fā)表于 07-19 08:44

    實時時鐘(RTC)概述

    實時時鐘(RTC)概述RTC(real-time clock),實時時鐘個獨立的時鐘,
    發(fā)表于 08-03 06:33

    讀懂RTC實時時鐘是什么

    RTC是什么?RTC芯片有哪些應(yīng)用?RTC芯片的硬件結(jié)構(gòu)是由哪些部分組成的?RTC實時時鐘的作用是什么?
    發(fā)表于 08-24 07:39

    RTC是什么?RTC實時時鐘實驗

    文章目錄前言、RTC是什么?二、RTC實時時鐘實驗1.引入庫2.讀入數(shù)據(jù)總結(jié)前言前面我們說了OLED實驗,是個比較好的顯示測試代碼的方法
    發(fā)表于 01-13 07:19

    RTC實時時鐘怎么使用?

    RTC實時時鐘怎么使用?cubemx中如何配置RTC?如何在keil中編寫程序?
    發(fā)表于 01-18 07:33

    看懂rtc實時時鐘和單片機時鐘的區(qū)別

    本文首先闡述了rtc實時時鐘和單片機時鐘的區(qū)別,其次介紹了單片機中時鐘概念與單片機內(nèi)外部時鐘方式,最后介紹了
    的頭像 發(fā)表于 05-14 15:48 ?6.1w次閱讀

    淺談RTC實時時鐘特征與原理

    、RTC實時時鐘特征與原理 查看STM32中手冊 16 實時時鐘RTC)(308頁)
    的頭像 發(fā)表于 06-30 15:54 ?1.1w次閱讀

    STM32CubeMX | 40 - 實時時鐘RTC的使用(日歷和鬧鐘)

    STM32CubeMX | 40 - 實時時鐘RTC的使用(日歷和鬧鐘)
    發(fā)表于 11-23 18:06 ?19次下載
    STM32CubeMX | 40 - <b class='flag-5'>實時時鐘</b><b class='flag-5'>RTC</b>的使用(日歷和鬧鐘)

    STM32CubeMX系列|RTC實時時鐘

    RTC實時時鐘1. RTC實時時鐘簡介2. 硬件設(shè)計3. 軟件設(shè)計3.1 STM32CubeMX設(shè)置3.2 MDK-ARM編程4. 下載驗證
    發(fā)表于 12-24 19:15 ?16次下載
    STM32CubeMX系列|<b class='flag-5'>RTC</b><b class='flag-5'>實時時鐘</b>

    DA1468x SoC 的實時時鐘(RTC) 概念

    DA1468x SoC 的實時時鐘 (RTC) 概念
    發(fā)表于 03-15 20:16 ?0次下載
    DA1468x SoC 的<b class='flag-5'>實時時鐘</b>(<b class='flag-5'>RTC</b>) 概念

    DA1468x SoC 的實時時鐘(RTC) 概念

    DA1468x SoC 的實時時鐘 (RTC) 概念
    發(fā)表于 07-06 19:27 ?0次下載
    DA1468x SoC 的<b class='flag-5'>實時時鐘</b>(<b class='flag-5'>RTC</b>) 概念

    CW32實時時鐘RTC)介紹

    CW32實時時鐘RTC)介紹
    的頭像 發(fā)表于 10-24 15:36 ?1016次閱讀
    CW32<b class='flag-5'>實時時鐘</b>(<b class='flag-5'>RTC</b>)介紹

    RTC實時時鐘的基本概念和工作原理

    在現(xiàn)代電子設(shè)備中,精確的時間管理和控制是至關(guān)重要的。為了實現(xiàn)這功能,實時時鐘RTC, Real-Time Clock)模塊被廣泛應(yīng)用于各種設(shè)備和系統(tǒng)中。RTC模塊作為
    的頭像 發(fā)表于 05-27 15:43 ?3076次閱讀