STM32L4系列单片机如何使用RTC唤醒定时器进入Standby低功耗模式并唤醒+整机功耗测试


前言

低功耗设计对于一些便携式产品以及智能穿戴产品尤其重要,其是一种在满足功能、性能要求的前提下,尽量降低集成电路能耗的设计方法。


一、STM32L4单片机简介

STM32L4系列是超低功耗32位ARM MCU+FPU,工作频率高达80MHz,具有100DMIPS,集成了多达1MB闪存,320KB SRAM,USB OTG FS,提供多达三个快速12位ADC(5 Msps),两个比较器,两个运放,两个DAC通路,一个内部基准电压缓冲器,一个低功耗RTC,两个通用32位计时器和两个专用马达控制的16位低功耗计时器,七个通用16位计时器和两个16位低功耗计时器。主要用在包括音频和图像等低功耗的应用。这里主要用到STM32L496,使用STM32CubeMx进行配置。
相关软件设计主要为:系统时钟设置为80 MHz,SysTick编程为每1ms产生一次中断。默认情况下,低速内部(LSI)时钟用作RTC时钟源。EXTI_Line20内部连接到RTC唤醒事件。启动后5秒,系统自动进入待机模式。RTC唤醒被配置为在大约33秒之后的上升沿上产生中断。启用RTC功能的待机模式下的电流消耗可以在这段时间内进行测量。选择超过半分钟的时间以确保电流收敛到最低工作点。从待机模式唤醒后,程序将以与软件复位后相同的方式重新启动。

二、程序设计及相关步骤

1.系统时钟设置

配置如下:

System Clock sourcePLL (MSI)
SYSCLK(Hz)80000000
HCLK(Hz)80000000
AHB Prescaler1
APB1 Prescaler1
APB2 Prescaler1
MSI Frequency(Hz)4000000

2.RTC以及系统电源配置

2.1 RTC配置

在这里插入图片描述

void MX_RTC_Init(void)
{

  /* USER CODE BEGIN RTC_Init 0 */

  /* USER CODE END RTC_Init 0 */

  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef sDate = {0};
  RTC_AlarmTypeDef sAlarm = {0};

  /* USER CODE BEGIN RTC_Init 1 */

  /* USER CODE END RTC_Init 1 */

  /** Initialize RTC Only
  */
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut = RTC_OUTPUT_ALARMA;
  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }

2.2 系统电源配置

static void SystemPower_Config(void)
{
  /* Enable Power Control clock */
  __HAL_RCC_PWR_CLK_ENABLE();
}

3.主程序代码

int main(void)
{
  HAL_Init();

  /* Configure the system clock to 80 MHz */
  SystemClock_Config();

  /* Configure RTC */
  RTC_Config();
  /* Configure the system Power */
  SystemPower_Config();
  /* 检查并处理系统是否从待机模式恢复 */ 
  if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
  {
    /* 清除待机标志 */
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); 
  }
  
  /* 系统启动5s延迟后,进入待机模式 */
  HAL_Delay(5000);
  
  /* 以下为唤醒顺序
    - 1.禁用所有使用的唤醒源,
    - 2.清除所有相关的唤醒标志, 
    - 3.重启所有使用的唤醒源,
    - 4.进入Standby模式.
  */
  /* 1.禁用所有使用的唤醒源*/
  HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);
  
  /* 2.清除所有相关的唤醒标志 */
  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  
  /* 3.重启所有使用的唤醒源*/
  /* ################设置唤醒时间#####################*/
  /* 生成RTC唤醒中断: 
    唤醒计数器被设置为其最大值,以产生最长的待机时间,使电流达到其最低值,即功耗最低.
    当RTC_WAKEUPCLOCK_RTCCLK_DIV=RTCCLK_Div16=16时,最大值为0xFFFF,对应于约33秒:
    Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI))
    Wakeup Time = Wakeup Time Base * WakeUpCounter 
      = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI)) * WakeUpCounter
      ==> WakeUpCounter = Wakeup Time / Wakeup Time Base
  
    要将唤醒计时器配置为33秒,将唤醒计数器设置为0xFFFF:
    Wakeup Time Base = 16 /(~32 kHz RC) = ~0.5 ms
    Wakeup Time = 0.5 ms  * WakeUpCounter
    因此, wake-up counter =  0xFFFF  = 65,535 
       Wakeup Time =  0.5 ms *  65,535 = ~ 33 s. */
  HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0xFFFF, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
  /* 4.进入Standby模式 */
  HAL_PWR_EnterSTANDBYMode();
  
  while (1)
  {
  }
}


三、测试结果

将代码烧进开发板之后,上电5s以后系统进入Standby低功耗模式,大约33s之后被唤醒。这里也是用万用表测量了系统正常工作以及待机模式的功耗:
系统正常工作整机电流:52.1mA
在这里插入图片描述
Standby低功耗模式整机电流:2.22mA
在这里插入图片描述

总结

由于在测试的时候ST-link没有取下以及有一些飞线,造成有漏电电流,所以造成系统正常工作时电流还是挺大的,但进入Standby低功耗模式之后,电流下降得非常明显,还是非常给力的,如果取下ST-link以及去掉飞线,低功耗电流应该是微安级别的。

如果需要代码可以联系我!
STM32低功耗还有STOP1、STOP2、Sleep等模式,后续还会出其他模式低功耗进入以及唤醒分享!如果觉得有用请点赞加收藏!

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值