STM32 的 RTC 使用需要注意一下幾點 :
必須設置 RTC_CRL 寄存器中的 CNF 位, 使 RTC 進入配置模式後, 才能寫入 RTC_PRL、RTC_CNT、
RTC_ALR 寄存器。
另外, 對 RTC 任何寄存器的寫操作, 都必須在前一次寫操作結束後才進行。可以通過查詢 RTC_CR 寄存器中
的 RTOFF 狀態位判斷 RTC 寄存器是否處於更新中。僅當 RTOFF 狀態位爲’1’時,纔可以寫入 RTC 寄存器。
配置過程 :
A、查詢 RTOFF 位, 直到 RTOFF 位的值變爲 ’1’。
B、將 CNF 置 ’1’, 進入配置模式
C、對一個或多個 RTC 寄存器進行寫操作
D、清除 CNF 標誌位, 退出配置模式
E、查詢 RTOFF, 直到變爲 ’1’, 以確認寫操作已經完成。
僅當 CNF 標誌位被清除時, 寫操作才能進行,這個過程至少需要 3 個 RTCCLK 週期。
F、中斷配置
和其他中斷配置步驟一樣,這裏省略。
G、RTC 配置
使能RTC的電池時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
使能備份寄存器時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
允許訪問備份寄存器
PWR_BackupAccessCmd(ENABLE);
復位BKP
BKP_DeInit();
使能低速晶振
RCC_LSEConfig(RCC_LSE_ON);
等待晶振就緒
while( RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET );
選擇外部低速時鐘爲RTC時鐘
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
使能 RTC 時鐘
RCC_RTCCLKCmd(ENABLE);
等待 RTC 寄存器同步
RTC_WaitForSynchro();
等待操作完成
RTC_WaitForLastTask();
如果使用了中斷,使能秒中斷
RTC_ITConfig(RTC_IT_SEC,ENABLE);
等待操作完成
RTC_WaitForLastTask();
設置預分頻
RTC_SetPrescaler(32767);
等待操作完成
RTC_WaitForLastTask();
系統在第一次下載完程序之後纔會執行上面的 RTC 配置函數, 以後只要電池不掉電, RTC 仍然工作,因此不需
要再調用 RTC 初始化函數。
if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
RTC_Config();
RTC_SetCounter(0x10D10); /* 初始化計數值*/
RTC_WaitForLastTask(); /* 等待操作完成*/
/* 往備份寄存器中寫入數據標誌, 表明已經完成初始化*/
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
}
else/* 系統掉電,但是鈕釦電池還在*/
{
RTC_WaitForSynchro(); /* 等待RTC 寄存器同步*/
RTC_WaitForLastTask(); /* 等待操作完成 */
RTC_ITConfig(RTC_IT_SEC,ENABLE); /* 使能秒中斷*/
}
RCC_ClearFlag();/*清除復位標誌*/
工程源代碼下載 :點擊打開鏈接