当前位置: 首页 > news >正文

细说STM32F407单片机电源低功耗StandbyMode待机模式及应用示例

目录

一、待机模式基础知识

1、进入待机模式

2、待机模式的状态

3、退出待机模式

二、待机模式应用示例

1、示例功能和CubeMX项目设置

(1) 时钟

(2) DEBUG、LED1、KeyRight、USART6、CodeGenerator

(3) SYS_WKUP

(4) NVIC

2、软件设计

(1)KEYLED 

(2)main.c

3、运行与调试


一、待机模式基础知识

1、进入待机模式

        待机模式是几种低功耗模式中功耗最低的要通过WFI指令或WFE指令进入待机模式,需要将系统控制寄存器SCR中的SLEEPDEEP位置1将电源控制寄存器PWR_CR中的PDDS位置1。函数HAL_PWR_EnterSTANDBYMode()实现进入待机模式的功能,其源代码如下:

void HAL_PWR_EnterSTANDBYMode(void)
{/*选择STANDBY模式*/SET_BIT(PWR->CR,PWR_CR_PDDS);/*将Cortex系统控制寄存器的SLEEPDEEP位置1 */SET_BIT(SCB->SCR,((uint32_t)SCB_SCR_SLEEPDEEP_Msk));/*下面的选项用于确保完成了保存操作*/#if defined(__CC_ARM)__force_stores();#endif/*Request Wait For Interrupt */__WFI();
}

        函数HAL_PWR_EnterSTANDBYMode()没有任何参数,直接使用WFI指令进入待机模式。

2、待机模式的状态

        进入待机模式后,系统的状态如下。

  • 1.2V调压器关闭,1.2V域全部断电,寄存器和SRAM的内容丢失。
  • PLL、HSI振荡器、HSE振荡器都关闭。
  • VBAT供电的RTC寄存器、备份域SRAM的内容保留,RTC可继续工作。
  • 所有外设停止工作,除了复位引脚、SYS_WKUP引脚(PA0)和RTC的输出复用引脚,其他引脚都是高阻态。

3、退出待机模式

        用户可以通过以下方式中的任何一种退出待机模式。

  • NRST引脚的外部硬件复位。
  • 独立看门狗复位。
  • SYS_WKUP引脚(PA0引脚)上升沿信号。
  • RTC的闹钟事件、周期唤醒事件、入侵事件或时间戳事件。

        系统从待机模式唤醒后,不是从进入待机模式处的代码继续执行,而是整个系统复位,从头开始执行,所以其唤醒延迟时间就是复位阶段的时间。

        通常使用SYS_WKUP引脚连接的按键使系统从待机模式唤醒,HAL库有两个函数设置启用或禁用SYS_WKUP引脚,两个函数的调用代码如下:

HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);	//启用SYS_WKUP引脚
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);	//禁用SYS_WKUP引脚

        其中,PWR_WAKEUP_PIN1是宏定义常量,STM32F40x系列只有一个SYS_WKUP引脚。启用或禁用SYS_WKUP引脚就是设置电源控制/状态寄存器PWR_CSR中的EWUP位为1或0。

二、待机模式应用示例

        本文将创建一个示例项目,测试系统的STOP模式。继续使用旺宝红龙开发板STM32F407ZGT6 KIT V1.0。一些设置参考本文作者的其他文章。

        参考文章:细说STM32F407单片机电源低功耗StopMode模式及应用示例-CSDN博客  https://wenchm.blog.csdn.net/article/details/145264762

1、示例功能和CubeMX项目设置

本文将创建一个示例并演示如何使用待机模式。示例功能和使用流程如下。

  1. 在CubeMX中配置PA0为SYS_WKUP信号,用于使系统在待机模式下唤醒。
  2. 程序运行时,检测到KeyRight键按下后,就进入待机模式。
  3. 在待机模式下,按下KeyUp键使系统唤醒。

(1) 时钟

        外部时钟,25MHz,设置到HCLK=168MHz,PCLK1=42MHz,PCLK2=84MHz,其它,都设置成168MHz。

