配置RTC寄存器:
1.查詢RTOFF位,知道RTOFF的值為1.
2.置CNF值為1,進入配置模式。
3.對一個或者多個RTC寄存器進行寫操作。
4.清除CNF標志位,退出配置模式。
5.查詢RTOFF,直到RTOFF位變1,已確認寫操作已經(jīng)完成。
僅當CNF標志位被清除時,寫操作才能進行,這個操作至少需要3個RTCCLK周期。
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/49/91/poYBAGKhxBSAJPSXAAFtLtewWio541.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FzNDgwMTMzOTM3,size_16,color_FFFFFF,t_70)
RTC相關(guān)庫函數(shù)
RTC時鐘源和時鐘操作函數(shù):
void RCC_RTCCLKConfig(uint32_t CLKSource);//時鐘源選擇
void RCC_RTCCLKCmd(FunctionalState NewState)//時鐘使能
RTC配置函數(shù)(預分頻,計數(shù)值):
void RTC_SetPrescaler(uint32_t PrescalerValue);//預分頻配置: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
相關(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
③復位備份區(qū)域,開啟外部低速振蕩器。
BKP_DeInit();//復位備份區(qū)域
1
④ 配置RTC時鐘源,使能RTC時鐘:
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇 LSE 作為 RTC 時鐘(RCC_RTCCLKSource_LSI 和 RCC_RTCCLKSource_HSE_Div128)
RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘
1
2
⑤ 設(shè)置RTC預分頻系數(shù):RTC_SetPrescaler();
RTC_EnterConfigMode();/// 允許配置
RTC_SetPrescaler(32767); //設(shè)置RTC預分頻的值
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
-
寄存器
+關(guān)注
關(guān)注
31文章
5372瀏覽量
121346 -
RTC
+關(guān)注
關(guān)注
2文章
544瀏覽量
67117 -
庫函數(shù)
+關(guān)注
關(guān)注
0文章
177瀏覽量
34024
發(fā)布評論請先 登錄
相關(guān)推薦
原創(chuàng):sam4s16c的寄存器配置基礎(chǔ)教程---RTC配置
庫函數(shù)和寄存器的區(qū)別
怎么通過庫函數(shù)來實現(xiàn)相關(guān)寄存器的配置
為什么RTC_GPIO_PINx寄存器中的RTC_IO_TOUCH_PADx_TO_GPIO位的定義和控制位說明?
《振南電子STM32視頻教程》第十四講:RTC和BKP
STM32單片機RTC時鐘的使用方法及步驟
![STM32單片機<b class='flag-5'>RTC</b>時鐘的使用方法及<b class='flag-5'>步驟</b>](https://file.elecfans.com/web1/M00/81/71/o4YBAFwzG5KADH6yAABfBvvg1Cw256.jpg)
STM32庫函數(shù)和寄存器應該如何操作
![STM32<b class='flag-5'>庫函數(shù)</b>和<b class='flag-5'>寄存器</b>應該如何操作](https://file.elecfans.com/web1/M00/A6/0C/o4YBAF13YaaAJSvgAAsG9_0_xOU521.png)
【STM32】RTC詳解
![【STM32】<b class='flag-5'>RTC</b>詳解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
2021-04-17 STM32串口寄存器庫函數(shù)配置
![2021-04-17 STM32串口<b class='flag-5'>寄存器</b><b class='flag-5'>庫函數(shù)</b><b class='flag-5'>配置</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論