STM32-笔记43-低功耗

news2025/4/15 5:42:47

一、什么是低功耗?

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

低功耗_百度百科

        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.coloradmin.cn/o/2278998.html

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

相关文章

重温STM32之环境安装

缩写 CMSIS:common microcontroller software interface standard 1,keil mdk安装 链接 Keil Product Downloads 安装好后,开始安装平台软件支持包(keil 5后不在默认支持所有的平台软件开发包,需要自行下载&#…

【三国游戏——贪心、排序】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e510; int a[N], b[N], c[N]; int w[4][N]; int main() {int n;cin >> n;for(int i 1; i < n; i)cin >> a[i];for(int i 1; i < n; i)cin >> b[i…

想品客老师的第一天:值类型使用

前面两章的摘要 ECMAscript&#xff08;也就是ES&#xff09;是JavaScript的一个标准&#xff0c;就像c的c11和c99一样&#xff0c;几把的一年出一套标准 freeze()是一个对象方法&#xff0c;表示锁定、固定一个对象不可改变&#xff08;因为const对于标量不可变&#xff0c;…

leetcode刷题记录(六十七)——21. 合并两个有序链表

&#xff08;一&#xff09;问题描述 21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09;21. 合并两个有序链表 - 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a;[https://assets.leetcode…

学习微信小程序的下拉列表控件-picker

1、创建一个空白工程 2、index.wxml中写上picker布局&#xff1a; <!--index.wxml--> <view class"container"><picker mode"selector" range"{{array}}" bindchange"bindPickerChange"><view class"pick…

大象机器人发布首款穿戴式数据采集器myController S570,助力具身智能数据收集!

myController S570 具有较高的数据采集速度和远程控制能力&#xff0c;大大简化了人形机器人的编程。 myController S570 是一款可移动的轻量级外骨骼&#xff0c;具有 14 个关节、2 个操纵杆和 2 个按钮&#xff0c;它提供高数据采集速度&#xff0c;出色的兼容性&#xff0c…

【氮化镓】香港科技大学陈Kevin-单片集成GaN比较器

一、引言(Introduction) GaN HEMT的重要性 文章开篇便强调了氮化镓(GaN)高电子迁移率晶体管(HEMT)在下一代功率转换系统中的巨大潜力。GaN HEMT具备高开关频率、低导通电阻、高击穿电压以及宽工作温度范围等优势,使其成为功率电子领域的热门研究对象。这些特性使得GaN…

ComfyUI-PromptOptimizer:文生图提示优化节点

ComfyUI-PromptOptimizer 是 ComfyUI 的一个自定义节点&#xff0c;旨在优化文本转图像模型的提示。它将用户输入的提示转换为更详细、更多样化、更生动的描述&#xff0c;使其更适合生成高质量的图像。无需本地模型。 1、功能 提示优化&#xff1a;优化用户输入的提示以生成…

Linux-day08

第17章 大数据定制篇-shell编程 shell编程快速入门 shell变量 设置环境变量 把行号打开 set nu 位置参数变量 预定义变量 在一个脚本中执行了另外一个脚本所以卡住了 CTRLC退出 运算符 operator运算符 条件判断 流程控制 单分支多分支 case语句 for循环 反复的把取出来的i值…

ExpGCN:深度解析可解释推荐系统中的图卷积网络

一、引言 在当今信息爆炸的时代&#xff0c;推荐系统已成为电子商务和社交网络中不可或缺的工具&#xff0c;旨在为用户筛选出符合其兴趣的信息。传统的协同过滤&#xff08;CF&#xff09;技术通过挖掘用户与项目之间的交互记录来生成推荐&#xff0c;但这种方法简化了模型&a…

蓝桥杯3526 子树的大小 | 数学规律

题目传送门 这个题目是一个数学题&#xff0c;比较好的方法是从上往下寻找子树的最左和最右的结点&#xff0c;每层统计子结点数&#xff0c;到树的底部时打印结果。 如何求最左、最右的子结点呢&#xff1f; 对于第i个结点,其前面有i-1个结点,每个结点各有m个孩子,再加上1号结…

大语言模型的语境中“越狱”和思维链

大语言模型的语境中“越狱”和思维链 越狱(Jailbreaking) 含义:在大语言模型的语境中,“越狱”是指用户试图绕过语言模型的安全限制和使用规则,让模型生成违反伦理道德、包含有害内容(如暴力、歧视、恶意软件代码等)的输出。这些安全限制是由模型开发者设置的,目的是确…

解决leetcode第3418题机器人可以获得的最大金币数

3418.机器人可以获得的最大金币数 难度&#xff1a;中等 问题描述&#xff1a; 给你一个mxn的网格。一个机器人从网格的左上角(0,0)出发&#xff0c;目标是到达网格的右下角(m-1,n-1)。在任意时刻&#xff0c;机器人只能向右或向下移动。 网格中的每个单元格包含一个值coin…

python实现pdf转word和excel

一、引言   在办公中&#xff0c;我们经常遇收到pdf文件格式&#xff0c;因为pdf格式文件不易修改&#xff0c;当我们需要编辑这些pdf文件时&#xff0c;经常需要开通会员或收费功能才能使用编辑功能。今天&#xff0c;我要和大家分享的&#xff0c;是如何使用python编程实现…

【实践】操作系统智能助手OS Copilot新功能测评

一、引言 数字化加速发展&#xff0c;尤其人工智能的发展速度越来越快。操作系统智能助手成为提升用户体验与操作效率的关键因素。OS Copilot借助语言模型&#xff0c;人工智能等&#xff0c;对操作系统的自然语言交互操作 推出很多功能&#xff0c;值得开发&#xff0c;尤其运…

人物一致性训练测评数据集

1.Pulid 训练:由1.5M张从互联网收集的高质量人类图像组成,图像标题由blip2自动生成。 测试:从互联网上收集了一个多样化的肖像测试集,该数据集涵盖了多种肤色、年龄和性别,共计120张图像,我们称之为DivID-120,作为补充资源,还使用了最近开源的测试集Unsplash-50,包含…

【深度学习实战】kaggle 自动驾驶的假场景分类

本次分享我在kaggle中参与竞赛的历程&#xff0c;这个版本是我的第一版&#xff0c;使用的是vgg。欢迎大家进行建议和交流。 概述 判断自动驾驶场景是真是假&#xff0c;训练神经网络或使用任何算法来分类驾驶场景的图像是真实的还是虚假的。 图像采用 RGB 格式并以 JPEG 格式…

网络编程 | UDP套接字通信及编程实现经验教程

1、UDP基础 传输层主要应用的协议模型有两种&#xff0c;一种是TCP协议&#xff0c;另外一种则是UDP协议。在上一篇博客文章中&#xff0c;已经对TCP协议及如何编程实现进行了详细的梳理讲解&#xff0c;在本文中&#xff0c;主要讲解与TCP一样广泛使用了另一种协议&#xff1a…

【Linux】线程全解:概念、操作、互斥与同步机制、线程池实现

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;一、线程概念 &#x1f4d6; 回顾进程 &#x1f4d6; 引入线程 &#x1f4d6; 总结 &a…

掌握未来:从零开始学习生成式AI大模型!

随着人工智能技术的飞速发展&#xff0c;生成式AI大模型已成为当今科技领域的热点。从文本生成、图像创作到音乐创作&#xff0c;生成式AI大模型在各个领域展现出惊人的潜力。本文将带领大家从零开始&#xff0c;逐步学习生成式AI大模型&#xff0c;掌握未来的关键技术。 一、生…