(2) DEBUG、LED1、KeyRight、USART6、CodeGenerator

         同参考文章或参照参考文章。

  

(3) SYS_WKUP

        在SYS组件的模式设置部分勾选System Wake-Up复选框,如图所示,这样PA0就会作为SYS_WKUP引脚,无须再为PA0进行GPIO设置。

        注意,SYS_WKUP引脚是PA0引脚,也就是KeyUp键连接的引脚。当PA0作为SYS_WKUP时,KeyUp键就不能作为一个普通按键,不能用轮询或中断方式检测其输入。

 

(4) NVIC

         修改TimeBase的优先级为1。

2、软件设计

(1)KEYLED 

        本示例工程继续引用KEYLED文件夹中的keyled.h,详见参考文章。

(2)main.c

/* USER CODE BEGIN Includes */
#include "keyled.h"
#include <stdio.h>	//用到函数sprintf()
/* USER CODE END Includes */
/* USER CODE BEGIN 2 */HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);	//使能WKUP引脚,必须执行printf("Demo22_3_StandbyMode:Test Standby Mode.\r\n\r\n");if (__HAL_PWR_GET_FLAG(PWR_FLAG_WU)==SET)	//被WKUP、RTC事件唤醒{printf("Note: After Standby, press the WKUP to wake up.\r\n");__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);		//必须清除WUF,否则连续唤醒}if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB)==SET) //从StandBy模式复位{HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); //禁止SYS_WKUP引脚,消除抖动影printf("Reset from Standby mode.\r\n");__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);		//清除标志位SBF}printf("Press [S5]KeyRight to enter Standby.\r\n\r\n");LED1_ON();/* USER CODE END 2 */

        系统在待机模式下被唤醒后,系统复位并从头开始执行程序。程序在复位并完成初始化后,需要对电源控制/状态寄存器PWR_CSR中的WUF(唤醒标志)位和SBF(待机标志)位进行检测和清除。

  • ● WUF(Wakeup Flag)位是由硬件置1的。如果WUF位是1,表示器件复位前发生了待机模式的唤醒事件,如SYS_WKUP、RTC闹钟、RTC入侵事件、RTC时间戳事件、RTC周期唤醒,但是不包括复位引脚NRST导致的复位。要清除WUF位,需要向电源控制寄存器PWR_CR的CWUF位写1。所以,查询和清除WUF位的代码如下:
if(__HAL_PWR_GET_FLAG(PWR_FLAG_WU)==SET) //被WKUP、RTC事件唤醒
{__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);   //必须清除WUF,否则连续唤醒
}

        如果WUF位是1,必须清除这个位;否则,在后面再进入待机模式后,会立刻被唤醒。

  • ● SBF(StandBy Flag)位是由硬件置1的。如果SBF位是1,表示器件在复位前进入了待机模式;如果SBF位是0,表示器件复位前未进入待机模式。要清除SBF位,需要向电源控制寄存器PWR_CR的CSBF位写1。所以,查询和清除SBF位的代码段如下:
if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB)==SET)         //从StandBy模式复位
{HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);   //禁止SYS_WKUP引脚,消除抖动影响             __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);           //清除SBF位
}

        在判断是从待机模式复位后,程序还立刻禁用了SYS_WKUP引脚(PA0)。如果SYS_WKUP引脚已经被启用,即使没有进入待机状态,按一下KeyUp键也会被记录一次唤醒操作,那么在按下KeyRight键进入待机模式后会立即被唤醒。所以,在正常运行模式下,应该禁用SYS_WKUP引脚,只有在进入待机模式之前才启用SYS_WKUP引脚

/* USER CODE BEGIN 3 */KEYS curKey=ScanPressedKey(KEY_WAIT_ALWAYS);if(curKey==KEY_RIGHT)  //KeyRight键{HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//使能WKUP引脚,必须执行printf("Be in Standby mode now.\r\n");printf("Press [S2]KeyUp to wake up, or\r\n");printf("press [S6]Reset to reset system.\r\n\r\n");HAL_PWR_EnterSTANDBYMode();	//进入待机模式,唤醒就使系统恢复//LED1 自动灭,因为待机模式下引脚是高阻}}/* USER CODE END 3 */

        完成这些检测后,在while循环中检测按键输入,在KeyRight键被按下后,启用SYS_WKUP引脚,然后调用函数HAL_PWR_EnterSTANDBYMode()进入待机模式。进入待机模式后,与LED1连接的PF9引脚变成高阻态,LED1自然就熄灭了。

