很多MCU都有低功耗模式,以满足对功耗要求苛刻的应用场景。STM32系列MCU的低功耗模式根据其内核与类型的不同也各不相同,网上有很多文章介绍。本文总结下STM32L051的STOP模式,通过RTC唤醒。

STM32L051在低功耗方面性能优异,ST官方数据手册中说明,在stop without rtc模式下电流消耗能达到0.4uA,在stop with rtc模式下电流消耗能达到0.8uA。

  1. 在进入STOP模式前对外设进行设置,GPIO要设置成模拟输入状态。
static void system_config_before_stop(void)
{HAL_StatusTypeDef ret = HAL_OK;GPIO_InitTypeDef GPIO_InitStructure;/* Enable Ultra low power mode */HAL_PWREx_EnableUltraLowPower();/* Enable the fast wake up from Ultra low power mode */HAL_PWREx_EnableFastWakeUp();/* Select HSI as system clock source after Wake Up from Stop mode */__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);/* Enable GPIOs clock */__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();/* Configure all GPIO port pins in Analog Input mode (floating input trigger OFF) */GPIO_InitStructure.Pin = GPIO_PIN_All;GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;GPIO_InitStructure.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);/* Disable GPIOs clock */__HAL_RCC_GPIOA_CLK_DISABLE();__HAL_RCC_GPIOB_CLK_DISABLE();__HAL_RCC_GPIOC_CLK_DISABLE();/* Configure RTC */RTCHandle.Instance = RTC;RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;ret = HAL_RTC_Init(&RTCHandle);if (ret != HAL_OK) while (1);
}
  1. 设置RTC的唤醒时间,函数参数单位为秒。
static void stop_rtc_config(uint32_t sleep)
{/* Disable Wakeup Counter */HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);/*## Setting the Wake up time */HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, sleep, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
}
  1. 调用库函数进入STOP模式。
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  1. 退出STOP模式后要恢复时钟。特别注意在进入STOP模式后系统时钟变成了MSI。
static void clock_config_after_stop(void)
{HAL_StatusTypeDef ret = HAL_OK;RCC_OscInitTypeDef RCC_OscInitStructure = {0};RCC_ClkInitTypeDef RCC_ClkInitStructure = {0};/* Enable Power Control clock */__HAL_RCC_PWR_CLK_ENABLE();/* The voltage scaling allows optimizing the power consumption when the device isclocked below the maximum system frequency, to update the voltage scaling valueregarding system frequency refer to product datasheet.  */__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/* Get the Oscillators configuration according to the internal RCC registers */HAL_RCC_GetOscConfig(&RCC_OscInitStructure);/* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStructure.HSEState = RCC_HSE_OFF;RCC_OscInitStructure.HSIState = RCC_HSI_ON;RCC_OscInitStructure.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStructure.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStructure.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStructure.PLL.PLLMUL = RCC_PLLMUL_4;RCC_OscInitStructure.PLL.PLLDIV = RCC_PLLDIV_2;ret = HAL_RCC_OscConfig(&RCC_OscInitStructure);if (ret != HAL_OK) while (1);/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2clocks dividers */RCC_ClkInitStructure.ClockType = RCC_CLOCKTYPE_SYSCLK;RCC_ClkInitStructure.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;ret = HAL_RCC_ClockConfig(&RCC_ClkInitStructure, FLASH_LATENCY_1);if (ret != HAL_OK) while (1);
}
  1. 恢复各外设状态,比如GPIO、串口等初始化。
static void gpioInit(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin : PA1 */GPIO_InitStruct.Pin = LED_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);}
  1. 在需要进入STOP模式的地方直接调用函数。
static void enter_stop_rtc_mode(void)
{//1. 配置stop之前各外设system_config_before_stop();//2.设置rtc唤醒时间20sstop_rtc_config(20);//3. 进入stopHAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);//3.退出stop后恢复时钟clock_config_after_stop();//4.恢复各外设gpioInit();
}

对于低功耗产品开发,CPU的低功耗只是一部份,外围电路设计上也要综合考虑。目前测试到消耗电流比数据手册高。


附上工程代码,有需要的朋友可以参考。

更多内容,欢迎关注我的公众号。 微信扫一扫下方二维码即可关注:

