以下转载自安富莱电子: http://forum.armfly.com/forum.php

低功耗是 MCU 的一项重要的指标,比如某些可穿戴的设备,其携带的电量有限,如果整个电路消耗
的电量特别大的话,就会经常出现电量不足的情况,影响用户体验。

STM32F103 睡眠模式介绍
说明:在 FreeRTOS 系统上面实现睡眠方式仅需了解这里讲解的知识基本就够用了,更多睡眠方式的
知识请看 STM32F103 参考手册和 Cortex-M3 权威指南。
在系统或电源复位以后,微控制器处于运行状态。当 CPU 不需继续运行时,可以利用多种低功耗模
式来节省功耗,例如等待某个外部事件时,用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源
等条件,选定一个最佳的低功耗模式。
STM32F103 有三种低功耗模式:
 睡眠模式(Cortex™-M3 内核停止,所有外设包括 Cortex-M3 核心的外设,如 NVIC、系统滴答
定时器 Systick 等仍在运行)。
 停机模式(所有的时钟都已停止)。
 待机模式(1.8V 电源关闭)。

如何进入睡眠模式
通过执行 WFI(等待中断)或 WFE(等待事件)指令进入睡眠状态。根据 Cortex™-M3 系统控制
寄存器中的 SLEEPONEXIT 位的值,可以通过两种方案选择睡眠模式进入机制:
 SLEEP-NOW:如果 SLEEPONEXIT 位被清除,当 WFI 或 WFE 被执行时,微控制器立即进入睡眠模式。
 SLEEP-ON-EXIT:如果 SLEEPONEXIT 位被置位,系统从最低优先级的中断处理程序中退出时,微控
制器就立即进入睡眠模式。
实际应用中我们采用 WFI 指令进入睡眠模式,睡眠模式的进入机制是采用的 SLEEP-NOW。 因为系
统复位上电后 SLEEPONEXIT 位是被清除的,所以这个位也不需要专门的去设置。 另外在睡眠模式下,所
有的 I/O 引脚都保持它们在运行模式时的状态。
在 FreeRTOS 系统上,不使用 tickless 低功耗模式的话,我们可以将 WFI 指令放到空闲任务里面实
现。 不过,既然有了 tickless 模式,基本就不需要采用这种方法了。

如何退出睡眠模式
由于我们是采用指令 WFI 进入睡眠模式,那么任意一个被嵌套向量中断控制器 NVIC 响应的外设中断
都能将系统从睡眠模式唤醒。并且该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。
在 FreeRTOS 系统上,主要是周期性执行的系统滴答定时器中断会将系统从睡眠态唤醒,当然,其它
的任意中断也可以将其从睡眠态唤醒。

STM32F4xx 睡眠模式介绍
说明:本小节的内容含 STM32F407 和 STM32F429,在 FreeRTOS 系统上面实现睡眠方式仅需了解
这里讲解的知识基本就够用了,更多睡眠方式的知识请看 STM32F4xx 参考手册和 Cortex-M4 权威指南。
默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,CPU 通过 HCLK 提
供时钟,并执行程序代码。系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)
节省功耗。由用户根据应用选择具体的低功耗模式,以在低功耗、短启动时间和可用唤醒源之间寻求最佳
平衡。

STM32F4xx 有三个低功耗模式:
 睡眠模式(Cortex™-M4F 内核停止,外设保持运行)
 停机模式(所有时钟都停止)
 待机模式(1.2 V 域断电)

如何进入睡眠模式
执行 WFI(等待中断)或 WFE(等待事件)指令即可进入睡眠模式。根据 Cortex™-M4F 系统控
制寄存器中 SLEEPONEXIT 位的设置,可以通过两种方案选择睡眠模式进入机制:
 立即睡眠:如果 SLEEPONEXIT 位清零, MCU 将在执行 WFI 或 WFE 指令时立即进入睡眠模式
 退出时睡眠:如果 SLEEPONEXIT 位置 1,MCU 将在退出优先级最低的 ISR 时立即进入睡眠模式。

实际应用中我们采用 WFI 指令进入睡眠模式,睡眠模式的进入机制是采用的立即睡眠。 因为系统复位
上电后 SLEEPONEXIT 位是被清除的,所以这个位也不需要专门的去设置。 另外在睡眠模式下,所有的 I/O
引脚都保持它们在运行模式时的状态。
在 FreeRTOS 系统上,不使用 tickless 低功耗模式的话,我们可以将 WFI 指令放到空闲任务里面实
现。 不过,既然有了 tickless 模式,基本就不需要采用这种方法了。

如何退出睡眠模式
由于我们是采用指令 WFI 进入睡眠模式,那么任意一个被嵌套向量中断控制器 NVIC 响应的外设中断
都能将系统从睡眠模式唤醒。并且该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。
在 FreeRTOS 系统上,主要是周期性执行的系统滴答定时器中断会将系统从睡眠态唤醒,当然,其它
的任意中断也可以将其从睡眠态唤醒。

低功耗模式的调试支持
要进入低功耗模式需要调用指令 WFI 或 WFE。
STM32 支持多个低功耗模式,这些模式可以禁止 CPU 时钟或降低 CPU 功耗。 内核不允许在调试期
间关闭 FCLK 或 HCLK,因为调试期间需要使用它们进行调试连接,因此必须保持激活状态。 STM32 集
成了特殊方法,允许用户在低功耗模式下调试软件。 为实现这一功能,调试器必须先设置一些配置寄存器
来改变低功耗模式的特性。
 在睡眠模式下,调试器必须先置位 DBGMCU_CR 寄存器的 DBG_SLEEP 位。这将为 HCLK 提供与
