12、STM32 的 RTC 使用


        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();/*清除復位標誌*/


工程源代碼下載 :點擊打開鏈接



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章