基于STM32L4系列单片机的低功耗问题

首先看ST关于L4系列的官方文档官方给出了多个低功耗模式并且介绍了这几种模式
Sleep mode:CUP时钟关闭,IO口保持与运行状态相同的状态。可由wake事件,NVIC,SysTick,外部中断等,无唤醒时间,唤醒后执行唤醒源中断回调函数(和标准库中断服务函数功能一样,但意义不同),然后按原来代码执行

**Low-power run mode:**当系统时钟频率降低到2MHZ以下时,即可实现此模式。代码可从SRAM或闪存中执行。调整器处于低功耗模式,以最小化调整器的工作电流。IO口保持与运行状态相同的状态,退出此模式需按照三步1:清除PWR CR1寄存器中的LPR位,强制调整器进入主模式。2:等待直到PWR SR2寄存器中的REGLPF 位被清除3:增加时钟频率

Low-power sleep mode: 此模式从Low-power run mode进入,IO口状态与运行模式相同,可由外部中断,wake事件唤醒,无唤醒时间,唤醒后执行中断回调函数,后按原来代码执行

**Stop 0, Stop 1 and Stop 2 modes:**此模式中SRAM1,SRAM2和寄存器中的内容都将保留,所有时钟在VCORE 域停止,PLL,MSI,HSI16,HSE禁止。LSE和LSI保持运行,RTC可保持运行,一些具有唤醒功能的外设也可等待唤醒条件。在STOP2模式下,大多数的VCORE域处于低泄漏状态。SPOP1模式提供了最多数量的活动外设和唤醒源,唤醒时间较小,但电流比STOP2消耗更多,在STOP0模式主调节器仍然时开着的,这允许最快的唤醒时间,但消耗多。功耗大小SPOP2< STOP1<STOP0.可由wake事件,外部中断唤醒。当退出SPOP模式时时钟源可选MSI或HSI16这取决于软件配置。退出后执行唤醒源中断回调,后按主代码执行。

Standby mode: VCORE域是关闭电源的。然而,它可以保留SRAM2的内容:待机模式与SRAM2保留当位RRS被设置在CR3寄存器,在这种情况下。SRAM2由低功率调节器提供。在PWR CR3寄存器中清除位RRS时的备用模式。在这种情况下,主调节器和低功率调节器电源关闭,所有的时钟在VCORE域停止,PLL,MSI,HSI16和HSE被禁止。LSI和LSE可以继续运行。IO口可配置位上拉或下拉或模拟。RTC可以保持。外部中断和wake时间唤醒等可退出Standby模式,唤醒后系统复位

**Shutdown:**VCORE域电源关闭,所有时钟在VCORE停止,PLL,MSI,HSI16,HSE禁止,LSE可以保持运行,系统时钟,当退出Shutdowm模式MSI在4MHZ在这种模式下电源监控是关闭的。IO口可配置成 上拉,下拉,模拟。可用wake事件唤醒,io口外部中断,唤醒后系统复位。
几种模式的相互转换关系:

由这几种模式转换且保持系统运行无异常,最初我选择了Run mode(运行)和Shutdown mode 和Standby mode 模式进行测试,手里的板子的MCU是STM32L31RCT6.对比官方库中的测试和自己的工程看电流,刚开始测试的时候电流差距很大,首先找硬件原因,因为我使用的不是ST官方的板,无引出的电流测试点,所以我测的是整体板子的电流,我所使用的板子比较简单,无任何外设,去除5转3.3芯片,直接使用3.3v供电,单片机的启动模式为模式0在FLASH中启动 BOOT0和B00T1设置为上拉电阻。(BOOT0和BOOT1一定要处理好影响电流很大)

首先单独测试Shutdown模式,最初测试的时候电流还是很大,在经过硬件与软件的结合后最终电流最低可达到0.03uA 且可由外部中断唤醒。加上RTC周期唤醒后,电流最低到0.52uA