/* USER CODE BEGIN 4 */
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart6,(uint8_t*)&ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */

3、运行与调试

 

        用户还可以在CubeMX里对本示例进行功耗计算,RUN模式下的耗电流是48.51mA,STANDBY模式下的耗电流是3μA。选用3400mAh的锂电池供电,1年6月23天11小时。

 

相关文章:

细说STM32F407单片机电源低功耗StandbyMode待机模式及应用示例

目录 一、待机模式基础知识 1、进入待机模式 2、待机模式的状态 3、退出待机模式 二、待机模式应用示例 1、示例功能和CubeMX项目设置 &#xff08;1&#xff09; 时钟 &#xff08;2&#xff09; DEBUG、LED1、KeyRight、USART6、CodeGenerator &#xff08;3&#x…...

IOS 安全机制拦截 window.open

摘要 在ios环境&#xff0c;在某些情况下执行window.open不生效 一、window.open window.open(url, target, windowFeatures) 1. url&#xff1a;「可选参数」&#xff0c;表示你要加载的资源URL或路径&#xff0c;如果不传&#xff0c;则打开一个url地址为about:blank的空…...

jmeter中对接口进行循环请求后获取相应数据

1、工作中遇到一个场景就是对某个单一接口进行循环请求&#xff0c;并需要获取每次请求后返回的相应数据&#xff1b; 2、首先就在jmeter对接口相关组件进行配置&#xff0c;需要组件有&#xff1a;循环控制器、CSV数据文件设置、计数器、访问接口、HTTP信息头管理器、正则表达…...

【QT】-explicit关键字

explicit explicit 是一个 C 关键字&#xff0c;用于修饰构造函数。它的作用是防止构造函数进行隐式转换。 为什么需要 explicit&#xff1f; 在没有 explicit 的情况下&#xff0c;构造函数可以用于隐式类型转换。这意味着&#xff0c;如果你有一个接受某种类型的参数的构造…...

【深度学习】 自动微分

自动微分 正如上节所说&#xff0c;求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单&#xff0c;只需要一些基本的微积分。 但对于复杂的模型&#xff0c;手工进行更新是一件很痛苦的事情&#xff08;而且经常容易出错&#xff09;。 深度学习框架通过自动…...

字节跳动自研HTTP开源框架Hertz简介附使用示例

字节跳动自研 HTTP 框架 Hertz Hertz 是字节跳动自研的高性能 HTTP 框架&#xff0c;专为高并发、低延迟的场景设计。它基于 Go 语言开发&#xff0c;结合了字节跳动在微服务架构中的实践经验&#xff0c;旨在提供更高效的 HTTP 服务开发体验。 1. 背景介绍 随着字节跳动业务…...

skynet 源码阅读 -- 核心概念服务 skynet_context

本文从 Skynet 源码层面深入解读 服务&#xff08;Service&#xff09; 的创建流程。从最基础的概念出发&#xff0c;逐步深入 skynet_context_new 函数、相关数据结构&#xff08;skynet_context, skynet_module, message_queue 等&#xff09;&#xff0c;并通过流程图、结构…...

每日十题八股-2025年1月23日

1.快排为什么时间复杂度最差是O&#xff08;n^2&#xff09; 2.快排这么强&#xff0c;那冒泡排序还有必要吗&#xff1f; 3.如果要对一个很大的数据集&#xff0c;进行排序&#xff0c;而没办法一次性在内存排序&#xff0c;这时候怎么办&#xff1f; 4.面试官&#xff1a;你的…...

MongoDB部署模式

目录 单节点模式&#xff08;Standalone&#xff09; 副本集模式&#xff08;Replica Set&#xff09; 分片集群模式&#xff08;Sharded Cluster&#xff09; MongoDB有多种部署模式&#xff0c;可以根据业务需求选择适合的架构和部署方式。 单节点模式&#xff08;Standa…...

