stm32标准库实现低功耗

一、概述

stm32不同系列芯片支持的低功耗模式各有差异,本文以F103系列芯片为例,简单讲解不同低功耗模式的特点和使用方法。

二、低功耗

简述

默认情况下,系统或电源复位后,微控制器处于Run模式。当CPU不需要保持运行时(例如等待外部事件时),可以使用几种低功耗模式来节省电源。这取决于用户选择的模式,以提供低功耗、较短启动时间和可用的唤醒源之间的最佳折衷。

stm32f10xxx 设备有三种低功耗模式:

  • 睡眠模式
    这种模式会关闭cpu时钟,但是所有外设包括M3内核的外设(NVIC、SysTick等等)都不会受到影响,保持运行
  • 停止模式
    所有时钟都会关闭
  • 待机模式
    1.8供电区域断电

另外,mcu在运行模式(run)下也可以通过以下方式降低功耗:

  • 降低系统时钟频率
  • 关闭一些不使用的外设的时钟

上面这三种低功耗模式的具体描述可以看下面这个图,觉得阅读英文不方便的话请自行翻译,我觉得这更有助于你去理解这几个模式的特点。

下面这张表更好的汇总了各种低功耗模式的特点:

详细介绍

下面会简单介绍各种降低功耗的方法,包括run、sleep、stop、standby。

run模式下

1、Slowing down system clocks(run模式下降低功耗)

run模式下,我们可以通过对预分频器编程来降低系统时钟(SYSCLK, HCLK, PCLK1, PCLK2);
在进入sleep模式之前,我们也可以对预分频器编程来降低外设时钟。

详细请查阅RCC_CFGR寄存器,这里不展开描述。

2、 Peripheral clock gating(外围时钟门控)

在Run模式下,每个外设和存储器的HCLK和PCLKx可以随时停止,以降低功耗。
在sleep模式下,在执行WFI或者WFE内核指令之前我们可以关闭一些不需要使用的外设时钟来进一步降低功耗。

低功耗模式下(分为sleep、stop、standby)

1、sleep mode

进入sleep模式

通过执行WFI (Wait For Interrupt)或WFE (Wait For Event)指令进入Sleep模式。根据Cortex®-M3系统控制寄存器中的SLEEPONEXIT位,有两种选项可用于选择Sleep模式进入机制:

  • Sleep-now:如果清除SLEEPONEXIT位,则在执行WFI或WFE指令时,MCU马上进入Sleep模式。

  • Sleep-on-exit:如果设置了SLEEPONEXIT位,则MCU在退出最低优先级ISR时进入Sleep模式。

    在休眠模式下,所有I/O引脚保持与运行模式相同的状态。

退出sleep模式

如果使用WFI指令进入睡眠模式,任何被NVIC确认的外设中断都可以从睡眠模式唤醒设备。

如果使用WFE指令进入Sleep模式,则在事件发生时,MCU将立即退出Sleep模式。唤醒事件可以通过以下任意一种方式产生:

  • 在外设控制寄存器中启用中断,但在NVIC中不启用,并在Cortex®-M3系统控制寄存器中启用SEVONPEND位。当MCU从WFE恢复时,必须清除外设中断悬挂位(pending)和外设NVIC IRQ通道悬挂位(pending)(在NVIC中断清除悬挂寄存器中)。

  • 在事件模式下配置外部或内部EXTI line。当CPU从WFE恢复时,由于事件行对应的挂起位没有设置,不需要清除外设中断挂起位或NVIC IRQ通道挂起位。

所有进入和退出休眠的细节汇总成以下表格:

2、stop mode

简述

停止模式是基于Cortex®-M3深度睡眠模式结合外围时钟门控。电压调节器可以配置在普通模式或低功率模式。

在停止模式下,1.8 V域中的所有时钟都停止,锁相环、HSI和HSE RC振荡器都被禁用。SRAM和寄存器的内容被保留。

在停止模式下,所有I/O引脚保持与运行模式相同的状态。

进入停止模式
  • 为了进一步减少功耗,可以设置电压调节器工作在低功耗模式,这需要配置PWR_CR的LPDS位。
  • 如果闪存编程正在进行,停止模式的进入将被延迟,直到内存访问完成。
  • 如果对APB域的访问正在进行,停止模式的进入将延迟到对APB的访问完成。

在停止模式下,可以通过编程单个控制位来选择以下特性:

  • Independent watchdog (IWDG)
  • Real-time clock (RTC)
  • Internal RC oscillator (LSI RC)
  • External 32.768 kHz oscillator (LSE OSC)