图为官方给出的标准参照
具体的软件处理方法:
1:底层初始化HAL_Init();重置所有外设,FLASH 和Systick,
2:系统时钟配置SystemClock_Config();STM32L4最高时钟可跑到80M,我在STM32Cube中时钟设置为72MHZ因为现在只是测试低功耗对系统的运行速度无太大要求
3:开启所用时钟MX_GPIO_Init();在这我开启了所有时钟,并在此处将没
用到的引脚全部设置为模拟输入,外设我只用了串口.并开启外部中断。
4:串口的配置及初始化,按照常规配置即可
5:进入低功耗模式前的准备,首先在此函数中禁用Debug调试端口,关闭所有时钟。关闭串口,然后进入Shutdowm模式。
进入Standy模式和Shutdowm模式软件配置相同只不过最后进入的是Standy模式,Standy模式测试电流为0.12uA 加入RTC后电流大约在0.63uA
在之后唤醒这一开始使用的RTC周期唤醒即HAL_RTCEx_SetWakeUpTimer_IT()函数,此函数使用的是一个16位可编程自动重载递减计数器(RTC_WUTR)生成,可用于周期性中断/唤醒。此唤醒定时器的时钟输入可以是:2,4,8或16分频的RTC时钟,也可以是ck_spre时钟(一般为1HZ)当使用RTC时钟时,可配置的唤醒中断介于122us和32s之间。当使用ck_spre时钟的时候唤醒时间为1s到36h左右分辨率为1s,这个范围分为两个部分
当WUCKSEL[2:1]=10时为:1s到18h。
当WUCKSEL[2:1]=11时约为:18h到36h。
在后一种情况下,会将2^16添加到16位计数器当前值(即扩展到17位,相当于最高位用WUCKSEL[1]代替) 如图

在使用RTC周期唤醒的时候 要清零WUTF标志,因为当计数器到0时,RTC_ISR寄存器的WUTF标志会置1,并且唤醒寄存器会使用其重载值重载,会出现进不去低功耗模式的情况。用此种方式退出低功耗模式,系统复位以及低功耗模式不会影响计数器的计数。
但是一开始的时候我并没有注意到唤醒Shutdown和Standy模式后会复位确实是周期性唤醒,但是每次都复位,这样不方便添加外部中断唤醒方式。(在软件的第五步进入低功耗模式前加入RTC唤醒函数,开启计数或者闹钟)闹钟的话根据所配置来唤醒,闹钟在唤醒Standy和Shutdown时也可以实现周期性唤醒。
因此换用第三功耗小的模式,STOP2模式。STOP2无RTC可跑电流1.1uA,加入RTC后1.4uA左右。STOP2模式具体软件处理方法与整体框架相同。
现在来看一下加入RTC的处理方法
1:底层初始化HAL_Init();重置所有外设,FLASH 和Systick,
2:系统时钟配置SystemClock_Config();STM32L4最高时钟可跑到80M,我在STM32Cube中时钟设置为72MHZ因为现在只是测试低功耗对系统的运行速度无太大要求
3:开启所用时钟MX_GPIO_Init();在这我开启了所有时钟,并在此处将没
用到的引脚全部设置为模拟输入,外设我只用了串口.并开启外部中断。
4:串口的配置及初始化,按照常规配置即可
5:RTC初始化目的主要是为了开启RTC的时钟(如果需要RTC时钟需要另加时间配置函数,闹钟函数也可直接在此设置)
5:进入低功耗模式前的准备,首先在此函数中禁用Debug调试端口,关闭所有时钟。关闭串口,然后进入低功耗模式。
6:进入低功耗模式后,系统等待RTC计数减到0,发生中断,然后进入相应的中断服务函数。
7:在服务函数中,重新初始化底层硬件并配置时钟,初始化所用外设,具体的函数功能在这添加,清除WKAEUP_pin标志,然后再次进入低功耗模式(除Shutdown和Standy)
加入外部中断唤醒,也只需开启对应引脚外设,开启中断,配置优先级,然后在低功耗模式只能上升沿触发中断,在中断服务函数中的处理与RTC唤醒中断服务函数一样。
因为复位和中断都不会引起RTC计数器的异样,所以这两个中断只要不是同时发生是不会产生冲突的。
综合来看,依需求来选择,
一:第一种方案可以使用RTC闹钟,实现按天唤醒,或按星期唤醒,当然RTC与Shutdown和Standy结合可以实现超低低功耗0.4uA左右,并加上这两种模式的唤醒复位的特性,也可实现周期唤醒,就是这样每唤醒一次都需要系统配置相应的RTC寄存器,时间长了可能对MCU有损坏
二:在就是使用wake计数器周期唤醒,搭配STOP模式,唤醒周期方便调节,精确度为S,电流达到1.4uA。
还有存在的一些问题就是:
1:串口和下载器对电流的测量很大,测量时要去掉。
2:然后下载完程序后需要重新上电,要不电流可能会有误。
3:然后就是外部中断我测试的时候硬件连接可能不规范,有些不稳定。
4:然后就是功耗问题,与官方的这几种功耗模式多多少少的有点差距,软件部分对比官方测试代码,没有什么本质上的区别。猜测可能是硬件部分,也有可能官方说的是MCU的功耗。

具体的工程:https://download.csdn.net/download/qq_41756562/13610025

