STM32-笔记43-低功耗

一、什么是低功耗?

        低功耗‌是指通过优化设计和采用特定的技术手段,降低电子设备在运行过程中消耗的能量,从而延长电池寿命、提高性能和减少发热。低功耗设计主要从芯片设计系统设计两个方面进行,旨在减少所有器件的功率损耗,从而降低总体功耗‌。

低功耗_百度百科

        STM32的低功耗(low power mode)特性是其嵌入式处理器系列的一个重要优势,特别适用于需要长时间 运行且功耗敏感的应用场景,如便携式设备、物联网设备、智能家居系统等。

        在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。

二、STM32电源系统结构

三、低功耗模式介绍

STM32具有运行、睡眠、停止和待机四种工作模式。

上电后默认是在运行模式,当内核不需要继续运行时,可以选择后面三种低功耗模式。

3.1 睡眠模式(sleep mode)

        在睡眠模式下,CPU停止工作,但所有外设(如ADC、通信接口等)仍然运行,时钟继续运转。这适用于需要暂时关闭CPU但外围设备需要继续工作的场景。

模式特点:

  • 对系统影响小,但是节能效果最差。
  • 在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。

进入条件:

  • 当系统控制寄存器中的SLEEPDEEP位被清除(通常为0),并且SLEEPONEXIT位根据需求设置时(如果设置为1,则在最低优先级中断处理程序退出时进入Sleep模式;如果为0,则执行WFI或WFE时立即进入)。
  • 执行WFI(Wait For Interrupt)或WFE(Wait For Event)指令来进入。

唤醒条件:

  • 任意一个中断都能将系统从Sleep模式唤醒。
  • 如果执行WFE指令进入Sleep模式,则一旦发生唤醒事件时,MCU将唤醒。

3.2 停机模式(stop mode)

        在停机模式下,CPU和核心外围设备的时钟会停止,但部分唤醒源(如外部中断和某些定时器)仍然运行。这适用于需要长时间等待外部事件唤醒的应用,如等待用户输入或外部信号。Stop模式实现了非常低的功耗,同时保留了SRAM和寄存器的内容。

模式特点

  • 节能效果好,程序不会复位。但恢复时间较长(比如震荡器需要重新起震等)。
  • 在停机模式下,所有的I/O引脚都保持它们在运行模式时的状态。
  • 退出停止模式,HSI RC振荡器被选为系统时钟

进入条件:

  • 需要将SLEEPDEEP位设置为1以进入深度睡眠模式,然后通过设置电源控制/状态寄存器(PWR_CSR)中的PDDS位为0来选择进入Stop模式。
  • 根据需求设置LPDS位(LPDS = 0:表示在深睡眠模式下,电压调节器保持开启状态;LPDS = 1:表示在深睡眠模式下,电压调节器进入低功耗模式。)。
  • 执行WFI(Wait For Interrupt)或WFE(Wait For Event)指令来进入。
  • 在进入Stop模式之前,通常需要关闭不必要的外设时钟,并保存需要保留的状态信息。

唤醒条件:

  • Stop模式可以通过外部中断(如按键中断、USART接收中断等)唤醒。
  • RTC闹钟事件、USB唤醒、以太网(ETH)唤醒等也可以作为唤醒源,但这些通常需要通过外部中断来触发。


3.3 待机模式(standby mode)


        在该模式下,CPU、外围设备和时钟都被关闭,只保留唤醒逻辑和备份寄存器。这适用于不需要保留RAM内容且可以从复位状态恢复的设备,常见于需要极低功耗且稀疏唤醒的应用。Standby模式是STM32中功耗最低的模式之一。

模式特点:

  • 节能效果最好,但程序会复位,只有少数条件唤醒。
  • 在Standby模式下,大部分IO引脚处于高阻态,只有复位引脚、TAMPER引脚(如果配置为防侵入或校准输出)和WKUP引脚可用作唤醒源。

进入条件:

  • Standby模式进入前,需要清除电源控制/状态寄存器(PWR_CSR)中的WUF位,以确保没有未处理的唤醒标志。
  • 将SLEEPDEEP位设置为1以进入深度睡眠模式,并设置PDDS位为1来选择进入Standby模式。
  • 执行WFI或WFE指令进入Standby模式。