此外,ADC或DAC在停止模式下也会消耗电能,除非他们在进入停止模式之前被禁用。
要禁用它们,ADC_CR2寄存器中的ADON位和DAC_CR寄存器中的ENx位必须都写为0。

退出停止模式

当通过发出中断或唤醒事件退出Stop模式时,HSI RC振荡器被选为系统时钟。

当电压调节器在低功率模式下运行时,当从停止模式唤醒时,会产生额外的启动延迟。通过在停止模式期间保持内部调节器(这里是指电压调节器)处于ON状态,虽然减少了启动时间,但消耗更高。

下图汇总了停止模式进入和退出的细节信息。

注意:

  1. 在进入停止模式之前,要清除所有中断挂起位,如上图所述。
  2. 唤醒之后记得要重新配置系统时钟。

3、Standby mode

简述

“待机”模式可以实现最低的功耗。它基于Cortex®-M3深度睡眠模式,禁用电压调节器。导致1.8 V域下电。锁相环、HSI振荡器和HSE振荡器也处于关闭状态。除了备份域和备用电路中的寄存器外,SRAM和寄存器的内容都会丢失。

进入待机模式

在待机模式下,可以通过编程单个控制位来选择以下特性:

  • Independent watchdog (IWDG)
  • Real-time clock (RTC)
  • Internal RC oscillator (LSI RC)
  • External 32.768 kHz oscillator (LSE OSC)
退出待机模式

当外部复位(NRST引脚)、IWDG复位、WKUP引脚上升沿或RTC告警上升沿发生时,微控制器退出待机模式。
除电源控制/状态寄存器(PWR_CSR)外,所有寄存器都在Standby唤醒后重置。

从待机模式唤醒后,程序跟复位后一样重新启动。电源控制/状态寄存器(PWR_CSR)中的SBF状态标志表示MCU处于待机模式。所以程序重新运行后我们可以读取这个状态标志SBF来判断是否从待机模式唤醒。

下图汇总了待机模式进入和退出的细节信息。

注意:
在待机模式下,所有I/O引脚都是高阻态的,除了:

  • 复位引脚(仍可用)
  • 干预引脚,如果配置为干预或校准输出
  • WKUP引脚,如果使能了

调试模式

默认情况下,如果应用程序在调试功能使用时将MCU置于停止或待机模式,调试连接将丢失。这是因为Cortex®-M3内核停止工作了。

但是,通过在DBGMCU_CR寄存器中设置一些配置位,即使正在使用低功耗模式,也可以对软件进行调试。

核心不允许在调试会话期间关闭FCLK或HCLK。因为这些是调试器连接所需的,所以在调试期间,它们必须保持活动状态。单片机集成了特殊的方法,允许用户在低功耗模式下调试软件。为此,调试器主机必须首先设置一些调试配置寄存器来改变低功耗模式的行为:

  • 在Sleep模式下,DBGMCU_CR寄存器的DBG_SLEEP位必须事先由调试器设置。这将提供给HCLK与提供给FCLK相同的时钟(系统时钟以前由软件配置)。

  • 在停止模式下,DBG_STOP位必须由调试器预先设置。这将
    使内部RC振荡器时钟在停止模式下供给FCLK和HCLK。

这里不开展描述,有兴趣请参考相关用户手册。

从低功耗模式自动唤醒(AWU)

RTC可以用来从低功耗模式唤醒MCU,而不依赖外部中断(自动唤醒模式)。
RTC提供了一个可编程的时间基准,从停止或待机模式在定期间隔唤醒。
为此,可以通过对备份域控制寄存器(RCC_BDCR)中的RTCSEL[1:0]位进行编程来选择三个RTC时钟源中的两个,如下图:

  • 32.768 kHz外部晶体振荡器(LSE OSC)。该时钟源提供了精确的时间基准,功耗极低(典型情况下增加不超过1µa)。

  • RC内部振荡器(LSI RC)。该时钟源具有节省32.768 kHz晶体成本的优点。这种内部RC振荡器的设计是为了增加最小的功耗。

要使用RTC闹钟事件从Stop模式唤醒,需要:
1、将EXTI Line 17设置为对上升沿敏感
2、配置RTC产生RTC闹钟
从Standby模式中唤醒,不需要配置EXTI Line 17。

下面汇总一些各个低功耗模式的特点和使用方法:

总结

本文简单介绍了STM32F1系列低功耗模式的特点和使用方法,使本人加深了对这些低功耗模式涉及的对象的理解,便于后续的低功耗设计和应用。
好记性不如烂笔头。

参考资料

参考手册
datasheet
编程手册

