STM32L031低功耗深度睡眠RTC喚醒注意事項
0. 第一可以進入休眠,第二次無法進入休眠,折騰了好久。後來想想應該是進入休眠後立刻被喚醒了,應該是上次的喚醒中斷沒清除。在啟動喚醒前加入以下語句,問題解決。
__HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); //清除標誌,否則第二次以後無法進入休眠 // HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0xB4D8, RTC_WAKEUPCLOCK_RTCCLK_DIV16); //20s HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0xffff, RTC_WAKEUPCLOCK_RTCCLK_DIV16); //28s
1. 發現進入睡眠後,電流1.2uA,滿足要求。結果喚醒後,第二次進入睡眠後,電流跳到了19uA,且一直保持下去。結果看了https://blog.csdn.net/zzw3255/article/details/54342878的介紹,把串口乾掉了,電流下降到了2.6uA。
2. 去掉了串列埠,第一次進入睡眠1.2uA,第二次進入睡眠2.6uA。又陷入了僵局,沒開串列埠、沒開GPIO,啥事都沒幹,怎麼回事?誰能幫忙解決下?
網上搜索了一下資料,遇到和我這樣的情況的人還真不少。例如:
https://blog.csdn.net/zhufeng88/article/details/66968101#commentsedit
說是清除喚醒標誌就好了,明天按照這個思路,改程式碼試試看。(但是本文第0點,不是已經清除了嗎?該文指的的標誌是哪個標誌?)
相關文章:
https://blog.csdn.net/flydream0/article/details/52511311《STM32L152的低功耗測試》
3. 按照昨天的思路,清除喚醒標誌
/* Clear all related wakeup flags */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
但是問題依舊,第一次進入睡眠1.2uA,第二次進入睡眠2.6uA。抓狂中。
看了文件,多於的1.4uA可能來源於IVREFINT,如下圖所示:
但是我的程式已經將VREFINT關閉了,除錯後也看到標誌位已經確認關閉了,但是還是有2.6uA的電流。
/* Enable Ultra low power mode */
HAL_PWREx_EnableUltraLowPower();
/* Enable Fast WakeUP */
HAL_PWREx_EnableFastWakeUp();
到這裡真的就沒招了,重新理了下思路,看了程式碼,發現自己程式碼改得太亂了,之前的中斷標誌清除的語句在除錯過程中註釋掉了,重新加回來。問題解決。
4. 附上原始碼
void enter_stop_rtc(unsigned stoptime)
{
/* Enable Ultra low power mode */
HAL_PWREx_EnableUltraLowPower(); //必須要加,否則多出1.4uA的電流
/* Enable Fast WakeUP */
HAL_PWREx_EnableFastWakeUp();
/* Disable Wakeup Counter */
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
/*To configure the wake up timer to 4s the WakeUpCounter is set to 0x242B:
RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16
Wakeup Time Base = 16 /(~37KHz) = ~0,432 ms
Wakeup Time = ~5s = 0,432ms * WakeUpCounter
==> WakeUpCounter = ~5s/0,432ms = 11562 */
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, stoptime*2396, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
system_power_config();
/* Enter Stop Mode */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* Clear all related wakeup flags */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //必須要加,否則多出1.4uA的電流
__HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); //清除標誌,否則第二次以後無法進入休眠
SystemClock_Config();
}
5. 最終,待機電流定格在1.2uA,滿足專案需求。
6. 關於lpuart休眠後異常的問題。因為每次休眠後,都要重新初始化串列埠。但是發現使用hal庫初始化的時候並沒有成功,因為裡面有個標誌,初始化後就不再允許再次初始化了,所以,每次初始化時,需重置標誌並位。
/* LPUART1 init function */
static void MX_LPUART1_UART_Init(void)
{
hlpuart1.Instance = LPUART1;
hlpuart1.Init.BaudRate = 115200;
hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
hlpuart1.Init.StopBits = UART_STOPBITS_1;
hlpuart1.Init.Parity = UART_PARITY_NONE;
hlpuart1.Init.Mode = UART_MODE_TX_RX;
hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
hlpuart1.gState = HAL_UART_STATE_RESET; //休眠後初始化要重置該標誌位
if (HAL_UART_Init(&hlpuart1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}