唤醒条件:

  • Standby模式可以通过WKUP引脚的上升沿唤醒。
  • RTC闹钟事件也可以作为唤醒源。
  • 独立看门狗(IWDG)复位和NRST引脚上的外部复位也可以唤醒STM32,但这通常用于系统复位而非低功耗唤醒。

图片展示如下:

四、寄存器及库函数介绍

关于低功耗模式都集中在电源控制模块下

4.1 电源控制寄存器(PWR_CR)

4.2 电源控制/状态寄存器(PWR_CSR)

 

4.3 系统控制寄存器(SCB_SCR)

System control register (SCB_SCR)

4.4 库函数

    //使能电源时钟(关闭电压调节器)
    __HAL_RCC_PWR_CLK_ENABLE();
    //使能WKUP引脚唤醒功能
    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
    //清除唤醒标记,否则会持续唤醒,无法进入待机模式
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

五、低功耗实验

实验目的:

1. 按下按键 2 ,进入低功耗模式(睡眠、停机、待机);
2. 按下按键 1 ,退出低功耗模式;
3. 正常模式下, LED1 闪烁;
4.进入停机模式, LED2 长亮,退出停机模式,则 LED2 熄灭;
我们需要有一种方式,触发之后可以同时对三种低功耗模式进行唤醒,通过如下图可知
睡眠模式对任一中断都可以唤醒,停机模式对任一外部中断可以唤醒,待机模式对WKUP引脚产生上升沿可以唤醒。这里可以对WKUP引脚产生上升沿之后,设置中断处理函数,即可产生中断,并且WKUP引脚产生 的中断是一种外部中断。
复制项目文件19-串口打印功能
重命名为57-低功耗

打开项目

加载文件

5.1 睡眠模式:

在lpwr.c函数中

//睡眠模式
void lpwr_enter_sleep(void)
{
    HAL_SuspendTick();//使用WFI,必须关闭滴答定时器中断,否则会把整个程序唤醒
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
}

在主函数中

uint8_t i=0;
    while(1)
    {
        if(key_scan() == 2)
        {
            lpwr_enter_sleep();
        }
        if(i%20 == 0)
            led1_Toggle();
        i++;
        delay_ms(10);
    }

测试睡眠模式时,会出现什么现象?

烧录代码之后led1以200ms的频率疯狂闪烁,此时摁下按键2,就会进入睡眠模式,led1可能会瞬间保持当前状态进入睡眠模式(可能是亮灯,也可能是灭灯状态),然后摁下按键1(WKUP引脚产生上升沿),就会通过中断退出睡眠模式,这时led1再次以200ms的状态疯狂闪烁。

在lpwr.c文件中HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);函数,查看库文件发现:

翻译是:

(电压)调节器:在睡眠模式下是不使用(电压)调节器的,但是为了保持一致这里要使用这个参数。

当使用WFI入口时,如果不希望滴答定时器中断唤醒源,则必须取消勾选滴答中断。

5.2 停机模式:

在lpwr.c函数中

void lpwr_enter_stop(void)
{
    //关闭滴答定时器
    HAL_SuspendTick();
    //点亮led2,使其知道进入了停机模式
    led2_ON();
    //直接进入停机模式
    HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
    //熄灭led2,使其知道退出了停机模式
    led2_OFF();
}

在主函数中

    uint8_t i=0;
    while(1)
    {
        if(key_scan() == 2)
        {
            lpwr_enter_stop();
        }
        if(i%20 == 0)
            led1_Toggle();
        i++;
        delay_ms(10);
    }

测试停机模式,会出现什么现象?

        烧录上面代码会发现led1以200ms的速度疯狂闪烁,此时摁下按键2,led1会立刻以当前状态进入停机模式(可能是亮灯,也可能是灭灯状态),并且led1常亮,当摁下按键1时,led1从常亮状态变成熄灭状态,led2会从以200ms的闪烁的状态变成慢速度闪烁。

为什么led2会从以200ms的闪烁的状态变成慢速度闪烁?为什么不是原速度闪烁?

        因为停机模式第三条:退出停止模式,HSI RC振荡器被选为系统时钟。在原来振荡器是以系统时钟的频率进行震荡(72MHZ),当进入停止模式之后,再退出一次停止模式,振荡器会选择HSI RC(8MHZ),所以led2灯闪烁的状态会下降,如果需要变回原来的频率,需要在退出停止模式之后,再次配置系统时钟为振荡器。代码如下:

5.3 待机模式:

在lpwr.c函数中

//待机模式
void lpwr_enter_standby(void)
{
    //使能电源时钟(关闭电压调节器)
    __HAL_RCC_PWR_CLK_ENABLE();
    //使能WKUP引脚唤醒功能
    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
    //清除唤醒标记,否则会持续唤醒,无法进入待机模式
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
    //进入待机模式
    HAL_PWR_EnterSTANDBYMode();
    //测试:看看代码会不会运行到下面
    led2_ON();
}

在主函数中

while(1)
    {
        if(key_scan() == 2)
        {
            lpwr_enter_standby();
        }
        if(i%20 == 0)
            led1_Toggle();
        i++;
        delay_ms(10);
    }

测试待机模式时,会出现什么现象?

        烧录代码之后,led1会以200ms的频率疯狂闪烁,当摁下按键2时,led1会立刻以当前状态进入待机模式(可能是亮灯,也可能是灭灯状态),然后摁下按键1之后,led1再次以200ms的频率疯狂闪烁,并且,在此期间,led2没有亮。

led2为什么没有亮?

        退出一次待机模式之后,代码会从主函数重新执行,而不是继续执行,所以led2没有亮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 镜像制作原理 做一个自己的docker镜像

一.手动制作镜像 启动容器进入容器定制基于容器生成镜像 1.启动容器 启动容器之前我们首先要有一个镜像,这个镜像可以是从docker拉取,例如:现在pull一个ubuntu镜像到本机。 docker pull ubuntu:22.04 我们接下来可以基于这个容器进行容器…

【Ubuntu 24.04】虚拟机常见问题解决

1.24开启3D加速黑屏 参考文章:Ubuntu24开机黑屏,VMware卡死,虚拟机繁忙解决方案 没有3D加速就没有动画,所以我们需要开启3D加速,但是直接开启3D加速会黑屏 由于Ubuntu24内部的图形加速驱动异常,因此需要更新…

辅助云运维

为客户提供运维支持,保障业务连续性。 文章目录 一、服务范围二、服务内容三、服务流程四、 服务交付件五、责任分工六、 完成标志 一、服务范围 覆盖范围 云产品使用咨询、问题处理、配置指导等; 云产品相关操作的技术指导; 云相关资源日常…

灵活妙想学数学

灵活妙想学数学 题1:海星有几只? 一共有12只海洋生物,分别是5只脚的海星,8只脚的章鱼和10只脚的鱿鱼,这些海洋动物的脚一共有87只,每种生物至少有1只,问海星有几只? 解&#xff1a…

Java中的并发工具类:让多线程编程更轻松

Java中的并发工具类:让多线程编程更轻松 1. 引言:多线程编程的“痛” 多线程编程是Java开发中的一大难点,尤其是在高并发场景下,稍有不慎就会遇到线程安全问题、死锁、性能瓶颈等问题。比如: public class Counter …

Vue3使用vue-count-to数字滚动模块报错解决方案

小伙伴们是不是遇到了vue3项目使用vue-count-to出现报错的问题 报错如下: TypeError: Cannot read properties of undefined (reading _c) 这个错误信息具体是说没读取到_c的属性 具体不清楚是什么原因,排查还得去看源码,所以我们来解决&a…

idea上git log面板的使用

文章目录 各种颜色含义具体的文件的颜色标签颜色🏷️ 节点和路线 各种颜色含义 具体的文件的颜色 红色:表示还没有 git add 提交到暂存区绿色:表示已经 git add 过,但是从来没有 commit 过蓝色:表示文件有过改动 标…

一分钟学习数据安全——数据安全的核心概念CIA以及安当解决方案

数据安全三要素是指保密性(Confidentiality)、完整性(Integrity)和可用性(Availability),它们是信息安全领域的核心概念,旨在确保信息的安全和可信度。这边文章用一分钟的时间&#…

Electron 开发者的 Tauri 2.0 实战指南:文件系统操作

作为 Electron 开发者,我们习惯了使用 Node.js 的 fs 模块来处理文件操作。在 Tauri 2.0 中,文件系统操作被重新设计,采用了 Rust 的安全特性和权限系统。本文将帮助你理解和重构这部分功能。 文件操作对比 Electron 的文件操作 在 Electr…

