打印
[STM32L0]

STM32L031低功耗深度睡眠RTC唤醒注意事项

[复制链接]
2932|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
版权声明:本文为博主原创**,未经博主允许不得转载。 https://blog.csdn.net/shjhuang/article/details/80953815


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



使用特权

评论回复
沙发
木木guainv|  楼主 | 2019-6-12 15:25 | 只看该作者
1. 发现进入睡眠后,电流1.2uA,满足要求。结果唤醒后,第二次进入睡眠后,电流跳到了19uA,且一直保持下去。结果看了https://blog.csdn.net/zzw3255/article/details/54342878的介绍,把串口干掉了,电流下降到了2.6uA。

使用特权

评论回复
板凳
木木guainv|  楼主 | 2019-6-12 15:25 | 只看该作者
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的低功耗测试》


使用特权

评论回复
地板
木木guainv|  楼主 | 2019-6-12 15:26 | 只看该作者
3. 按照昨天的思路,清除唤醒标志


  • /* Clear all related wakeup flags */
  •         __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

但是问题依旧,第一次进入睡眠1.2uA,第二次进入睡眠2.6uA。抓狂中。

使用特权

评论回复
5
木木guainv|  楼主 | 2019-6-12 15:27 | 只看该作者
看了文档,多于的1.4uA可能来源于IVREFINT,如下图所示:



使用特权

评论回复
6
木木guainv|  楼主 | 2019-6-12 15:27 | 只看该作者
但是我的程序已经将VREFINT关闭了,调试后也看到标志位已经确认关闭了,但是还是有2.6uA的电流。

         /* Enable Ultra low power mode */
  HAL_PWREx_EnableUltraLowPower();
        /* Enable Fast WakeUP */
        HAL_PWREx_EnableFastWakeUp();


到这里真的就没招了,重新理了下思路,看了代码,发现自己代码改得太乱了,之前的中断标志清除的语句在调试过程中注释掉了,重新加回来。问题解决。


使用特权

评论回复
7
木木guainv|  楼主 | 2019-6-12 15:27 | 只看该作者
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();
               
}




使用特权

评论回复
8
木木guainv|  楼主 | 2019-6-12 15:27 | 只看该作者
5. 最终,待机电流定格在1.2uA,满足项目需求。

使用特权

评论回复
9
木木guainv|  楼主 | 2019-6-12 15:28 | 只看该作者
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__);
  }

}


使用特权

评论回复
10
xiaoqizi| | 2019-7-4 16:49 | 只看该作者
还没有接触过st的低功耗模式

使用特权

评论回复
11
木木guainv|  楼主 | 2019-7-4 16:51 | 只看该作者
很有魅力的 可以试试看

使用特权

评论回复
12
kartik| | 2020-1-9 10:18 | 只看该作者
mark一下,马上就要用到

使用特权

评论回复
13
shizaigaole| | 2020-1-10 13:35 | 只看该作者
stm32L0 还是不错的。
比stm32L1要好,但是动态低功耗最好的是stm32L4.

stm32L1简易不要使用,设计的不太好。

使用特权

评论回复
14
yklstudent| | 2020-1-10 21:30 | 只看该作者
楼主能介绍下这个功耗是通过什么方式和工具测量的?以及这个功耗应该指的只是芯片本身的功耗,不带外围电路的吧

使用特权

评论回复
15
lrzxc1| | 2021-10-21 15:34 | 只看该作者
仔细看了楼主的帖子和步骤,以及遇到的问题和解决方案,谢谢楼主分享。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

4100

帖子

5

粉丝