stm32l0 rtc休眠週期自動喚醒文檔整理
wangxl@20190814
一、週期性自動喚醒--手冊文檔說明
週期性喚醒標誌由 16 位可編程自動重載遞減計數器生成。喚醒定時器範圍可擴展至 17 位。
可通過 RTC_CR 寄存器中的 WUTE 位來使能此喚醒功能。
喚醒定時器的時鐘輸入可以是: 2、4、8 或 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");
}