单片机的低功耗模式
什么是低功耗?
STM32的低功耗(low power mode)特性是其嵌入式处理器系列的一个重要优势,特别适用于需要长时间运行且功耗敏感的应用场景,如便携式设备、物联网设备、智能家居系统等。
在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。
STM32电源系统结构
电压调节器的作用:
- 调节1.8v的供电区域,用于CPU的核心、存储器、内置的数字外设(NVIC) ;
- 检测后备供电区域的的电压。若电压突然变成低电压,将电路连接到Vbat供电。
低功耗模式介绍
STM32具有运行、睡眠、停止和待机(3种低功耗模式)四种工作模式
上电后默认是在运行模式,当内核(CPU)不需要继续运行时,可以选择后面的三种工作模式。
睡眠模式 (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将唤醒。
停机模式 (stop mode)
在停机模式下,CPU 和 核心外围设备的时钟会停止,但部分唤醒源(如外部中断和某些定时器)仍然运行。Stop模式实现了非常低的功耗,同时保留了SRAM 和 寄存器的内容。
适用场景:
这适用于需要长时间等待外部事件唤醒的应用,如等待用户输入或外部信号。
模式特点:
- 节能效果好,程序不会复位。但恢复时间较长(比如震荡器需要重新起震等)。
- 在停机模式下,所有的 I/O引脚都 保持 它们在运行模式时的状态。
- 退出停机模式,HSI RC振荡器被选为系统时钟。
进入条件:
- 执行 WFI(Wait For Interrupt)或 WFE(Wait For Event)指令来进入。
- 在进入Stop模式之前,通常需要关闭不必要的外设时钟,并保存需要保留的状态信息。
- 需要将SLEEPDEEP位设置为1以进入深度睡眠模式,然后通过设置 电源 控制/状态寄存器(PWR_CSR)中的 PDDS位为0 来选择进入 Stop模式。
- 根据需求设置 LPDS 位( LPDS = 0 :表示在深睡眠模式下,电压调节器保持 开启 状态; LPDS = 1 :表示在深睡眠模式下,电压调节器进入低功耗 模式。)
- Stop模式可以通过外部中断(如按键中断、USART接收中断等)唤醒。
- RTC闹钟事件、USB唤醒、以太网(ETH)唤醒等也可以作为唤醒源,但这些通常需要通过外部中断来触发。
待机模式(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,但这通常用于系统复位而非低功耗唤醒。
总结:(三种模式的对比)
唤醒模式:CPU关闭,各种外设和时钟正常;
停机模式:CPU关闭,核心外围设备的时钟停止运行,但部分唤醒源(中断和定时器)正常;
待机模式:CPU、外围设备和时钟都被关闭,只保留唤醒逻辑和备份寄存器。
三种模式的进入条件流程图:
低功耗的寄存器
- 电源控制寄存器(PWR_CR)
- 电源控制/状态寄存器(PWR_CSR)
低功耗模式的库函数
- 使能时钟电源(关闭电压调节器)
- 使能Wakeup引脚的唤醒功能
- 清除唤醒标志位
小实验:低功耗实验
实验目的
- 按下按键2,进入低功耗模式(睡眠、停机、待机);
- 按下按键1,退出低功耗模式;
- 正常模式下,LED1闪烁;进入停机模式,LED2长亮,退出停机模式则LED2熄灭。
硬件清单
开发板、ST-Link、USB转TTL
文件代码
- lqwr.c文件代码
配置流程:
- 初始化唤醒引脚:GPIO_PIN_0配置成上升沿触发中断的模式;
- sleep模式:暂停滴答定时器,防止滴答定时器唤醒、进入睡眠模式的函数;
- stop模式:暂停滴答定时器、进入停机模式的函数、配置时钟频率为72MHz;
- standby模式:开始电源时钟(关闭电压调节器)、使能引脚的唤醒功能(只有GPIO_PIN_O)、清除唤醒标记位、进入待机模式的函数。
注意事项:
- 睡眠模式和停机模式唤醒之后,系统不会进行复位,继续向下执行;
- 待机模式再唤醒之后,系统会进行复位,程序会从开始进行运行。
#include "lpwr.h"
#include "led.h"
#include "sys.h"//初始化
void lpwr_init(void){__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef gpio_initstruct;gpio_initstruct.Pin = GPIO_PIN_0;gpio_initstruct.Mode = GPIO_MODE_IT_RISING;gpio_initstruct.Pull = GPIO_PULLUP;gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA,&gpio_initstruct);HAL_NVIC_SetPriority(EXTI0_IRQn,2,2);HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
//中断服务函数
void EXTI0_IRQHandler(void){HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
中断回调函数 .可以不用写
//void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
// if(GPIO_Pin == GPIO_PIN_0){
//
// }
//}
//进入sleep模式
void lpwr_enter_sleep(void){HAL_SuspendTick();//暂停滴答定时器器,否则会将系统进行唤醒。HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI); //Regulator :电压调节器
}
//进入stop模式
void lpwr_enter_stop(void){//暂停滴答定时器HAL_SuspendTick();//点亮LED2led2_on();//进入停机模式HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);//熄灭LED2,代表退出停机模式led2_off();//进入停机模式后,再退出之后,系统时钟的RC振荡器被选择为:HSI(内部低速时钟,8MHz)stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
}
//进入待机模式
void lpwr_enter_sandby(void){//使能电源时钟(关闭电压调节器)__HAL_RCC_PWR_CLK_ENABLE();//使能WAKEUP引脚唤醒功能HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//清除唤醒标记,否则将持续保持唤醒状态__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//进入待机模式HAL_PWR_EnterSTANDBYMode();//测试:看看代码会不会运行到下面?led2_on();//答:当唤醒模式后,LED2灯不会亮,原因:进入待机模式后,唤醒之后程序会从头开始运行,会进行复位。
}
- lpwr.h文件代码
#ifndef __LPWR_H__
#define __LPWR_H__
#include "stm32f1xx.h"void lpwr_init(void);
void lpwr_enter_sleep(void);
void lpwr_enter_stop(void);
void lpwr_enter_sandby(void);#endif
- mian.c文件代码
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "uart1.h"
#include "lpwr.h"
#include "key.h"int main(void)
{HAL_Init(); /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init(); /* LED初始化 */uart1_init(115200);printf("hello,world");key_init();lpwr_init();uint8_t i = 0;while(1){
// led1_toggle();
// delay_ms(200);//每隔200ms led灯进行反转的另一种写法:if(i % 20 == 0)led1_toggle();i++;delay_ms(10);if(key_scan() == 2)lpwr_enter_sandby(); //进入睡眠模式,所有的I/O引脚都 保持 它们在运行模式时的状态}
}
延时200ms的方式:
方式1:delay_ms(200);
方式2:定义一个函数if语句。
相关文章:

单片机的低功耗模式
什么是低功耗? STM32的低功耗(low power mode)特性是其嵌入式处理器系列的一个重要优势,特别适用于需要长时间运行且功耗敏感的应用场景,如便携式设备、物联网设备、智能家居系统等。 在很多应用场合中都对电子设备的…...

架构师级考验!飞算 JavaAI 炫技赛:AI 辅助编程解决老项目难题
当十年前 Hibernate 框架的 N1 查询隐患在深夜持续困扰排查,当 SpringMVC 控制器中错综复杂的业务逻辑在跨语言迁移时令人抓狂,企业数字化进程中的百万行老系统,已然成为暗藏危机的 “技术债冰山”。而此刻,飞算科技全新发布的 Ja…...

手机端抓包大麦网抢票协议:实现自动抢票与支付
🚀 手机端抓包大麦网抢票协议:实现自动抢票与支付 🚀 🔥 你是否还在为抢不到热门演出票而烦恼?本文将教你如何通过抓包技术获取大麦网抢票协议,并编写脚本实现自动化抢票与支付!🔥 …...
使用阿里云百炼embeddings+langchain+Milvus实现简单RAG
使用阿里云百炼embeddingslangchainMilvus实现简单RAG 注意测试时,替换其中的key、文档等 import os from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import Milvus from langchain_text_splitters impor…...
C#合并CAN ASC文件:实现与优化
C#合并CAN ASC文件:实现与优化 在汽车电子和工业控制领域,CAN(Controller Area Network)总线是一种广泛使用的通信协议。CAN ASC(American Standard Code)文件则是记录CAN总线通信数据的标准格式ÿ…...

[TIP] Ubuntu 22.04 配置多个版本的 GCC 环境
问题背景 在 Ubuntu 22.04 中安装 VMware 虚拟机时,提示缺少 VMMON 和 VMNET 模块 编译这两个模块需要 GCC 的版本大于 12.3.0,而 Ubuntu 22.04 自带的 GCC 版本为 11.4.0 因此需要安装对应的 GCC 版本,但为了不影响其他程序,需…...

如何思考?分析篇
现代人每天刷 100 条信息,却难静下心读 10 页书。 前言: 我一直把思考当作一件生活中和工作中最为重要的事情。但是我发现当我想写一篇跟思考有关的文章时,却难以下手。因为思考是一件非常复杂的事情,用文字描述十分的困难。 读书…...

Redis:Hash数据类型
🌈 个人主页:Zfox_ 🔥 系列专栏:Redis 🔥 Hash哈希 🐳 ⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在Redis中&#…...
抗辐照MCU在卫星载荷电机控制器中的实践探索
摘要:在航天领域,卫星系统的可靠运行对电子元件的抗辐照性能提出了严苛要求。微控制单元(MCU)作为卫星载荷电机控制器的核心部件,其稳定性与可靠性直接关系到卫星任务的成败。本文聚焦抗辐照MCU在卫星载荷电机控制器中的应用实践&…...

快捷键的记录
下面对应的ATL数字 ATL4 显示编译输出 CTRL B 编译 CTRLR 运行exe 菜单栏 ALTF ALTE ALTB ALTD ALTH...

Python读取阿里法拍网的html+解决登录cookie
效果图 import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from lxml import etreedef get_taobao_auct…...

electron-vite串口通信
一、构建项目后,安装“串口通信库” npm install serialport二、设置 npm install --save-dev electron-rebuild ./node_modules/.bin/electron-rebuild 注意:如果执行报错以下问题 1、未配置python变量 2、没有Microsoft Visual Studio BuildTools 3…...

中山大学美团港科大提出首个音频驱动多人对话视频生成MultiTalk,输入一个音频和提示,即可生成对应唇部、音频交互视频。
由中山大学、美团、香港科技大学联合提出的MultiTalk是一个用于音频驱动的多人对话视频生成的新框架。给定一个多流音频输入和一个提示,MultiTalk 会生成一个包含提示所对应的交互的视频,其唇部动作与音频保持一致。 相关链接 论文:https://a…...
Maven的配置与运行
maven配置国内镜像 <!-- # %MAVEN_HOME%\conf\settings.xml # 找到 <mirrors> 标签,添加: --> <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>htt…...
MySQL 迁移至 Docker ,删除本地 mysql
macOS 的删除有大量的配置文件和相关数据文件要删除,如果 update mysql 那么数据更杂。 停止 MYSQL 使用 brew 安装,则 brew services stop mysql 停止 mysql 。 如果没有使用 brew 安装,则 sudo /usr/local/mysql/support-files/mysq…...

redis分片集群架构
主从集群解决高并发,哨兵解决高可用问题。但是任然有两个问题没有解决:1海量数据存储问题;2高并发写的问题(如果服务中有大量写的请求) 那就可以采用分片集群架构解决这些问题 分片集群特征 分片集群中有多个master…...

关于物联网的基础知识(一)
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于物联网的基础知识(一&a…...
浏览器后台服务 vs 在线教育:QPS、并发模型与架构剖析
本文深入分析浏览器后台服务与在线教育平台在高并发场景下的架构设计差异,涵盖 QPS(每秒请求数)承压能力、服务模型、数据一致性、容灾机制等多个维度,力图为系统架构师和后端工程师提供实战参考。 一、什么是高并发场景ÿ…...

电脑商城--用户注册登录
用户注册 1 用户-创建数据表 1.使用use命令先选中store数据库。 USE store; 2.在store数据库中创建t_user用户数据表。 CREATE TABLE t_user (uid INT AUTO_INCREMENT COMMENT 用户id,username VARCHAR(20) NOT NULL UNIQUE COMMENT 用户名,password CHAR(32) NOT NULL COMME…...
Riverpod与GetX的优缺点对比
Riverpod 与 GetX 的优缺点对比 在 Flutter 开发领域,Riverpod 和 GetX 都是备受关注的状态管理与依赖注入框架,它们各有优劣,适用于不同的开发场景。以下从多个维度详细对比二者的优缺点。 一、Riverpod 的优缺点 (一)优点 架构清晰,数据流向明确:基于 Provider 模…...
Three.js怎么工作的?
Three.js 是怎么工作的? Three.js 的核心工作是: 构建一个虚拟的 3D 世界(Scene) 模拟摄像机视角(Camera) 用 WebGL 把这个场景“渲染成一张图片” 把这张图片画在 canvas 上 👉 所以 Three…...
LangChain面试内容整理-知识点1:LangChain架构与核心理念
LangChain 是一个用于构建基于大型语言模型(LLM)的应用的框架,其架构采用模块化设计,核心理念是将语言模型与外部工具、数据源相结合,以实现复杂任务的分解与执行medium.com。整个框架可以理解为一系列可组合的组件,包括链(Chain)、智能体(Agent)、工具(Tool)和LLM…...
双面沉金线路板制作流程解析:高可靠性PCB的核心工艺
在高端电子制造领域,双面沉金(ENIG)线路板因其优异的焊接性能、抗氧化能力和信号完整性,已成为5G通信、医疗设备和汽车电子等领域的首选。本文将深入解析其制作流程的关键环节,帮助工程师更好地理解这一核心工艺。 一、…...

什么是梯度磁场
梯度磁场是叠加在均匀主磁场(如MRI中的静磁场B₀)上的一种特殊磁场,其强度会沿着特定方向(如X、Y或Z轴)呈线性变化。这种磁场在磁共振成像和粒子控制等领域发挥着关键作用,主要用于实现空间位置的精确编码和…...

从零开始的python学习(七)P102+P103+P104+P105+P106+P107
本文章记录观看B站python教程学习笔记和实践感悟,视频链接:【花了2万多买的Python教程全套,现在分享给大家,入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…...

Linux--进程的调度
1.进程切换 CPU上下⽂切换:其实际含义是任务切换, 或者CPU寄存器切换。当多任务内核决定运⾏另外的任务时, 它保存正在运⾏任务的当前状态, 也就是CPU寄存器中的全部内容。这些内容被保存在任务⾃⼰的堆栈中, ⼊栈⼯作完成后就把下⼀个将要运⾏的任务的当前状况从该…...
Hadolint:Dockerfile 语法检查与最佳实践验证的终极工具
在容器化应用开发的浪潮中,Dockerfile 作为构建 Docker 镜像的核心配置文件,其质量直接影响着应用的安全性、稳定性和可维护性。然而,随着项目复杂度的增加,手动检查 Dockerfile 不仅耗时,还容易遗漏潜在问题。今天,我要向大家介绍一款强大的工具——Hadolint,它将彻底改…...
Python爬虫实战:研究Hyper 相关技术
一、项目概述 本项目展示了如何结合 Python 的异步编程技术与 Hyper 框架开发一个高性能、可扩展的网络爬虫系统。该系统不仅能够高效地爬取网页内容,还提供了 RESTful API 接口,方便用户通过 API 控制爬虫的运行状态和获取爬取结果。 二、系统架构设计 1. 整体架构 系统采…...
基于langchain的简单RAG的实现
闲来无事,想研究一下RAG的实现流程,看网上用langchain的比较多,我自己在下面也跑了跑,代码很简单,以次博客记录一下,方便回顾 langchain LangChain 是一个基于大型语言模型(LLM)开发…...

VmWare Ubuntu22.04 搭建DPDK 20.11.1
一、开发环境 Ubuntu 版本 二、增加虚拟机的网卡 给虚拟机增加1个网卡,加上原来的网卡,一共2个 网络适配器作为 ssh 连接的网卡,网络适配器2作为 DPDK 运行的网卡。 三、NAT模式简介 这里待补充,网上都是那一张图,看不懂 四、使网卡名称从0开始命名 进入管理员权限 s…...