1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录 01. Java中的集合体系 02. 单列集合体系​ 1. Collection系列集合的遍历方式 (1)迭代器遍历(2)增强for遍历​编辑(3)Lambda表达式遍历 03.List集合详解 04.Set集合详解 05.总结 Collection系列…

事件监听,事件类型

点击按钮实现 盒子关闭 随机点名案例 先给开始按钮添加点击事件 获取显示名字的 div 和 开始按钮的 div给开始按钮添加点击事件,设置定时器,每隔35ms内获取一个数组长度内的随机数,将显示名字的 div内的内容替换为该随机数作为下标的数组的内…

基于PyQt - 6的医疗多模态大模型医疗研究系统中的创新构建与应用(上 .文章部分)

一、引言 1.1 研究背景与意义 在当今数智化时代,医疗行业正经历着深刻的变革,对智能化、高效化的需求日益迫切。传统的医疗模式在面对海量的医疗数据、复杂的诊断流程以及个性化的治疗需求时,逐渐显露出局限性。随着人工智能技术的飞速发展,多模态大模型作为一种前沿技术…

微软震撼发布:Phi-4语言模型登陆Hugging Face

近日,微软公司在Hugging Face平台上正式发布了其最新的语言模型Phi-4,这一发布标志着人工智能技术的又一重要进步。Phi-4模型以其140亿参数的高效配置,在复杂推理任务中表现出色,特别是在数学领域,更是展现出了卓越的能…

深度解析Linux中关于操作系统的知识点

操作系统概述与核心概念 任何计算机系统都包含一个基本的程序集合,成为操作系统OS 操作系统是一款进行软硬件管理的软件 操作系统包括: 内核(进程管理,内存管理,驱动管理) 其他程序(例如数据…

LLM在事实性和时效性方面问题解决办法

LLM在事实性和时效性方面问题解决办法 以及进行可靠评估的一些方法 一、解决事实性问题的技术方法 知识图谱融合与增强 方法:将知识图谱与LLM集成,在模型生成内容时,实时查询知识图谱以确保信息的准确性。例如,当LLM生成关于历史事件的描述时,它可以查询历史知识图谱,获…

IEC103 转 ModbusTCP 网关

一、产品概述 IEC103 转 ModbusTCP 网关型号 SG-TCP-IEC103 ,是三格电子推出的工业级网关(以下简 称网关),主要用于 IEC103 数据采集、 DLT645-1997/2007 数据采集, IEC103 支持遥测和遥 信,可接…

202312 青少年软件编程等级考试C/C++ 二级真题答案及解析(电子学会)

第 1 题 统计指定范围里的数 给定一个数的序列S,以及一个区间[L,R],求序列中介于该区间的数的个数,即序列中大于等于L且小于等于R的数的个数。 时间限制:1000 内存限制:65536 输入 第一行1个整数n,表示序列的长度。(0<n≤10000) 第二行n个正整数,表示序列里的每…

通过将模型权重的矩阵表示为低秩矩阵,可以减少需要调整的参数数量,通俗易懂的解释,不懂你爬网线打我

通过将模型权重矩阵表示为低秩矩阵&#xff0c;可以减少需要调整的参数数量&#xff0c;原因在于低秩矩阵的结构本身就比高秩矩阵更“紧凑”&#xff0c;即它们需要的独立参数更少。具体来说&#xff0c;低秩矩阵的结构可以通过减少模型的自由度&#xff08;独立参数的数量&…

C++ 数据结构:基本概念、时间复杂度、空间复杂度

数据结构&#xff1a;是指数据的存储以及存储方式&#xff0c;决定了数据的物理结构和逻辑结构&#xff0c;良好的数据结构可以提高程序的存储、查询、修改效率&#xff0c;降低复杂度和错误率。 算法&#xff1a;解决问题的步骤和方法&#xff0c;一个好的算法应具有高效、简…

如何监控和防范小红书笔记详情API的安全风险?

流量监控与异常检测 请求频率监测&#xff1a; 建立一个系统来记录 API 的请求频率。可以通过在服务器端设置计数器或者使用专业的监控工具来实现。例如&#xff0c;对于每个 API 调用者&#xff08;可以通过 API 密钥或者用户标识来区分&#xff09;&#xff0c;记录它们在单…