stm32l0 rtc休眠週期自動喚醒文檔整理

stm32l0 rtc休眠週期自動喚醒文檔整理

wangxl@20190814

 

一、週期性自動喚醒--手冊文檔說明

週期性喚醒標誌由 16 位可編程自動重載遞減計數器生成。喚醒定時器範圍可擴展至 17 位。

可通過 RTC_CR 寄存器中的 WUTE 位來使能此喚醒功能。

喚醒定時器的時鐘輸入可以是:  248  16 分頻的 RTC 時鐘 (RTCCLK)

 RTCCLK  LSE (32.768 kHz) 時,可配置的喚醒中斷週期介於 122 µs  32 s 之 間,且分辨率低至 61 µs

· ck_spre(通常爲 1 Hz 內部時鐘)。

 ck_spre 頻率爲 1 Hz 時,可得到的喚醒時間爲 1s  36h 左右,分辨率爲 1 秒。這 一較大的可編程時間範圍分爲兩部分:

– WUCKSEL [2:1] = 10 時爲 1s  18h

– WUCKSEL [2:1] = 11 時約爲 18h  36h。在後一種情況下,會將 216 添加到 16 位計數器當前值。完成初始化序列後(請參見 600 頁的編程喚醒定時器),定時 器開始遞減計數。在低功耗模式下使能喚醒功能時,遞減計數保持有效。此外,當 計數器計數到 0 時,RTC_ISR 寄存器的 WUTF 標誌會置 1,並且喚醒寄存器會使用其重載值(RTC_WUTR 寄存器值)動重載。 之後必須用軟件清零 WUTF 標誌。

通過將 RTC_CR2 寄存器中的 WUTIE 位置 1 來使能週期性喚醒中斷時,它會使器件退出低功耗模式。

如果已通過 RTC_CR 寄存器的位 OSEL[1:0] 使能週期性喚醒標誌,則該標誌可連接到RTC_ALARM 輸出。可通過 RTC_CR 寄存器的 POL 位配置 RTC_ALARM 輸出極性。

系統復位以及低功耗模式(睡眠、停機和待機)對喚醒定時器沒有任何影響。

 

二、配置週期喚醒

配置步驟如下:

1. 禁用週期喚醒功能,復位RTC_CR2中WUTE位;

2. 等待RTC_ISR1中WUTWF位置位,表示喚醒計數器可配置;

3. 配置喚醒時鐘,設置RTC_CR1中WUCKSEL[2:0]位:

- 000: RTCCLK/16

- 001: RTCCLK/8

- 010: RTCCLK/4

- 011: RTCCLK/2

- 10x: ck_spre(1Hz,WUT計數範圍:0x0000~0xFFFF)

- 11x: ck_spre(1Hz,WUT計數範圍:0x10000~0x1FFFF)

4. 配置喚醒週期,裝載寄存器RTC_WUTRH和RTC_WUTRL;

5. 使能週期喚醒功能,置位RTC_CR2中WUTE位。(該中斷會使MCU退出低功耗狀態,進入運行狀態。)

 

 

RTCCLK,預分頻2,4,8或16。如果RTCCLK爲LSE,即32768Hz,則可配置喚醒週期爲:(61us ~ 32s)

 

ck_spre, 1Hz時鐘,則可配置喚醒週期爲:(1s ~ 36h)

 

三、RTC時鐘配置

1、時鐘源選擇:RTC時鐘源可選HSE,LSE,HSI或LSI。

爲確保RTC精確工作,要求系統時鐘(SYSCLK)必須等於或大於4*RTCCLK值。如果系統時鐘(SYSCLK)爲LSE或LSI,則RTC時鐘必須等於系統時鐘(SYSCLK),並且禁用RTC同步機制(置位RTC_CR1寄存器RATIO位)。

 

2、配置RTC時鐘源:配置RTC時鐘源爲LSE,1分頻,即32768Hz。

 

3、配置ck_spre時鐘; ck_spre時鐘,默認1Hz時鐘。

(1) 設置7位異步預分頻,RTC_APREG:PREDIVA,默認127;

(2) 設置13(Medium)或15位同步預分頻,RTC_SPRERx:PREDIV_S,默認255。

即:1Hz=32768/((127+1)*(255+1))

 

ck_spre時鐘可用於日曆和定時喚醒時鐘。

 

  • 代碼參考

//參數time 秒

void APP_EnterLP(uint32_t time )

{

         MX_GPIO_Init_stop();

 /* Enable Ultra low power mode */

          HAL_PWREx_EnableUltraLowPower(); //使能超低功耗

          /* Enable Fast WakeUP */

          HAL_PWREx_EnableFastWakeUp();            //使能快速喚醒

           /* Disable Wakeup Counter */

         HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);

         

      

      /* Clear Wake Up Flag */

        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

        

    //    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, (uint32_t)(time * 2048), RTC_WAKEUPCLOCK_RTCCLK_DIV16);//rtc LSE=32.768k   2048Hz   488us-- 32秒

 

        HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, time-1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); //wangxl@20190814  時鐘選擇1Hz  65535/60/60 ~18  可得到的喚醒時間爲 1s 到 18h 左右

        

        printf("進入停止模式\r\n");

        

        /* Select MSI as system clock source after Wake Up from Stop mode */

        __HAL_RCC_WAKEUPSTOP_CLK_CONFIG (RCC_STOP_WAKEUPCLOCK_HSI);

        

        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON , PWR_STOPENTRY_WFI);

              

        MX_GPIO_Init();

       

        HAL_Delay(5);  //wangxl@20190814  穩定時鐘 必免串口打印亂碼

        printf("wake up\r\n");

}

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