STM32L051低功耗STOP模式下RTC唤醒相关推荐

  1. STM32L051低功耗STOP模式串口中断唤醒

    STM32L051进入STOP模式后,除去通过RTC唤醒,还可通过外部中断唤醒,在stop without rtc模式下电流消耗能达到0.4uA.很多时候,我们需要使用STM32的串口进行唤醒,比如接 ...

  2. F429的RTC当做stop模式下的唤醒源(FreeRTOS)

    The RTC also includes an automatic wakeup unit to manage low-power modes. 时钟源的选择:LSI or LSE ,LSI=32. ...

  3. 芯片低功耗睡眠模式下与看门狗的使用

    芯片睡眠模式下与看门狗的使用 方法1:在低功耗模式下进行RTC定时唤醒CPU进行喂狗操作之后在进入低功耗睡眠模式,因为在睡眠模式下是无法进行正常喂狗的,所以需要进行RTC定时唤醒进行喂狗操作,保证看门 ...

  4. ESP8266 Deep-Sleep 模式下的唤醒方式

    ESP-WROOM-02D 模块进入 Deep-Sleep 睡眠:仅 RTC 处于⼯作状态,芯⽚的其他部分掉电. ESP8266 在 Deep-Sleep 模式下支持两种唤醒方式:自动唤醒和外部唤醒. ...

  5. STM32L431低功耗停止模式莫名其妙自动唤醒

    最近在调试STM32L431的低功耗调试模式,发现进入低功耗后HAL_PWREx_EnterSTOP0Mode(PWR_STOPENTRY_WFI);莫名其妙的自动就就被唤醒了,LED开始闪烁,并且串 ...

  6. [STM32F1]STM32 低功耗待机模式与RTC周期唤醒

    STM32等类似Cortex-M3的MCU在系统或电源复位以后,MCU就会处于程序运行状态.当用户不需继续运行程序时,可以利用进入低功耗模式来节省电池电量,当需要重新运行时,可以通过特定条件进行唤醒程 ...

  7. 【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)

    [STM32笔记]低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_5340 ...

  8. 【极海APM32替代笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)

    [极海APM32替代笔记]低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_ ...

  9. 【STM32】【STM32CubeMX】STM32CubeMX的使用之八:低功耗模式及MCU唤醒

    文章目录 0.前言 1.低功耗模式简介 2.CubeMX设置 3.软件设计   下载工程文件:   https://gitee.com/Joseph_Cooper/stm32-cube-mx-stm3 ...

  10. 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

    [STM32笔记]HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒.串口唤醒和回调无法一起使用.接收数据不全的问题) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csd ...

最新文章

  1. java导入包大全_eclipse快速导入jar包的相关操作步骤
  2. Bootstrap4默认样式不对胃口?教你使用NPM+Webpack+SASS来定制
  3. 解读Cardinality Estimation算法(第二部分:Linear Counting)
  4. 说一说技术和管理……
  5. qt android刘海屏状态栏,华为Mate30 Pro设计曝光:仍配刘海屏+3D结构光
  6. Backward_chaining
  7. Python编程 基础篇(一)
  8. 根据身份证号判断所属省份、生日及性别
  9. 开根号的笔算算法图解_excel中开根号的计算方法步骤详解
  10. TOP100summit分享实录 | JFrog高欣:Kubernetes is hard!JFrog的Kubernetes实践
  11. CSS粘性定位(sticky)
  12. mysql详解(全)
  13. mysql 黑马,mysql-黑马-day01
  14. 宝塔界面为什么无法访问_宝塔面板登陆不上?宝塔面板打不开解决办法
  15. JavaWeb.购物车项目
  16. 【Spring Security】安全框架学习(十三)
  17. win10总强制更新?教你永久关闭
  18. 评论一下《PPT演义》
  19. 失去往日辉煌的快递元老宅急送,能否借即时配翻身?
  20. Linux Shell数字加

热门文章

  1. 企业生存与发展的前提是安全
  2. oracle添加字段sql并添加注释
  3. 用Python深度解读房贷利率
  4. 多元函数极限求法(二元函数)
  5. 乱下东西导致挖矿病毒Trojan,CoinMiner的解决记录
  6. 4.2-软件开发中,“思维导图”的作用与绘制方法介绍
  7. 微信小程序轮播图,图片自适应,图片循环播放,图片之间有空白空间
  8. 网络安全学习第14篇 - 游戏(仙剑奇侠传95)外挂之修改游戏资源文件(修改人物属性)
  9. java记事本的代码_Java基础——第一个记事本代码与Java注释
  10. vyos v1.2安装flask