浅谈stm32的低功耗模式相关推荐

  1. 浅谈STM32的DMA模块的使用

    浅谈STM32的DMA模块的使用 转自:http://blog.ednchina.com/jack_chang/123085/message.aspx http://article.ednchina. ...

  2. stm32中断优先级_浅谈STM32串口USART1的使用

    浅谈STM32串口USART1的使用 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范 ...

  3. STM32开发 -- 低功耗模式详解(2)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/98631012 上一篇文章 STM32开发 – 低功耗模式详解(1) 简单的总结了一下低功 ...

  4. STM32开发 -- 低功耗模式详解(1)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/95364296 很多单片机都有低功耗模式,STM32 也不例外.当 CPU 不需继续运行时 ...

  5. 借WS2812 PWM DMA驱动调试浅谈STM32调试思路

    借WS2812 PWM DMA驱动调试浅谈STM32调试思路 ​ 接触STM32差不多有4年了,在学校参加比赛时也需要进行各种调试工作,团队的配合也需要个人具有领域内快速定位与解决BUG的能力,前些日 ...

  6. **浅谈STM32系列单片机的零基础学习方法**

    浅谈STM32系列单片机的零基础学习方法 *很多朋友想必在零基础学习STM32F1这系列单片机时会感觉无从下手,或者不知道写程序时到底是用库函数好还是寄存器好.* 我个人认为一个零基础的朋友可以通过以 ...

  7. STM32开发 -- 低功耗模式详解

    很多单片机都有低功耗模式,STM32 也不例外.当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗. 这部分不是我负责,但是也是有必要看一下的. 参看: STM32F1开发指南-库函数版本_ ...

  8. STM32的低功耗模式

    目前的低功耗设计主要从芯片设计和系统设计两个方面考虑.随着半导体工艺的飞速发展和芯片工作频率的提高,芯片的功耗迅速增加,而功耗增加又将导致芯片发热量的增大和可靠性的下降.因此,功耗已经成为深亚微米集成 ...

  9. 浅谈企业中台商业模式及建设思路

    浅谈企业中台商业模式及建设思路 文章目录 浅谈企业中台商业模式及建设思路 前言 企业中台的定义和能力 企业中台的商业故事 企业中台的商业模式 构建企业中台时不同的企业初衷 企业中台的价值主张 企业中台 ...

  10. STM32进入低功耗模式以及唤醒(RTC+中断)

    此文献给做单片机工作的同僚,希望大家在嵌入式硬件的道路上越走越远,第一篇,望大家多多指导,不喜勿喷! 这里主要说一下,本人在调试STM32低功耗功能时遇到的问题以及解决思路与大家分享一下. 在确认使用 ...

最新文章

  1. python字典随时添加元素和值
  2. 《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略
  3. phpcms v9输出内容过滤html代码 - 代码篇
  4. java 度量_Java度量方法调用率
  5. Excel VBA获取当文件下级子目录或目录中文件
  6. 大过年的,程序员在家改bug…
  7. 水经注万能地图下载器功能大全
  8. PX4固件通过UART连接串口读取超声波,和树莓派3通信(似乎讲了怎么添加驱动程序,添加自定义msg,还有uORB消息订阅,佩服,感觉做了我想做的!)
  9. 小学计算机英语,小学英语流利读电脑版
  10. 2019寒假专题一 L CodeForces - 1260B
  11. 微信小程序开发与公众号运营有什么区别
  12. 【MATLAB】clear和clc用法
  13. 网络游戏外挂编写基础一
  14. js 仿微信投诉—引入vue.js,拆分组件为单个js
  15. 源码分析学习记录(9)——PBR材质
  16. nvidia卸载程序失败_英伟达显卡驱动安装失败怎么办?
  17. arduino: 各种Arduino基础器件的用法图
  18. windows下mysql8初始化
  19. AIX下创建jfs2文件系统并挂载到固定目录
  20. 130-Vue中的监听事件——Watch

热门文章

  1. java会签_工作流引擎会签,加签,主持人,组长模式 专题讲解
  2. 杨忠愍斗严嵩,为国为民,名垂千古
  3. java中英文排序_Java 中英文数字排序
  4. Windows触发事件ID说明
  5. ROS-moveit!仿真出现问题:Unable to identify any set of controllers that can actuate the specified
  6. 基于Redis的分布式链家二手房房源数据爬虫系统 毕业设计
  7. dns配置异常怎么修复_win10 dns异常怎么修复
  8. 泛函极值问题与变分法
  9. Win32计算器:输入出生年月日,输出周岁,星座以及距离下一次生日的天数
  10. 阿拉伯数字转换成中文数字 C++