一、RTC 簡介
RTC(Real Time Clock)即實時時鐘,本質上是一個 32 位的秒級計數器:
-
最大計數值為
4294967295
秒,約合 136 年:復制編輯
4294967295 / 60 / 60 / 24 / 365 ≈ 136 年
-
RTC 初始化時,主要配置兩項:
-
時鐘源(決定 1 秒的基準周期)
-
計數器初值(轉換為日期 + 時間)
-
RTC 表現形式對比
MCU型號 | 表現形式 |
---|---|
STM32F103 | 僅提供一個以秒為單位的數值,由軟件完成時間轉換 |
STM32F407 | 硬件直接提供時間和日期寄存器 |
二、RTC 模塊特性
-
可編程的 預分頻系數,最大支持 2^20。
-
32 位計數器,用于長時間測量。
-
支持三種 RTC 時鐘源:
-
HSE / 128
-
LSE(32.768KHz)→ 1Hz
-
LSI
-
-
兩種獨立復位機制:
-
APB1 接口系統復位
-
RTC 核心(后備域)復位
-
-
三種中斷:
-
鬧鐘中斷(Alarm)
-
秒中斷(每秒觸發)
-
溢出中斷(計數器回到0)
-
三、RTC 架構簡析
RTC 模塊主要由兩部分構成:
-
APB1 接口部分
-
與 MCU 通信,通過一組 16 位寄存器控制 RTC 配置。
-
由 PCLK1 驅動。
-
-
RTC 核心部分
-
預分頻器模塊:產生 1 秒基準時鐘
TR_CLK
-
計數器模塊:32 位,累加系統時間,支持鬧鐘中斷比較
-
四、RTC 初始化流程(STM32F1 示例)
-
使能 PWR、BKP 時鐘:
RCC_APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;
-
允許訪問后備寄存器:
PWR->CR |= PWR_CR_DBP;
-
復位備份域:
RCC->BDCR |= RCC_BDCR_BDRST; RCC->BDCR &= ~RCC_BDCR_BDRST;
-
打開并等待 LSE 時鐘穩定:
RCC->BDCR |= RCC_BDCR_LSEON; while (!(RCC->BDCR & RCC_BDCR_LSERDY));
-
選擇 LSE 為 RTC 時鐘源:
RCC->BDCR |= RCC_BDCR_RTCSEL_LSE;
-
啟用 RTC 時鐘:
RCC->BDCR |= RCC_BDCR_RTCEN;
-
等待上一次寫操作完成(RTOFF = 1)
-
等待寄存器同步(RSF = 1)
-
進入配置模式(CNF = 1)
-
配置分頻器和時間值:
RTC->PRLH = ...; RTC->PRLL = ...; RTC->CNTH = ...; RTC->CNTL = ...;
-
退出配置模式(CNF = 0)
-
等待寫操作完成(RTOFF = 1)
五、RTC 讀寫注意事項
寫操作流程
-
等待
RTOFF = 1
(前一次寫完成) -
設置
CNF = 1
(進入配置模式) -
寫入目標寄存器(如 PRL、CNT、ALR)
-
清除
CNF = 0
(退出配置模式) -
等待
RTOFF = 1
(確認寫操作完成)
每次寫入至少需要等待 3 個
RTCCLK
周期。
讀操作注意事項
RTC 核心獨立于 APB1 接口,RTC 內部值在 RTC 時鐘上升沿同步 到 APB1 接口:
-
若系統曾關閉 APB1 時鐘,第一次讀取值可能無效(常為0)
-
必須等待
RSF = 1
(寄存器同步完成)后再讀數據
情況示例:復位后 / 停機喚醒后 / APB1重新打開
六、RTC 寄存器說明
寄存器名 | 描述 | 復位方式 |
---|---|---|
RTC_CNT | 當前計數值(時間) | 后備復位 |
RTC_PRL | 分頻器設定 | 后備復位 |
RTC_ALR | 鬧鐘時間值 | 后備復位 |
其他寄存器 | 配置與控制 | 系統復位 |
七、總結
RTC 模塊作為獨立的低功耗定時單元,在低功耗應用中非常重要。STM32 的 RTC 模塊可實現秒級定時、鬧鐘中斷、時間持久化(VBAT 支持)等功能。