opencv笔记2

图像灰度 彩色图像转化为灰度图像的过程是图像的灰度化处理。彩色图像中的每个像素的颜色由R&#xff0c;G&#xff0c;B三个分量决定&#xff0c;而每个分量中可取值0-255&#xff0c;这样一个像素点可以有256*256*256变化。而灰度图像是R&#xff0c;G&#xff0c;B三个分量…...

springboot使用ssl连接elasticsearch

使用es时ssl证书报错 unable to find valid certification path to requested target 1.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>2…...

Linux内核中的InfiniBand核心驱动:verbs.c分析

InfiniBand(IB)是一种高性能、低延迟的网络互连技术,广泛应用于高性能计算(HPC)、数据中心和云计算等领域。Linux内核中的InfiniBand子系统通过提供一组核心API(称为Verbs API)来支持InfiniBand设备的操作。drivers/infiniband/core/verbs.c是InfiniBand核心驱动的重要组…...

把网站程序数据上传到服务器的方法和注意事项

将网站程序数据上传到服务器是一个常见的网站开发和部署流程。主要涉及到FTP上传、FileZilla、rsync(在Linux下)、或其他相关的文件同步工具。以下是一般步骤和方法&#xff1a; 使用FTP&#xff1a; 1. 选择FTP客户端软件&#xff1a; - 常见的FTP客户端包括FileZilla(开源)、…...

完全平方数——唯一分解定理

文章目录 一、唯一分解定理是什么&#xff1f;1.定义2.示例3.代码模板 二、例题1>问题描述&#xff08;2021蓝桥杯省赛&#xff09;输入格式输出格式样例输入 1样例输出 1样例输入 2样例输出 2评测用例规模与约定 2>解题思路3>假娃3>C嘎嘎 一、唯一分解定理是什么&…...

(详细)Springboot 整合动态多数据源 这里有mysql(分为master 和 slave) 和oracle,根据不同路径适配不同数据源

文章目录 Springboot 整合多动态数据源 这里有mysql&#xff08;分为master 和 slave&#xff09; 和oracle1. 引入相关的依赖2. 创建相关配置文件3. 在相关目录下进行编码&#xff0c;不同路径会使用不同数据源 Springboot 整合多动态数据源 这里有mysql&#xff08;分为maste…...

mock可视化生成前端代码

介绍&#xff1a;mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件&#xff0c;来解决我们的问题。目前支持vite和webpack。&#xff08;配置超级简单&#xff01;&#xff09; 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…...

Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题

一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中&#xff0c;我们常常会遇到各种有趣且具有挑战性的问题。今天&#xff0c;我们就来深入探讨一个在实际开发中较为常见的问题&#xff1a;当连续快速发送 Post 请求时&#xff0c;前端会弹出 “数据正在处理&#xff0c;请…...

鸿蒙Harmony json转对象(1)

案例1 运行代码如下 上图的运行结果如下: 附加1 Json_msg interface 案例2 import {JSON } from kit.ArkTS; export interface commonRes {status: numberreturnJSON: ESObject;time: string } export interface returnRes {uid: stringuserType: number; }Entry Component …...

常见的RocketMQ面试题及其简要答案

以下是一些常见的RocketMQ面试题及其简要答案&#xff1a; 一、基础概念与架构 简述RocketMQ是什么&#xff0c;并说明其主要作用。 答案&#xff1a; RocketMQ&#xff1a;是阿里巴巴在2012年开源的一款分布式消息中间件&#xff0c;目前已经捐赠给Apache软件基金会&#xff…...

C#Object类型的索引,序列化和反序列化

前言 最近在编写一篇关于标准Mes接口框架的文章。其中有一个非常需要考究的内容时如果实现数据灵活和可使用性强。因为考虑数据灵活性&#xff0c;所以我一开始选取了Object类型作为数据类型&#xff0c;Object作为数据Value字段&#xff0c;String作为数据Key字段&#xff0c…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...