實時時鐘(RTC)
小容量產(chǎn)品是指閃存存儲器容量在16K至32K字節(jié)之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
中容量產(chǎn)品是指閃存存儲器容量在64K至128K字節(jié)之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
大容量產(chǎn)品是指閃存存儲器容量在256K至512K字節(jié)之間的STM32F101xx和STM32F103xx微控制器。
互聯(lián)型產(chǎn)品是指STM32F105xx和STM32F107xx微控制器。
主要特性
● 可編程的預(yù)分頻系數(shù):分頻系數(shù)最高為20 。
● 32位的可編程計數(shù)器,可用于較長時間段的測量。
● 2個分離的時鐘:用于APB1接口的PCLK1和RTC時鐘(RTC時鐘的頻率必須小于PCLK1時鐘頻率的四分之一以上)。
● 可以選擇以下三種RTC的時鐘源:
─ HSE時鐘除以128;
─ LSE振蕩器時鐘;
─ LSI振蕩器時鐘
● 2個獨(dú)立的復(fù)位類型:
─ APB1接口由系統(tǒng)復(fù)位;
─ RTC核心(預(yù)分頻器、鬧鐘、計數(shù)器和分頻器)只能由后備域復(fù)位。
● 3個專門的可屏蔽中斷:
─ 鬧鐘中斷,用來產(chǎn)生一個軟件可編程的鬧鐘中斷。
─ 秒中斷,用來產(chǎn)生一個可編程的周期性中斷信號(最長可達(dá)1秒)。
─ 溢出中斷,指示內(nèi)部可編程計數(shù)器溢出并回轉(zhuǎn)為0的狀態(tài)。
STM32 RTC 時鐘簡介
STM32 的實時時鐘(RTC)是一個獨(dú)立的定時器。STM32 的 RTC 模塊擁有一組連續(xù)計數(shù)的計數(shù)器,在相應(yīng)軟件配置下,可提供時鐘日歷的功能。修改計數(shù)器的值可以重新設(shè)置系統(tǒng)當(dāng)前的時間和日期。
RTC 模塊和時鐘配置系統(tǒng)(RCC_BDCR 寄存器)是在后備區(qū)域,即在系統(tǒng)復(fù)位或從待機(jī)模式喚醒后 RTC 的設(shè)置和時間維持不變。但是在系統(tǒng)復(fù)位后,會自動禁止訪問后備寄存器和 RTC,以防止對后備區(qū)域(BKP)的意外寫操作。所以在要設(shè)置時間之前, 先要取消備份區(qū)域(BKP)寫保護(hù)。
RTC 由兩個主要部分組成(參見上圖 ),第一部分(APB1 接口)用來和 APB1 總線相連。此單元還包含一組 16 位寄存器,可通過 APB1 總線對其進(jìn)行讀寫操作。APB1 接口由 APB1 總線時鐘驅(qū)動,用來與 APB1 總線連接。
另一部分(RTC 核心)由一組可編程計數(shù)器組成,分成兩個主要模塊。第一個模塊是 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)生一個中斷(秒中斷)。第二個模塊是一個 32 位的可編程計數(shù)器,可被初始化為當(dāng)前的系統(tǒng)時間,一個 32 位的時鐘計數(shù)器,按秒鐘計算,可以記錄 4294967296 秒,約合 136 年左右,作為一般應(yīng)用,這已經(jīng)是足夠了的。
復(fù)位過程
除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系統(tǒng)寄存器都由系統(tǒng)復(fù)位或電源復(fù)位進(jìn)行異步復(fù)位。RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器僅能通過備份域復(fù)位信號復(fù)位。
讀RTC寄存器
RTC核完全獨(dú)立于RTC APB1接口。
軟件通過APB1接口訪問RTC的預(yù)分頻值 、 計數(shù)器值和鬧鐘值。但是,相關(guān)的可讀寄存器只在與RTC APB1時鐘進(jìn)行重新同步的RTC時鐘的上升沿被更新。RTC標(biāo)志也是如此的。
這意味著,如果APB1接口曾經(jīng)被關(guān)閉,而讀操作又是在剛剛重新開啟APB1之后,則在第一次的內(nèi)部寄存器更新之前,從APB1上讀出的RTC寄存器數(shù)值可能被破壞了(通常讀到0)。下述幾種
情況下能夠發(fā)生這種情形:
● 發(fā)生系統(tǒng)復(fù)位或電源復(fù)位。
● 系統(tǒng)剛從待機(jī)模式喚醒。
4.3 ● 系統(tǒng)剛從停機(jī)模式喚醒。
所有以上情況中,APB1接口被禁止時(復(fù)位、無時鐘或斷電)RTC核仍保持運(yùn)行狀態(tài)。
因此,若在讀取RTC寄存器時,RTC的APB1接口曾經(jīng)處于禁止?fàn)顟B(tài),則軟件首先必須等待RTC_CRL寄存器中的RSF位(寄存器同步標(biāo)志)被硬件置’1’。
注: RTC 的 APB1 接口不受 WFI 和 WFE 等低功耗模式的影響。
配置RTC寄存器
必須設(shè)置RTC_CRL寄存器中的CNF位,使RTC進(jìn)入配置模式后,才能寫入RTC_PRL、RTC_CNT、RTC_ALR寄存器。
另外,對RTC任何寄存器的寫操作,都必須在前一次寫操作結(jié)束后進(jìn)行。可以通過查詢RTC_CR寄存器中的RTOFF狀態(tài)位,判斷RTC寄存器是否處于更新中。僅當(dāng)RTOFF狀態(tài)位是’1’時,才可以寫入RTC寄存器。
配置過程: 配置過程:
查詢RTOFF位,直到RTOFF的值變?yōu)椤?’
置CNF值為1,進(jìn)入配置模式
對一個或多個RTC寄存器進(jìn)行寫操作
清除CNF標(biāo)志位,退出配置模式
查詢RTOFF,直至RTOFF位變?yōu)椤?’以確認(rèn)寫操作已經(jīng)完成。
僅當(dāng)CNF標(biāo)志位被清除時,寫操作才能進(jìn)行,這個過程至少需要3個RTCCLK周期。
RTC標(biāo)志的設(shè)置
在每一個RTC核心的時鐘周期中,更改RTC計數(shù)器之前設(shè)置RTC秒標(biāo)志(SECF)。
在計數(shù)器到達(dá)0x0000之前的最后一個RTC時鐘周期中,設(shè)置RTC溢出標(biāo)志(OWF)。
在計數(shù)器的值到達(dá)鬧鐘寄存器的值加1(RTC_ALR+1)之前的RTC時鐘周期中,設(shè)置RTC_Alarm和RTC鬧鐘標(biāo)志(ALRF)。對RTC鬧鐘的寫操作必須使用下述過程之一與RTC秒標(biāo)志同步:
● 使用RTC鬧鐘中斷,并在中斷處理程序中修改RTC鬧鐘和/或RTC計數(shù)器。
● 等待RTC控制寄存器中的SECF位被設(shè)置,再更改RTC鬧鐘和/或RTC計數(shù)器。
RTC 正常工作的一般配置步驟
1. 使能BPK PWR時鐘、中斷初始化
//必須先使能電源時鐘和備份區(qū)域時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
//中斷初始化
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel =RTC_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
2. 取消備份區(qū)寫保護(hù)
PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后備寄存器訪問
3. 復(fù)位備份區(qū)域,開啟外部低速振蕩器
BKP_DeInit();//復(fù)位備份區(qū)域
RCC_LSEConfig(RCC_LSE_ON);//開啟外部低速振蕩器
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);//檢查指定的 RCC 標(biāo)志位設(shè)置與否,等待低速晶振就緒
4. 配置RCT時鐘源
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇 LSE 作為 RTC 時鐘
RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘
RTC_WaitForLastTask(); //等待最近一次對 RTC 寄存器的寫操作完成
RTC_WaitForSynchro(); //等待 RTC 寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中斷
RTC_WaitForLastTask(); //等待最近一次對 RTC 寄存器的寫操作完成
5. 設(shè)置 RTC 的分頻,以及配置 RTC 時鐘
RTC_EnterConfigMode();/// 允許配置
RTC_SetPrescaler(32767);//設(shè)置 RTC 時鐘分頻數(shù) 晶振32.768KHz
RTC_ITConfig(RTC_IT_SEC,ENABLE); //使能 RTC 秒中斷
RTC_SetCounter(0);//最后在配置完成之后
6. 更新配置,設(shè)置RTC中斷分組
RTC_ExitConfigMode();//退出配置模式,更新配置
//往備份區(qū)域?qū)懹脩魯?shù)據(jù)
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
//讀取備份區(qū)域指定寄存器的用戶數(shù)據(jù)
BKP_ReadBackupRegister(uint16_t BKP_DR);
7. 編寫中斷服務(wù)函數(shù)
注:中斷標(biāo)志
RTC_FLAG_RTOFF RTC 操作 OFF 標(biāo)志位
RTC_FLAG_RSF 寄存器已同步標(biāo)志位
RTC_FLAG_OW 溢出中斷標(biāo)志位
RTC_FLAG_ALR 鬧鐘中斷標(biāo)志位
RTC_FLAG_SEC 秒中斷標(biāo)志位
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET) //秒鐘中斷
{
data++;
printf("time:%dt",data);
}
RTC_ClearITPendingBit(RTC_IT_SEC); //清中斷
RTC_WaitForLastTask();
}
完整程序
#include "stm32f10x.h"
#include "stdio.h"
int fputc(int ch, FILE *f)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_SendData(USART1,(uint8_t)ch);
return ch;
}
void delay_ms(u16 time)
{
u16 i = 0;
while(time--)
{
i = 12000;
while(i--);
}
}
u16 data = 0;
void Usart_Init()
{
GPIO_InitTypeDef GPIO_ITDef1;
GPIO_InitTypeDef GPIO_ITDef;
USART_InitTypeDef USART_ITDef;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
//掛載時鐘(復(fù)用PA) 串口時鐘使能,GPIO 時鐘使能,復(fù)用時鐘使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
//PA9 TXD初始化
GPIO_ITDef.GPIO_Pin = GPIO_Pin_9;//PA9 TXD
GPIO_ITDef.GPIO_Mode = GPIO_Mode_AF_PP;////復(fù)用推挽輸出
GPIO_ITDef.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_ITDef);
//PA10 TXD初始化
GPIO_ITDef1.GPIO_Pin = GPIO_Pin_10;//PA10 RXD
GPIO_ITDef1.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA,&GPIO_ITDef1);
//USART初始化
USART_ITDef.USART_BaudRate = 115200;//波特率
USART_ITDef.USART_WordLength = USART_WordLength_8b;//發(fā)送數(shù)據(jù)長度
USART_ITDef.USART_StopBits = USART_StopBits_1; //一個停止位
USART_ITDef.USART_Parity = USART_Parity_No; //無奇偶校驗位
USART_ITDef.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
USART_ITDef.USART_Mode = USART_Mode_Tx| USART_Mode_Rx ;//發(fā)送模式
USART_Init(USART1,&USART_ITDef);
USART_Cmd(USART1, ENABLE);//使能串口
}
void RTC_Init(void)
{
//1.使能BPK PWR時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel =RTC_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
//2.取消備份區(qū)寫保護(hù)
PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后備寄存器訪問
//3.復(fù)位備份區(qū)域,開啟外部低速振蕩器
BKP_DeInit();//復(fù)位備份區(qū)域
RCC_LSEConfig(RCC_LSE_ON);//開啟外部低速振蕩器
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);//檢查指定的 RCC 標(biāo)志位設(shè)置與否,等待低速晶振就緒
//4.配置RCT時鐘源
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇 LSE 作為 RTC 時鐘
RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘
RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘
RTC_WaitForLastTask(); //等待最近一次對 RTC 寄存器的寫操作完成
RTC_WaitForSynchro(); //等待 RTC 寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中斷
RTC_WaitForLastTask(); //等待最近一次對 RTC 寄存器的寫操作完成
//5.設(shè)置 RTC 的分頻,以及配置 RTC 時鐘
RTC_EnterConfigMode();/// 允許配置
RTC_SetPrescaler(32767);//設(shè)置 RTC 時鐘分頻數(shù) 晶振32.768KHz
RTC_ITConfig(RTC_IT_SEC,ENABLE); //使能 RTC 秒中斷
RTC_SetCounter(0);//最后在配置完成之后
//6.更新配置,設(shè)置RTC中斷分組。
RTC_ExitConfigMode();//退出配置模式,更新配置
}
int main(void)
{
Usart_Init();
RTC_Init();
while(1)
{
;
}
}
//每秒觸發(fā)一次
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET) //秒鐘中斷
{
data++;//每一秒+1
printf("time:%dt",data);//串口打印當(dāng)前時間值
}
RTC_ClearITPendingBit(RTC_IT_SEC); //清中斷
RTC_WaitForLastTask();
}
常用資料:
STM32F10x_StdPeriph_Lib_V3.5.0(官方固件庫)
鏈接:《STM32固件庫使用手冊的中文翻譯版》 提取碼:4lkx
鏈接:(keil5 IAR 等常用助手) 提取碼:xzgj
鏈接:《STM32中文參考手冊V10》 提取碼:j748
上一篇:STM32F4學(xué)習(xí)筆記之GPIO(使用固件庫)
下一篇:STM32基于固件庫學(xué)習(xí)筆記(3)串口的收發(fā)功能+WiFi基礎(chǔ)配置
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫的一些基本介紹
- 座椅、天窗、電動尾門應(yīng)用 國產(chǎn)車規(guī)級高壓霍爾效應(yīng)傳感器推薦
- 突發(fā)!又一車企車機(jī)“崩了”
- 寧德時代為陳立泉院士頒發(fā)“卓越貢獻(xiàn)獎”
- 一文速覽吉利雷神 AI 電混 2.0 發(fā)布會重點
- 2025年1-4月ADAS供應(yīng)商裝機(jī)量排行榜:頭部集中與國產(chǎn)突圍并存
- 國內(nèi)飛行汽車無線通信測試成功,通信安全新突破
- SPAD席卷車載激光雷達(dá)市場
- 大聯(lián)大品佳集團(tuán)推出基于Microchip和ams OSRAM產(chǎn)品的10Base-T1S萬級像素大燈方案
- 哈曼推出采用三星Neo QLED技術(shù)的全新顯示屏
- Syntiant推出超低功耗汽車AI創(chuàng)新技術(shù) 提升車輛安全性和用戶體驗
- 羅姆有獎直播|從0到1,帶你了解電機(jī)及其驅(qū)動 開始報名啦~
- 省錢、省心的購買租賃方案,讓您不再為預(yù)算煩惱!
- Discover mmWave 走進(jìn) TI 毫米波雷達(dá)世界 快速獲得設(shè)計技能
- 嵌入式Rust修煉營:動手寫串口燒錄工具和MCU例程,Rust達(dá)人Hunter直播帶你入門Rust
- EEWorld 芯積分兌換年度回饋來襲~多種賺積分捷徑曝光+禮品兌換劇透
- 有獎直播:艾邁斯歐司朗智慧農(nóng)業(yè)與植物照明
- ADI有獎下載活動之7 可編程邏輯控制器(PLCs)解決方案
- 開發(fā)板芯幣競拍,每日一款!今日競拍開發(fā)板:大黃蜂開發(fā)板
- ADI有獎下載活動之13升級版ADI電機(jī)控制解決方案—伺服控制
- 日經(jīng):長鑫重新設(shè)計DRAM芯片,盡量避免用美國原產(chǎn)技術(shù)
- 外媒:華為操作系統(tǒng)上市將面臨多重障礙
- 中國潛在第四大運(yùn)營商未誕生就涼涼?
- 郭明錤:搭載鴻蒙系統(tǒng)的華為手機(jī)將在10月份開始出貨
- 貿(mào)易戰(zhàn)對美國影響不同:跨國企業(yè)獲利下降,本土企業(yè)則成
- 連續(xù)18個月增長的半導(dǎo)體產(chǎn)業(yè),說明了什么?
- 科銳收購英飛凌科技射頻功率業(yè)務(wù)
- 家登看好半導(dǎo)體設(shè)備商機(jī) 助中國晶圓廠智慧制造
- GCT半導(dǎo)體獲取CEVA 低能耗藍(lán)牙IP授權(quán)許可 用于LTE IoT 單芯片
- 受自動駕駛熱潮刺激,半導(dǎo)體公司正研發(fā)新技術(shù)