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

news2025/1/23 4:41:07

目录

一、待机模式基础知识

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

 

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

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

相关文章

中国综合算力指数(2024年)报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39061 在全球算力因数字化技术发展而竞争加剧&#xff0c;我国积极推进算力发展并将综合算力作为数字经济核心驱动力的背景下&#xff0c;该报告对我国综合算力进行研究。 中国算力大会发布的《中国综合算力指数&#xff08;2024年…

w-form-select.vue(自定义下拉框组件)(与后端字段直接相关性)

文章目录 1、w-form-select.vue 组件中每个属性的含义2、实例3、源代码 1、w-form-select.vue 组件中每个属性的含义 好的&#xff0c;我们来详细解释 w-form-select.vue 组件中每个属性的含义&#xff0c;并用表格列出它们是否与后端字段直接相关&#xff1a; 属性解释表格&…

前沿技术趋势洞察:2024年技术的崭新篇章与未来走向!

引言 时光飞逝&#xff0c;2024年已经来临&#xff0c;回顾过去一年&#xff0c;科技的迅猛进步简直让人目不暇接。 在人工智能&#xff08;AI&#xff09;越来越强大的今天&#xff0c;我们不再停留在幻想阶段&#xff0c;量子计算的雏形开始展示它的无穷潜力&#xff0c;Web …

消息队列篇--原理篇--RabbmitMQ(Exchange,消息转换器、docker部署,绑定和确认机制等)

RabbitMQ是一个基于AMQP协议的消息队列系统&#xff0c;支持多种消息传递模式&#xff0c;包括点对点&#xff08;P2P&#xff09;、发布/订阅&#xff08;Pub/Sub&#xff09;和路由模式。RabbitMQ 的设计目标是提供高可用性、可扩展性和可靠性&#xff0c;适用于企业级应用集…

C++入门 详细版

欢迎来到干货小仓库&#xff01;&#xff01; 一分耕耘一分收获&#xff0c;离自己的目标越来越近。 passion&#xff01;passion&#xff01;&#xff01;passion&#xff01;&#xff01;&#xff01; 1.命名空间 由于C语言无法避免名字或者函数重复等问题&#xff0c;当有多…

一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload以及webpackChunkName的使用

文章目录 一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. preload和prefetch的区别2. prefetch的使用3. preload的使用4. webpackChunkName 一文大白话讲清楚webpack基本使用——9——…

Android AutoMotive --CarService

1、AAOS概述 Android AutoMotive OS是谷歌针对车机使用场景打造的操作系统&#xff0c;它是基于现有Android系统的基础上增加了新特性&#xff0c;最主要的就是增加了CarService&#xff08;汽车服务&#xff09;模块。我们很容易把Android AutoMotive和Android Auto搞混&…

(三)线性代数之二阶和三阶行列式详解

在前端开发中&#xff0c;尤其是在WebGL、图形渲染、或是与地图、模型计算相关的应用场景里&#xff0c;行列式的概念常常在计算变换矩阵、进行坐标变换或进行图形学算法时被使用。理解二阶和三阶行列式对于理解矩阵运算、旋转、平移等操作至关重要。下面&#xff0c;我将结合具…

Linux Bash 中使用重定向运算符的 5 种方法

注&#xff1a;机翻&#xff0c;未校。 Five ways to use redirect operators in Bash Posted: January 22, 2021 | by Damon Garn Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output t…

蓝桥杯算法日常|c\c++常用竞赛函数总结备用

一、字符处理相关函数 大小写判断函数 islower和isupper&#xff1a;是C标准库中的字符分类函数&#xff0c;用于检查一个字符是否为小写字母或大写字母&#xff0c;需包含头文件cctype.h&#xff08;也可用万能头文件包含&#xff09;。返回布尔类型值。例如&#xff1a; #…

MySQL(4)多表查询

引言&#xff1a;为什么需要多表的查询&#xff1f; A&#xff1a;提高效率&#xff0c;多线进行。 高内聚、低耦合。 一、多表查询的条件 1、错误的多表查询&#xff1a; SELECT employee_id,department_name FROM employees,departments; SELECT employee_id,department…

‘list‘ object has no attribute ‘mul‘

原来运行得好好的&#xff0c;突然出现错误&#xff1a;list object has no attribute mul &#xff0c;更换一个输入路径&#xff0c;又没问题&#xff0c;改一个路径&#xff0c;还是出现错误&#xff0c;很奇怪&#xff0c;后来又没有问题&#xff0c;记录一下。 参考这文…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的旅行社在线预订与行程管理系统

开题报告 本文旨在设计研究与开发一个旅行社在线预订与行程管理系统。首先&#xff0c;本文介绍了旅行社在线预订与行程管理系统相关技术集成开发环境、软硬件环境&#xff0c;SpringBoot框架、Vue.js框架的基本原理和优势&#xff0c;以及在旅行社在线预订与行程管理系统开发…

HarmonyOS快速入门

HarmonyOS快速入门 1、基本概念 UI框架&#xff1a; HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可为开发者提供应用UI开发所必需的能力&#xff0c;比如多种组件、布局计算、动画能力、UI交互、绘制等。 方…

[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

SQL sever数据导入导出实验

1.创建数据库TCP-H &#xff08;1&#xff09;右键“数据库”&#xff0c;点击“新建数据库”即可 &#xff08;2&#xff09;用sql语言创建&#xff0c;此处以创建数据库DB_test为例&#xff0c;代码如下&#xff1a; use master;go--检查在当前服务器系统中的所有数据里面…

Vue平台开发三——项目管理页面

前言 对于多个项目的使用&#xff0c;可能需要进行项目切换管理&#xff0c;所以这里创建一个项目管理页面&#xff0c;登录成功后跳转这个页面&#xff0c;进行选择项目&#xff0c;再进入Home页面展示对应项目的内容。 一、实现效果图预览 二、页面内容 功能1、项目列表展…

PyCharm+RobotFramework框架实现UDS自动化测试- (四)项目实战0x10

1.环境搭建 硬件环境&#xff1a;CANoe、待测设备&#xff08;包含UDS诊断模块&#xff09; 2.pythonPyCharm环境 pip install robotframework pip install robotframework-ride pip install openpyxl pip install udsoncan pip install python-can pip install can-isotp3…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序&#xff0c;界面是标准的 Windows 主从窗口 拥有&#xff1a;主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西&#xff0c;均在下图了。 开发该软件&#xff0c;主要分为下面三个阶段 1&#xff09;界面设计开发 多窗口 MDI 程序…

USART_串口通讯轮询案例(HAL库实现)

引言 前面讲述的串口通讯案例是使用寄存器方式实现的&#xff0c;有利于深入理解串口通讯底层原理&#xff0c;但其开发效率较低&#xff1b;对此&#xff0c;我们这里再讲基于HAL库实现的串口通讯轮询案例&#xff0c;实现高效开发。当然&#xff0c;本次案例需求仍然和前面寄…