FCLK(由代码配置的系统时钟)相同的时钟。
调用库函数:DBGMCU_Config(DBGMCU_SLEEP, ENABLE);即可
 在停机模式下,调试器必须先置位 DBG_STOP 位。这将激活内部 RC 振荡器,在停止模式下为 FCLK
和 HCLK 提供时钟。
调用库函数:DBGMCU_Config(DBGMCU_STOP, ENABLE);即可

如何有效降低睡眠模式下的功耗
设计低功耗主要从以下几方面着手:
 关闭可以关闭的外设时钟。
 降低系统主频。
 注意 I/O 的状态,因为睡眠模式下,所有的 I/O 引脚都保持它们在运行模式时的状态。
 如果此 I/O 口带上拉,请设置为高电平输出或者高阻态输入。
 如果此 I/O 口带下拉,请设置为低电平输出或者高阻态输入。

 注意 I/O 和外设 IC 的连接。
 测试低功耗的时候,一定不要连接调试器,更不能边调试边测电流。

FreeRTOS 低功耗之睡眠模式的更多相关文章

  1. FreeRTOS 低功耗之 tickless 模式

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 本身支持的低功耗模式 tickless 实现方法,tickless 低功 ...

  2. FreeRTOS 低功耗之停机模式

    以下转载自安富莱电子: http://forum.armfly.com/forum.php STM32F103 如何进入停机模式在 FreeRTOS 系统中,让 STM32 进入停机模式比较容易,调用 ...

  3. ESP8266的低功耗方案-睡眠模式

    在某些时候我们设计的产品可能不具备持久供电的环境,那通常会采用锂电池.干电池一类的轻便型的非持久性电源.当遇到这种情况时,产品的续航能力可能就会成用户评估产品的一个重要指标,加大电池容量当然是最为直接 ...

  4. 第21章 RTX 低功耗之睡眠模式

    低功耗是 MCU 的一项非常重要的指标,比如某些可穿戴的设备,其携带的电量有限,如果整个电路消耗的电量特别大的话,就会经常出现电量不足的情况,影响用户体验. 本章节为大家讲解 M3/4的低功耗方式之睡 ...

  5. FreeRTOS 低功耗之待机模式

    STM32F103 如何进入待机模式在 FreeRTOS 系统中,让 STM32 进入待机模式比较容易,调用固件库函数PWR_EnterSTANDBYMode 即可. STM32F103 如何退出待机 ...

  6. FreeRTOS低功耗模式

    在系统或电源复位以后,微控制器处于运行状态.当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时,用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳 ...

  7. 第22章 RTX 低功耗之停机模式

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php STM32F103 停机模式介绍 本章节我们主要讲解停机模式,停机模式是在 Cortex™-M3 的深睡 ...

  8. CentOS 7合盖后黑屏但不进入睡眠模式修改

    CentOS 7合盖后黑屏但不进入睡眠模式修改 systemd 能够处理某些电源相关的 ACPI事件,你可以通过从 /etc/systemd/logind.conf 以下选项进行配置: HandleP ...

  9. STM32——项目需求之低功耗的停机模式

    在说低功耗之前,先要明白一个东西,那就是stm32中的事件和中断. 事件是中断的触发源,开放了对应的中断屏蔽位,则事件可以触发相应的中断.在STM32中,中断与事件不是等价的,一个中断肯定对应一个事件 ...

随机推荐

  1. Redis学习(7)-通用命令

    keys pattern: 获取所有与pattern匹配的key,返回所有与该key匹配的keys. 通配符: *表示任意一个或多个字符串. ?表示一个字符. 例如: 查询所有的key:keys * ...

  2. zookeeper单节点和多节点配置

    单机单节点模式 zookeeper解压, 放到 /opt/zookeeper/下, 新建一个latest的软链 $ latest 将 conf/zoo-sample.cfg 重命名为 zoo.cfg, ...

  3. 架构-LAMP特级学习(网站大访问量解决方案)

    网站运营要面对的四个问题总结: 1.大访问量(主用负载均衡技术) 2.大存储量 3.访问速度 4.服务器监控 一.大访问量解决方案 超级计算机 = 负载均衡 + 集群 0.反向代理(Nginx等实现) ...

  4. Python 死循环和嵌套循环

    何为死循环:在编程中,一个无法靠自身的控制终止的循环被称为死循环. 死循环的使用:死循环并非一无是处,C语言中死循环while true或 while 1 是单片机编程的普遍用法,死循环一直运行等待中 ...

  5. HDU 2604 Queuing (矩阵乘法)

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  6. Android 系统 root 破解原理分析

    现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...

  7. 【Linux】撷取命令grep

    什么是撷取命令啊?说穿了,就是将一段数据经过分析后,取出我们所想要的.或者是经由分析关键词,取得我们所想要的那一行! 不过,要注意的是,一般来说,撷取信息通常是针对『一行一行』来分析的, 并不是整篇信 ...

  8. URL 长度有限制吗?

    众所周知,传递小量参数(在没有其他原因,例如隐藏参数值的情况下)推荐使用GET方法,传递大量参数推荐使用POST方法.原因是什么呢? 原因是传说GET方法是通过URL来传递,而URL的长度是受限的,而 ...

  9. 转:http协议学习

    协议详解篇 2.1 HTTP/1.0和HTTP/1.1的比较 RFC 1945定义了HTTP/1.0版本,RFC 2616定义了HTTP/1.1版本. 笔者在blog上提供了这两个RFC中文版的下载地 ...

  10. Form_Form Builder的常用变量(概念)

    2014-12-30 Created By BaoXinjian