【STM32】 STM32低功耗模式详解:睡眠模式与唤醒机制【待测试】

本篇知识点基于F0讲解

一、STM32三种低功耗模式参考表格

模式功耗唤醒时间保持状态典型应用场景
睡眠模式中等 (mA级)最短 (μs级)CPU停止,外设保持短暂待机,快速响应
停止模式低 (μA级)中等 (ms级)RAM保持,时钟停止长时间待机,电池供电
待机模式极低 (nA级)最长 (复位级)仅备份域保持超低功耗需求,看门狗唤醒

二、睡眠模式深入解析

1. 进入睡眠模式

在这里插入图片描述

void PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry)
{/* 1. 参数合法性检查 */assert_param(IS_PWR_SLEEP_ENTRY(PWR_SLEEPEntry));/* 2. 清除SLEEPDEEP位(关键步骤)*/SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;/* 3. 选择进入方式 */if(PWR_SLEEPEntry == PWR_SLEEPEntry_WFI) {__WFI();  // 等待中断指令} else {__WFE();  // 等待事件指令}
}
关键操作解析:
  1. 参数检查 assert_param()

    • 确保传入参数只能是:
      • PWR_SLEEPEntry_WFI (0x01)
      • PWR_SLEEPEntry_WFE (0x02)
    • 防止非法参数导致未定义行为
  2. 清除SLEEPDEEP位

    SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
    
    • 目的:明确指定进入睡眠模式(非停止/待机模式)
    • 寄存器说明
      Cortex-M0系统控制寄存器(SCR)的SLEEPDEEP位:
      • 0 = 睡眠模式
      • 1 = 深度睡眠模式(停止/待机)
    • 硬件关联:该位与电源控制寄存器(PWR_CR)的PDDS和LPDS位协同工作
  3. 休眠指令选择

    指令汇编指令唤醒条件特点
    WFIWFI任意中断传统唤醒方式
    WFEWFE事件信号支持SEVONPEND和事件线

2. 退出睡眠模式

在这里插入图片描述

(1) WFI唤醒机制
  • 唤醒条件:任何在NVIC中使能的外设中断
  • 唤醒流程
    中断源 CPU WFI位置 ISR 主程序 触发中断 退出睡眠 跳转至中断服务程序 返回原代码继续执行 中断源 CPU WFI位置 ISR 主程序
  • 特点
    • 自动清除中断挂起位
    • 唤醒后从WFI下一条指令开始执行
(2) WFE唤醒机制

提供两种事件驱动唤醒方式:

方式一:SEVONPEND机制

配置步骤

  1. 使能SCB_SCR的SEVONPEND位
    SCB->SCR |= SCB_SCR_SEVONPEND_Msk;
    
  2. 配置外设中断(但禁用NVIC中断)
  3. 执行__WFE()进入睡眠

唤醒条件:外设中断挂起位置位(即使NVIC中断禁用)

唤醒后操作

// 必须双重清除挂起位!
EXTI_ClearITPendingBit(EXTI_LineX);  // 清除外设级挂起位
NVIC_ClearPendingIRQ(IRQn);         // 清除NVIC级挂起位

注意事项

  • 不清除挂起位会导致之后如果执行WFE时会立即唤醒(无法正常进入睡眠)
  • 适用于复用现有中断逻辑的场景
实践代码
void Enter_Sleep_WFE(void)
{// 配置唤醒源(SEVONPEND模式)SCB->SCR |= SCB_SCR_SEVONPEND_Msk;EXTI->IMR |= EXTI_IMR_MR5;  // 使能PA5中断NVIC_DisableIRQ(EXTI4_15_IRQn); // 禁用NVIC中断__WFE(); // 进入睡眠// ===== 唤醒后处理 =====// 1. 清除外设挂起位(写1清除)EXTI->PR = EXTI_PR_PR5;//NVIC_ClearPendingIRQ(IRQn);         // 清除NVIC级挂起位// 2. 清除NVIC挂起位NVIC->ICPR[0] = (1 << (EXTI4_15_IRQn & 0x1F));//NVIC_ClearPendingIRQ(IRQn);         // 清除NVIC级挂起位// 3. 添加延迟防止信号抖动for(volatile int i=0; i<100; i++);// 4. 执行业务逻辑Handle_Wakeup_Event();
}
方式二:纯事件模式

配置步骤

  1. 设置EXTI为事件模式
    EXTI_InitTypeDef exti = {0};
    exti.EXTI_Line = EXTI_Line5;
    exti.EXTI_Mode = EXTI_Mode_Event;  // 关键配置
    exti.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Init(&exti);
    
  2. 执行__WFE()进入睡眠

唤醒条件:EXTI线检测到指定事件边沿

优势

  • 无需中断处理函数
  • 无需清除挂起位
  • 唤醒延迟最短(约6个时钟周期)

3. 唤醒机制对比表

特性WFI唤醒WFE+SEVONPENDWFE+事件模式
配置复杂度★☆☆ (简单)★★☆ (中等)★★☆ (中等)
中断处理程序需要不需要不需要
挂起位管理自动清除需手动双重清除无挂起位产生
唤醒延迟12-15周期12-15周期5-8周期
功耗优化★★☆★★★★★★★
适用场景常规中断响应复用现有中断资源专用低功耗事件

4. 最佳实践建议

(1) 配置推荐
// 最优配置:纯事件模式唤醒
void Enter_LowPower_Mode(void)
{// 1. 配置事件唤醒源EXTI_InitTypeDef exti = {0};exti.EXTI_Line = EXTI_Line5;exti.EXTI_Mode = EXTI_Mode_Event;exti.EXTI_Trigger = EXTI_Trigger_Falling;exti.EXTI_LineCmd = ENABLE;EXTI_Init(&exti);// 2. 关闭非必要外设时钟RCC_APB1PeriphClockCmd(UNUSED_PERIPH, DISABLE);// 3. 进入睡眠PWR_EnterSleepMode(PWR_SLEEPEntry_WFE);
}
  • 关键提醒:事件模式需确保 GPIO 时钟开启(RCC_AHBPeriph_GPIOx)。若为省电关闭时钟,事件将无法触发唤醒。
(2) 唤醒处理
// 事件唤醒后直接处理业务
if(GPIO_ReadInputDataBit(WAKEUP_PORT, WAKEUP_PIN) == ACTIVE_STATE)
{Process_Wakeup_Event(); // 无需清除挂起位
}
(3) 常见问题解决

问题:唤醒后立即重新睡眠

  • 原因:未正确清除挂起位
  • 解决方案
    // 对于SEVONPEND模式
    EXTI_ClearITPendingBit(EXTI_LineX);
    NVIC_ClearPendingIRQ(IRQn);// 额外添加延迟
    delay_us(10);
    

5. 功耗优化技巧

  1. 时钟管理
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
    
  2. IO状态配置
    • 未用引脚设为模拟输入
    • 输出引脚固定电平
  3. 外设状态管理
    • ADC禁用并关闭参考电压
    • 串口接收器禁用
  4. 唤醒源选择
    • 优先选择低功耗唤醒源(EXTI > 定时器)

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

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

相关文章

【Vue入门学习笔记】Vue核心语法

目录 准备工作删除不需要的代码 模版语法文本插值使用JavaScript表达式无效写法原始HTML 属性绑定简写布尔型Attribute动态绑定多个值 准备工作 删除不需要的代码 删除components下的文件 进入App.vue 删掉代码&#xff0c;只保留如下内容 <template></template&g…

ClickHouse 窗口分析 argMax() / argMin()

argMin() 是 ClickHouse 中一个非常有用的聚合函数&#xff0c;它可以找出某个列的最小值&#xff0c;并返回该最小值对应的另一个列的值 函数语法 argMin(arg, val) arg&#xff1a;要返回的列&#xff08;当找到最小值时返回该列的值&#xff09; val&#xff1a;用于比较的…

k8s client 通过KubeConfig和证书方式连接api server

一、背景 本文以kubePi这样一个k8s客户端为示例,使用证书方式,怎么连接k8s集群。 然后告诉你证书是如何生成的, 最后通过一个Python编程示例,在程序里如何使用。 api server地址:比如https://110.206.56.308:6443 Certificate:证书内容 Certificate Key:证书的私钥 先…

(2025.07)解决——ubuntu20.04系统开机黑屏,左上角光标闪烁

前面一些碎碎念&#xff1a; 电脑装的双系统&#xff0c;之前都还好着&#xff0c;今天突然ubuntu开机的时候黑屏了&#xff0c;左上角有光标在闪烁&#xff0c;也查了一些资料&#xff0c;基本上大家的都是驱动有问题&#xff0c;还有内存问题。&#xff08;个人建议&#xff…

一文讲清libmodbus在STM32上基于FreeRTOS的移植

libmodbus 开发库概述 libmodbus是一个免费的跨平台支持RTU和TCP的Modbus库&#xff0c;遵循LGPL V2.1协议。libmodbus支持Linux、 Mac Os X、 FreeBSD、 QNX和Windows等操作系统。 libmodbus可以向符合Modbus协议的设备发送和接收数据&#xff0c;并支持通过串口或者TCP网络进…

go语言安装达梦数据完整教程

一、安装 go-dm 驱动 1. 使用 go get 命令安装 # 打开PowerShell或命令提示符 go get github.com/dmdbms/go-dm# 若网络问题&#xff0c;配置代理 go env -w GOPROXYhttps://goproxy.cn,direct2. 验证驱动安装 go list -m github.com/dmdbms/go-dm# 预期输出类似 github.com…

华为云Flexus+DeepSeek征文|基于Dify构建音视频内容转录工作流

华为云FlexusDeepSeek征文&#xff5c;基于Dify构建音视频内容转录工作流 一、构建音视频内容转录工作流前言二、构建音视频内容转录工作流环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建音视频内容转录工作流实战3.1 配置Dify环境3.2 配置Dify工具…

Pandas6(数据清洗2)——置换和随机采样、get_dummies、扩展数据类型、字符串处理函数

数据清洗2 一、置换和随机采样&#xff08;permutation,sample&#xff09; 随机置换&#xff08;打乱排序&#xff08;洗牌&#xff09;&#xff09;函数&#xff1a;numpy.random.permutation &#xff0c;可以对一个序列进行随机排序&#xff0c;常用于数据集随机划分等场景…

按月设置索引名的完整指南:Elasticsearch日期索引实践

按月设置索引名的完整指南:Elasticsearch日期索引实践 在时序数据场景中,按月设置索引名(如logs-2024-01)是优化查询效率、降低管理成本的关键策略。以下是三种实现方案及详细步骤: 方案一:索引模板 + 日期数学表达式(推荐) 原理:利用ES内置的日期数学表达式动态生成…

西南交通大学【机器学习实验7】

实验目的 理解和掌握朴素贝叶斯基本原理和方法&#xff0c;理解极大似然估计方法&#xff0c;理解先验概率分布和后验概率分布等概念&#xff0c;掌握朴素贝叶斯分类器训练方法。 实验要求 给定数据集&#xff0c;编程实现朴素贝叶斯分类算法&#xff0c;计算相应先验概率&a…

java生成pdf文件

1.依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>8.0.4</version><type>pom</type></dependency> 2.代码 package org.example;import com.itextpdf.io.image…

macOS挂载iOS应用沙盒文件夹

背景 工具 libimobiledevice: linux&#xff0c;macOS等与ios设备通信是的工具 macFUSE 是 macOS 文件系统扩展的“引擎”&#xff0c;支持开发者创建各类虚拟文件系统。 iFUSE 是专为 iOS 设备设计的“连接器”&#xff0c;需依赖 macFUSE 实现功能。 若需访问 iPhone/iP…

嵌入式软件面经(四)Q:请说明在 ILP32、LP64 与 LLP64 三种数据模型下,常见基本类型及指针的 sizeof 值差异,并简要解释其原因

从事嵌入式开发深入理解 ILP32、LP64、LLP64 三种主流数据模型及其在平台上的实际表现&#xff0c;可以帮助我们避免诸如类型越界、结构错位、指针截断等致命错误。 一、何为数据模型&#xff1f;为何重要&#xff1f; 数据模型&#xff08;Data Model&#xff09;是指在某一编…

计算机组成原理与体系结构-实验二 ALU(Proteus 8.15)

目录 一、实验目的 二、实验内容 三、实验器件 四、实验原理 五、实验步骤 六、思考题 一、实验目的 1、了解算术逻辑运算器&#xff08;74LS181&#xff09;的组成和功能。 2、掌握基本算术和逻辑运算的实现方法。 二、实验内容 设计算数逻辑运算器系统的通路&#x…

ubuntu下免sudo执行docker

前言 在ubuntu中&#xff0c;默认是无法使用root账号的&#xff0c;安装完docker后&#xff0c;不可避免的要使用sudo来执行docker命令&#xff0c;这就让运维变得很麻烦 避免sudo # 添加当前用户到 docker 组 sudo usermod -aG docker $USER# 刷新组权限 newgrp docker# 验…

微处理原理与应用篇---STM32寄存器控制GPIO

在 ARM 架构下使用 C 语言控制 32 位寄存器实现 GPIO 操作&#xff0c;需结合芯片手册进行寄存器映射和位操作。以下以 STM32F103&#xff08;Cortex-M3 内核&#xff09;为例&#xff0c;详细介绍实现方法&#xff1a; 一、STM32F103 GPIO 控制&#xff08;标准外设库&#x…

基于OPUS-MT模型的中译英程序实现

这是我的kaggle账号名“fuliuqin” 代码参考如下&#xff1a; nlp.paperflq | KaggleExplore and run machine learning code with Kaggle Notebooks | Using data from [Private Datasource]https://www.kaggle.com/code/fuliuqin/nlp-paperflq 目录 绪论 研究背景与意义 研究…

炸鸡派-定时器基础例程

定时器简介 基本定时器&#xff0c;计数中断、产生DMA请求。 通用定时器&#xff0c;PWM输出、输入捕获、脉冲计数。 高级定时器&#xff0c;输出比较、互补输出带死区控制、PWM输入。 中心对齐的计数模式可以生成对称的PWM波形信号。计数可以先增后减。 这种模式下&#xff…

利用不坑盒子的Copilot,快速排值班表

马上放暑假了&#xff0c;有多少人拼命排值班表的&#xff1f; 今天用我亲身制作值班表的一些Excel操作&#xff0c;给大家分享一些在Excel中的小技巧&#xff0c;需要的及时收藏&#xff0c;有一天用得上~ 值班表全貌 先给大家看看我制作的值班表的样子&#xff0c;应该大家…

Linux 面试知识(附常见命令)

目录结构与重要文件 Linux 中一切皆文件&#xff0c;掌握目录结构有助于理解系统管理与配置。 目录说明/根目录&#xff0c;所有文件起点/bin基本命令的可执行文件&#xff0c;如 ls, cp/sbin系统管理员用的命令&#xff0c;如 shutdown/etc配置文件目录&#xff0c;如 /etc/…