STM32L4系列单片机的低功耗问题相关推荐

  1. Stm8L系列单片机的低功耗

    Stm8L系列单片机的低功耗有五种模式: wait模式 Low power run模式 Low power wait模式 Active-halt with full RTC模式 Halt模式 最低功耗 ...

  2. 【STM32】HAL库开发之开启STM32L4系列单片机的FPU

    STM32L4 属于 Cortex M4F 架构,带有 32 位单精度硬件 FPU,支持浮点指令集,相对于Cortex M0 和 Cortex M3 等,高出数十倍甚至上百倍的运算性能. 而我们在处理 ...

  3. STM32L4系列单片机ADC通过内部参考电压精确计算输入电压

    以STM32L476为例,VREFINT与内部ADC1_INP0相连 当VDDA与VREF+引脚连在一起时,该电压可能波动,这将导致ADC转换误差很大,因此可通过利用单片机内部的参照电压来算出该时刻的 ...

  4. STM32L4+超低功耗单片机介绍,参考手册,培训教程,视频

     ST扩展了STM32L4产品系列及其性能.最新的STM32L4+系列单片机在继承了原有L4优越的超低功耗特性的同时,还提供了更加优越的性能(最高频率可达120 MHz).更大容量的内置存储器(高 ...

  5. 主题:瑞萨16 位R8C/TINY 系列单片机

    主题:瑞萨16 位R8C/TINY 系列单片机– 小型,少脚数,高速,高效能,含闪存的MCU 在线问答: [问:winalltech] WDT通过软件来开关,有可能不可靠吗?会因为干扰而造成其突然关闭 ...

  6. 瑞萨16 位R8C/TINY 系列单片机

    主题:瑞萨16 位R8C/TINY 系列单片机– 小型,少脚数,高速,高效能,含闪存的MCU 在线问答: [问:winalltech] WDT通过软件来开关,有可能不可靠吗?会因为干扰而造成其突然关闭 ...

  7. 《LPC入门笔记》之LPC系列单片机低功耗概述

    作为一个Kinetis的老粉,现在也与时俱进开始研究LPC系列的单片机了.在看低功耗相关的材料时,整理了一则学习笔记.如有不当之处,请大家提意见,共同学习. 功耗管理,对于数字模块就是管理时钟,对于模 ...

  8. d06调试详细说明_PIC系列单片机配置字详细介绍(长期实践总结的压箱底资料)

    (注:本文档主要根据PIC16F193X数据手册编写,对于其他型号的单片机,其配置字可能略有不同,此外本文部分参考了PIC18F78K22数据手册,因而部分注释了两个系列单片机的区别) 1.FCMEN ...

  9. MSP430系列单片机的DMA使用全面认识

    快速参考目录 DMA的解释 MSP430系列单片机中的DMA MSP430 DMA控制器的特性 DMA的应用 明确你得需求 一个能用起来的官方例程 待续 DMA的解释 DMA(Direct Memor ...

最新文章

  1. R语言绘制分块区域热力图
  2. PHP运算符种类很多 主要有,PHP运算符的类别概览
  3. linux卸载android studio,mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案
  4. 2018年马哥Linux
  5. 2019年互联网寒冬,带你走进真实的面试杀出重围
  6. Flex 加载Base64编码的二进制字符串图片
  7. 游戏开发计划——数据元素设计(技能)
  8. win10下pyt3.7安装scrapy后cmd运行相关命令SyntaxError: invalid syntax 解决办法
  9. 太强!拿下腾讯公司技术突破奖,腾讯云 RTC 实时音视频技术到底了有多牛?...
  10. MATLAB实现 有限长序列的线性卷积和圆周卷积
  11. VM设置Ubuntu窗口自适应大小
  12. 周总结2022.1.10-2022.1.16
  13. 后退一步 小程序_微信小程序返回上一级页面的实现代码
  14. 修复Linux 的GRUB引导文件
  15. 宝塔linux升级,宝塔linux面板去除后台强制更新
  16. Opencv数字识别(详细思路介绍)
  17. Java 刷题11-6
  18. 项目方案讨论会流程_讨论本文可能的解决方案
  19. IDEA如何上传java项目到github仓库里
  20. 湖北大学计算机类怎样,湖北成考学校和专业有哪些?有必要挑学校和专业吗?...

热门文章

  1. 跨平台的桌面应用开发,技术框架选择
  2. Spring Cloud入门-Nacos实现注册和配置中心(Hoxton版本)
  3. HCIE证书真的有用吗?
  4. Tomcat 自定义启动startup.bat文件
  5. 免费短信验证码SDK是一款由移动开发服务平台Mob(前身ShareSDK)正式推出“全球短信验证码解决方案”
  6. Qt pro的一些小用法(qmake)
  7. java ajax同步请求,成都汇智动力-java ajax实现异步同步请求全面详解
  8. 自动化脚本之SCRT
  9. Jenkins的简单使用,小白式教程
  10. 手机组态软件利用4G网络直接通信三菱E700变频器