细说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小时。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我谈《概率论与数理统计》的知识体系

学习《概率论与数理统计》二十多年后&#xff0c;在廖老师的指导下&#xff0c;才厘清了各章之间的关系。首先&#xff0c;这是两个学科综合的一门课程&#xff0c;这一门课程中还有术语冲突的问题。这一门课程一条线两个分支&#xff0c;脉络很清晰。 概率论与统计学 概率论…

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十五届的题目在规定时间内做出了前5道&#xff0c;还有2道找时间再磨一磨。现在把做的一些思路总结如下&#xff1a; 题1&#xff1a;握手问题 问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例…

OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?

OpenEuler与CentOS的对比 一、基本信息 起源与背景&#xff1a; OpenEuler&#xff1a;由华为发起&#xff0c;后捐赠给开放原子开源基金会&#xff0c;旨在构建一个开放、多元化的云计算和边缘计算平台&#xff0c;以满足华为及其他企业的硬件和软件需求。CentOS&#xff1a;…

【MySQL — 数据库增删改查操作】深入解析MySQL的create insert 操作

数据库CRUD操作 1 CRUD简介 CURD是对数据库中的记录进行基本的增删改查操作: 2. Create 新增 语法 INSERT [INTO] table_name[(column [&#xff0c;column] ...)] VALUES(value_list)[&#xff0c;(value_list)] ... # value 后面的列的个数和类型&#xff0c;要和表结构匹配…

苍穹外卖—订单模块

该模块分为地址表的增删改查、用户下单、订单支付三个部分。 第一部分地址表的增删改查无非就是对于单表的增删改查&#xff0c;较基础&#xff0c;因此直接导入代码。 地址表 一个用户可以有多个地址&#xff0c;同时有一个地址为默认地址。用户还可为地址添加例如&q…

从ChatGPT热潮看智算崛起

2025年1月7日&#xff0c;科智咨询发布《2025年IDC产业七大发展趋势》&#xff0c;其中提到“ChatGPT开启生成式AI热潮&#xff0c;智能算力需求暴涨&#xff0c;算力供给结构发生转变”。 【图片来源于网络&#xff0c;侵删】 为何会以ChatGPT发布为节点呢&#xff1f;咱们一起…

【Uniapp-Vue3】setTabBar设置TabBar和下拉刷新API

一、setTabBar设置 uni.setTabBarItem({ index:"需要修改第几个", text:"修改后的文字内容" }) 二、tabBar的隐藏和显式 // 隐藏tabBar uni.hideTabBar(); // 显示tabBar uni.showTabBar(); 三、为tabBar右上角添加文本 uni.setTabBarBadge({ index:"…

【express-generator】06-RESTFUL API设计(第二阶段)

前言&#xff1a; 前面我们学习了第一阶段的express-generator内容以及做了对应练习&#xff0c;现在我们正式开始第二阶段的学习以及练习。本篇介绍的内容是RESTFUL API设计。 第二阶段的大纲如下&#xff1a; RESTful API 设计&#xff1a; 学习如何设计符合 REST 原则的 …

Python 预训练:打通视觉与大语言模型应用壁垒——Python预训练视觉和大语言模型

大语言模型是一种由包含数百亿甚至更多参数的深度神经网络构建的语言模型&#xff0c;通常使用自监督学习方法通过大量无标签文本进行训练&#xff0c;是深度学习之后的又一大人工智能技术革命。 大语言模型的发展主要经历了基础模型阶段(2018 年到2021年)、能力探索阶段(2019年…

【深度学习】2.视觉问题与得分函数

计算机视觉任务 可以通过神经网络搜索是什么类别的动物。 图像实际就是含有数值的三维矩阵。 像素值从0-255可以表示亮度递增的参数。数字越大&#xff0c;像素点越亮。 最后的3表示三个颜色通道&#xff0c;常见的如JPG、RGB等。 现实场景容易发生各种遮蔽现象。 计算机判断…

1.CSS的三大特性

css有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…

使用Edge打开visio文件

使用Edge打开visio文件 打开Edge浏览器搜索‘vsdx edge’ 打开第一个搜索结果 Microsoft Support 根据上述打开的页面进行操作 第一步&#xff1a;安装Visio Viewer 第二步&#xff1a;添加注册表 桌面新增文本文件&#xff0c;将下面的内容放入新建文本中&#xff0c;修…

基于微信小程序的健身管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

GPS信号生成:C/A码序列生成【MATLAB实现】

GPS C/A码序列生成【MATLAB实现】 在本文中&#xff0c;将简要介绍GPS C/A码及其生成原理&#xff0c;并且用MATLAB代码实现。 GPS信号与C/A码 GPS的信号主要有三类&#xff1a;载波&#xff08;carrier&#xff09;、测距码&#xff08;也可以说是伪随机噪声码&#xff0c;…

redis离线安装部署详解(包括一键启动)

像上文一样 因为在学习的过程中没有查到一个详细的离线部署方案 所以在自己学习之后想要自己写一个文章 希望可以帮助后续学习redis离线部署的朋友少走一线弯路 首先就是下载安装包 可以自己在本地下载再传到机器上&#xff08;通过xftp或lrzsz都可&#xff09; http://d…

Hadoop•搭建完全分布式集群

听说这里是目录哦 一、安装Hadoop&#x1f955;二、配置Hadoop系统环境变量&#x1f96e;三、验证Hadoop系统环境变量是否配置成功&#x1f9c1;四、修改Hadoop配置文件&#x1f36d;五、分发Hadoop安装目录&#x1f9cb;六、分发系统环境变量文件&#x1f368;七、格式化HDFS文…

安卓动态设置Unity图形API

命令行方式 Unity图像api设置为自动,安卓动态设置Vulkan、OpenGLES Unity设置 安卓设置 创建自定义活动并将其设置为应用程序入口点。 在自定义活动中,覆盖字符串UnityPlayerActivity。updateunitycommandlineararguments (String cmdLine)方法。 在该方法中,将cmdLine…

Java春招面试指南前言

在当今竞争激烈的就业市场中&#xff0c;对于即将踏入职场的Java开发者而言&#xff0c;春招是一次宝贵的机会。本博客专栏旨在为大家提供一份全面且实用的Java春招面试指南&#xff0c;助力大家顺利通过面试&#xff0c;开启职业生涯的新篇章。 无论你是初出茅庐的应届生&…

记录一次k8s起不来的排查过程

我在k8s集群&#xff0c;重启了一个node宿主机&#xff0c;竟然发现kubelet起不来了&#xff01;报错如下 这个报错很模糊&#xff0c;怎么排查呢。这样&#xff0c;开两个界面&#xff0c;一个重启kubelet&#xff0c;一个看系统日志(/var/log/message:centos&#xff0c;/va…

利用Qt5.15.2编写Android程序时遇到的问题及解决方法

文章目录 背景1.文件读写 背景 目前我用的是Qt5.15.2来编写Qt程序&#xff0c;环境的配置看我这篇文章【Qt5.15.2配置Android开发环境】 项目中的一些配置的截图&#xff1a; 1.文件读写 假如直接用 QFileDialog::getExistingDirectory来获取路径的话&#xff0c;会得到类…