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

本章节为大家讲解 M3/4的低功耗方式之睡眠模式在 RTX 操作系统上面的实
现方法(RTX 本身支持的 tickless 低功耗模式在第 24 章节讲解)

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

如何进入睡眠模式
通过执行 WFI(等待中断)或 WFE(等待事件)指令进入睡眠状态。根据 Cortex™-M3 系统控制
寄存器中的 SLEEPONEXIT 位的值,有两种选项可用于选择睡眠模式进入机制:

 SLEEP-NOW:如果 SLEEPONEXIT 位被清除,当 WRI 或 WFE 被执行时,微控制器立即进入睡眠模
式。
 SLEEP-ON-EXIT:如果 SLEEPONEXIT 位被置位,系统从最低优先级的中断处理程序中退出时,微控
制器就立即进入睡眠模式。
小结:本章节配套的睡眠例子我们采用 WFI 指令进入睡眠模式,睡眠模式的进入机制是采用的
SLEEP-NOW。 因为系统复位上电后 SLEEPONEXIT 位是被清除的,所有这个位也不需要专门的去设置。
另外在睡眠模式下,所有的 I/O 引脚都保持它们在运行模式时的状态。
在 RTX 系统上,我们可以将 WFI 指令放到空闲任务里面实现。

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

STM32F407 睡眠模式介绍
说明:在 RTX 系统上面实现睡眠方式仅需了解这里讲解的知识基本就够用了,更多睡眠方式的知识请
看 STM32F407 参考手册和 Cortex-M4 权威指南。
默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,CPU 通过 HCLK 提
供时钟,并执行程序代码。系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)
节省功耗。由用户根据应用选择具体的低功耗模式,以在低功耗、短启动时间和可用唤醒源之间寻求最佳
平衡。 STM32F407 有三个低功耗模式:
 睡眠模式(Cortex™-M4F 内核停止,外设保持运行)
 停止模式(所有时钟都停止)
 待机模式(1.2 V 域断电)
本章节我们主要讲解睡眠模式,而在实际的休眠模式编程时我需要清楚那些问题呢?请继续往下看。

低功耗模式的调试支持
使用 WFI 和 WFE 可以进入低功耗模式。
MCU 支持多种低功耗模式,分别可以关闭 CPU 时钟,或降低 CPU 的能耗。内核不允许在调试期间
关闭 FCLK 或 HCLK。这些时钟对于调试操作是必要的,因此在调试期间,它们必须工作。 MCU 使用一种
特殊的方式,允许用户在低功耗模式下调试代码。为实现这一功能,调试器必须先设置一些配置寄存器来
改变低功耗模式的特性。
 在睡眠模式下,调试器必须先置位 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 的连接。

 测试低功耗的时候,一定不要连接调试器,更不能边调试边测电流。

最新文章

  1. win10 开机黑屏只显示鼠标
  2. 【C-数组】
  3. 伪类link,hover,active,visited,focus的区别
  4. php课程---练习(联系人信息表)
  5. 安卓Design包之TabLayout控件的使用
  6. jquery实现全选、全不选、反选操作
  7. Android Service 服务(一)—— Service .
  8. java新手笔记7 找最小、最大、排序
  9. collection系列用法-defaultdict()
  10. 【01背包】HDU 1171 Big Event in HDU
  11. GBK和UTF8的区别
  12. Android视频录制从不入门到入门系列教程(三)————视频方向
  13. OCC上下文设置显示模式
  14. hdu1693 插头dp
  15. Docker pull下来的镜像(2)
  16. Windows更新导致的打印问题
  17. Scrapy爬取静态页面
  18. caffe的model参数解析numpy多维数组的存取
  19. java 代码块,静态代码块,构造器等的执行顺序
  20. Java,JavaScript,jQuery,jSP,js

热门文章

  1. RFID-RC522 与Arduino的连接
  2. linux之间文件传输(之scp)
  3. The method getServletContext() is undefined for the type HttpServletRequest
  4. PHP通过soap调用c#的WebService
  5. WCF异步调用
  6. IDEA 配置Gradle编译工具
  7. 利用eclipse+jdk1.8搭建Java开发环境(超具体的)
  8. Java 打印程序设计实例
  9. MySQL通过Explain查看select语句的执行计划结果触发写操作
  10. meterpreter命令大全