STM32CubeMX学习笔记(15)——电源管理(PWR)低功耗睡眠模式

发布者:EternalBliss最新更新时间:2025-02-19 来源: jianshu关键字:STM32CubeMX  电源管理  PWR  低功耗  睡眠模式 手机看文章 扫描二维码
随时随地手机看文章

一、低功耗模式简介

系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗。由用户根据应用选择具体的低功耗模式,以在低功耗、短启动时间和可用唤醒源之间寻求最佳平衡。

睡眠模式、停止模式及待机模式中,若备份域电源正常供电,备份域内的 RTC 都可以正常运行,备份域内的寄存器的数据会被保存,不受功耗模式影响。

从表中可以看到,这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。

模式名称说明进入方式唤醒方式对1.8V区域时钟的影响对VDD区域时钟的影响调压器
睡眠模式内核停止,所有外设包括M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行调用WFI命令任意中断内核时钟关,对其他时钟和ADC时钟无影响
睡眠模式内核停止,所有外设包括M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行调用WFE命令唤醒事件内核时钟关,对其他时钟和ADC时钟无影响
停止模式所有的时钟都已停止配置PWR_CR寄存器的PDDS+LPDS位+SLEEPDEEP位+WFI或WFE命令任意外部中断EXTI(在外部中断寄存器中设置)关闭所有1.8V区域的时钟HSI和HSE的振荡器关闭开启或处于低功耗模式(依据电源控制寄存器的设定)
待机模式1.8V电源关闭配置PWR_CR寄存器的PDDS+SLEEPDEEP位+WFI或WFE命令WKUP上升沿、引脚的RTC闹钟事件、NRST引脚上的外部复位、IWDG复位关闭所有1.8V区域的时钟HSI和HSE的振荡器关闭

1.1 睡眠模式

在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM3 核心的外设全都还照常运行。有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是 WFI(wait for interrupt) 和 WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。

特性和说明:

  • 立即睡眠: 在执行 WFI 或 WFE 指令时立即进入睡眠模式。

  • 退出时睡眠: 在退出优先级最低的中断服务程序后才进入睡眠模式。

  • 进入方式: 内核寄存器的 SLEEPDEEP=0 ,然后调用 WFI 或 WFE 指令即可进入睡眠模式;SLEEPONEXIT=1 时,进入“退出时睡眠”模式。

  • 唤醒方式: 如果是使用 WFI 指令睡眠的,则可使用任意中断唤醒;如果是使用 WFE 指令睡眠的,则由事件唤醒。

  • 睡眠时: 关闭内核时钟,内核停止,而外设正常运行,在软件上表现为不再执行新的代码。这个状态会保留睡眠前的内核寄存器、内存的数据。

  • 唤醒延迟: 无延迟。

  • 唤醒后: 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI 指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。

1.2 停止模式

在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒,在停止模式中可以选择电压调节器为开模式或低功耗模式。

特性和说明:

  • 调压器低功耗模式: 在停止模式下调压器可工作在正常模式或低功耗模式,可进一步降低功耗。

  • 进入方式: 内核寄存器的 SLEEPDEEP=1,PWR_CR 寄存器中的 PDDS=0,然后调用 WFI 或 WFE 指令即可进入停止模式;PWR_CR 寄存器的 LPDS=0 时,调压器工作在正常模式,LPDS=1 时工作在低功耗模式。

  • 唤醒方式: 如果是使用 WFI 指令睡眠的,可使用任意 EXTI 线的中断唤醒;如果是使用 WFE 指令睡眠的,可使用任意配置为事件模式的 EXTI 线事件唤醒。

  • 停止时: 内核停止,片上外设也停止。这个状态会保留停止前的内核寄存器、内存的数据。

  • 唤醒延迟: 基础延迟为 HSI 振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间。

  • 唤醒后: 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI 指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。唤醒后,STM32 会使用 HSI 作为系统时钟。

1.3 待机模式

待机模式,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 boot 条件,从头开始执行程序。它有四种唤醒方式,分别是 WKUP(PA0)引脚的上升沿,RTC 闹钟事件,NRST 引脚的复位和 IWDG(独立看门狗)复位。

特性和说明:

  • 进入方式: 内核寄存器的 SLEEPDEEP=1,PWR_CR 寄存器中的 PDDS=1,PWR_CR 寄存器中的唤醒状态位 WUF=0,然后调用 WFI 或 WFE 指令即可进入待机模式。

  • 唤醒方式: 通过 WKUP 引脚的上升沿,RTC 闹钟、唤醒、入侵、时间戳事件或 NRST 引脚外部复位及 IWDG 复位唤醒。

  • 待机时: 内核停止,片上外设也停止;内核寄存器、内存的数据会丢失;除复位引脚、RTC_AF1 引脚及 WKUP 引脚,其它 I/O 口均工作在高阻态。

  • 唤醒延迟: 芯片复位的时间。

  • 唤醒后: 相当于芯片复位,在程序表现为从头开始执行代码。

1.4 WFI与WFE命令

我们了解到进入各种低功耗模式时都需要调用 WFI 或 WFE 命令,它们实质上都是内核指令,在库文件 core_cm3.h 中把这些指令封装成了函数。

/** brief 等待中断
  等待中断 是一个暂停执行指令
  暂停至任意中断产生后被唤醒
*/#define __WFI        __wfi /** brief 等待事件
  等待事件 是一个暂停执行指令
  暂停至任意事件产生后被唤醒
*/#define __WFE        __wfe

对于这两个指令,我们应用时一般只需要知道,调用它们都能进入低功耗模式,需要使用函数的格式“__WFI();”和“__WFE();”来调用(因为__wfi 及__wfe 是编译器内置的函数,函数内部调用了相应的汇编指令)。

其中 WFI 指令决定了它需要用中断唤醒,而 WFE 则决定了它可用事件来唤醒。

二、新建工程

1. 打开 STM32CubeMX 软件,点击“新建工程”


2. 选择 MCU 和封装


3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
开启 LSE(外部低速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)


选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置


4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire


三、睡眠模式

3.1 WFI任意中断唤醒

3.1.1 流程图

3.1.2 HAL库与标准库代码比较

STM32CubeMX 使用 HAL 库的代码:

// 挂起(暂停)系统时钟中断

HAL_SuspendTick();

  

/* 进入睡眠模式, 任意中断唤醒 */

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

  

/* 恢复系统时钟中断 */

HAL_ResumeTick();


使用 STM32 标准库的代码:

__WFI();    // WFI 指令进入睡眠

3.1.3 添加按键

初始化按键 PA0 中断模式,以便当系统进入睡眠模式的时候可以通过按键来唤醒。
查看 STM32CubeMX学习笔记(3)——EXTI(外部中断)接口使用

3.1.4 添加LED灯

添加绿灯 PB0 表示运行状态,红灯 PB5 表示睡眠状态,蓝灯 PB1 表示刚从睡眠状态中被唤醒。
查看 STM32CubeMX学习笔记(2)——GPIO接口使用

3.1.5 生成代码

输入项目名和项目路径


选择应用的 IDE 开发环境 MDK-ARM V5


每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。


点击 GENERATE CODE 生成代码


3.1.6 修改中断回调函数

当系统进入停止状态后,我们按下实验板上的 KEY1 按键,即可使系统回到正常运行的状态,当执行完中断服务函数后,会继续执行 WFI 指令后的代码。

打开 stm32f1xx_it.c 中断服务函数文件,找到 EXTI0 中断的服务函数 EXTI0_IRQHandler()
中断服务函数里面就调用了 GPIO 外部中断处理函数 HAL_GPIO_EXTI_IRQHandler()


打开 stm32f1xx_hal_gpio.c 文件,找到外部中断处理函数原型 HAL_GPIO_EXTI_IRQHandler(),其主要作用就是判断是几号线中断,清除中断标识位,然后调用中断回调函数 HAL_GPIO_EXTI_Callback()。


/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
这个函数不应该被改变,如果需要使用回调函数,请重新在用户文件中实现该函数。

HAL_GPIO_EXTI_Callback() 按照官方提示我们应该再次定义该函数,__weak 是一个弱化标识,带有这个的函数就是一个弱化函数,就是你可以在其他地方写一个名称和参数都一模一样的函数,编译器就会忽略这一个函数,而去执行你写的那个函数;而 UNUSED(GPIO_Pin) ,这就是一个防报错的定义,当传进来的GPIO端口号没有做任何处理的时候,编译器也不会报出警告。其实我们在开发的时候已经不需要去理会中断服务函数了,只需要找到这个中断回调函数并将其重写即可而这个回调函数还有一点非常便利的地方这里没有体现出来,就是当同时有多个中断使能的时候,STM32CubeMX会自动地将几个中断的服务函数规整到一起并调用一个回调函数,也就是无论几个中断,我们只需要重写一个回调函并判断传进来的端口号即可。

接下来我们就在 stm32f1xx_it.c 这个文件的最下面添加 HAL_GPIO_EXTI_Callback()


/* USER CODE BEGIN 1 */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

    // 亮蓝灯

    HAL_GPIO_WritePin(GPIOB, LED_B_Pin, GPIO_PIN_RESET);

}

/* USER CODE END 1 */


3.1.7 修改main函数

初始化完成后使用 LED 及串口表示运行状态,LED 灯为绿色时表示正常运行,红灯时表示睡眠状态,蓝灯时表示刚从睡眠状态中被唤醒。

程序执行一段时间后,直接使用 WFI 指令进入睡眠模式,由于 WFI 睡眠模式可以使用任意中断唤醒,所以我们可以使用按键中断唤醒。在实际应用中,您也可以把它改成串口中断、定时器中断等。

/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  /* USER CODE BEGIN 2 */

  

  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    // 使用绿灯指示,运行状态

    HAL_GPIO_WritePin(GPIOB, LED_G_Pin, GPIO_PIN_RESET);

    HAL_Delay(2000);

    HAL_GPIO_WritePin(GPIOB, LED_G_Pin, GPIO_PIN_SET);

    // 任务执行完毕,进入睡眠降低功耗


    // 使用红灯指示,进入睡眠状态

    HAL_GPIO_WritePin(GPIOB, LED_R_Pin, GPIO_PIN_RESET);

    // 暂停滴答时钟,防止通过滴答时钟中断唤醒

    HAL_SuspendTick();

    // 进入睡眠模式

    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);


    // 被唤醒后,恢复滴答时钟

    HAL_GPIO_WritePin(GPIOB, LED_R_Pin, GPIO_PIN_SET);

    HAL_ResumeTick();

    HAL_Delay(2000);

    HAL_GPIO_WritePin(GPIOB, LED_B_Pin, GPIO_PIN_SET);

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}


四、注意事项

用户代码要加在 USER CODE BEGIN N 和 USER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。

进入低功耗之前可以将引脚全部配置为浮空输入或者Anglog模式,这样最省电,如果你是用STM32CUBEMX,在这里可以看到这么一项配置就是将没有用到的引脚配置为了Anglog模式:

当系统处于睡眠模式低功耗状态时(包括后面讲解的停止模式及待机模式),使用 DAP 下载器是无法给芯片下载程序的,所以下载程序时要先把系统唤醒。或者使用如下方法:按着板子的复位按键,使系统处于复位状态,然后点击电脑端的下载按钮下载程序,这时再释放复位按键,就能正常给板子下载程序了。

关键字:STM32CubeMX  电源管理  PWR  低功耗  睡眠模式 引用地址:STM32CubeMX学习笔记(15)——电源管理(PWR)低功耗睡眠模式

上一篇:STM32CubeMX学习笔记(16)——电源管理(PWR)低功耗停止模式
下一篇:STM32CubeMX学习笔记(14)——RTC实时时钟使用

推荐阅读最新更新时间:2026-03-25 01:35

STM32CubeMX学习笔记(15)——电源管理(PWR)低功耗睡眠模式
一、低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗。由用户根据应用选择具体的低功耗模式,以在低功耗、短启动时间和可用唤醒源之间寻求最佳平衡。 睡眠模式、停止模式及待机模式中,若备份域电源正常供电,备份域内的 RTC 都可以正常运行,备份域内的寄存器的数据会被保存,不受功耗模式影响。 从表中可以看到,这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。 模式名称 说明 进入方式 唤醒方式 对1.8V区域时钟的影响 对VDD区域时钟的影响 调压器 睡眠模式 内核停止,所有外设包括M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行 调用WF
[单片机]
AVR 电源管理_睡眠模式范例
*********************************************** **** AVR 电源管理_睡眠模式范例 *** **** *** **** 编译器:WIN AVR 20050214 *** **** *** ***********************************************/ /* 本程序简单的示范了如何令 AVR ATMEGA16进入睡眠状态及唤醒 电源管理及睡眠模式的介绍 进入最低耗电的掉电模式 关闭各种模块 外部中断唤醒 M
[单片机]
stm32在rt-thread上的PWR(电源管理)
Low-power modes有三种Sleep mode、Stop mode、Standby mode,实现如下: void SYSCLKConfig_START(void) { ErrorStatus HSEStartUpStatus; /* 使能 HSE */ RCC_HSEConfig(RCC_HSE_ON); /* 等待 HSE 准备就绪 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* 使能 PLL */ RCC_PLLCmd(ENABL
[单片机]
STM32F0xx_PWR低功耗配置详细过程
Ⅰ、概述 今天总结PWR部分知识,请看“STM32F0x128参考手册V8”第六章。提供的软件工程是关于电源管理中的停机模式,工程比较常见,但也是比较简单的一个实例,根据项目的不同还需要适当修改或者添加一些代码。 实例中处理项目的事件只是LED变化 和 串口打印数据,主要是提示的作用,实际项目中唤醒之后会有更多的事件等待处理。 本着免费分享的原则,方便大家手机学习知识,每天在微信分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。 文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360
[单片机]
STM32F0xx_<font color='red'>PWR</font><font color='red'>低功耗</font>配置详细过程
最新研究表明:手机夜间模式睡眠质量毫无用处
杨百翰大学(Brigham Young University)最近公布了一项研究结果,探讨了手机低蓝光、暗光的夜间模式对人类睡眠质量的影响。结果表明,夜间模式毫无用处。   杨百翰大学心理学教授 Chad Jensen 和 Cincinnati 儿童医疗中心的研究人员研究了三种人的睡眠结果:   睡前开启夜间模式后玩手机;   睡前不开启夜间模式玩手机;   睡前不玩手机。   IT之家了解到,他们选择了 167 名年龄在 18~24 岁之间的青年,要求青年必须睡够 8 小时,同时用手腕上的传感器来检测他们的睡眠质量。研究表明,三组人的睡眠质量没有差异。   接着,他们分别测试了睡够 7 小时和 6 小时,结果表
[手机便携]
最新研究表明:手机夜间<font color='red'>模式</font>对<font color='red'>睡眠</font>质量毫无用处
STM32进入睡眠模式下的GPIO配置参考
1. GPIO内部电路图 1.根据设备原理图查看IO外部引脚连接电路,闲置状态为低电平时,设置为下拉输入;闲置状态为高电平时,设置为上拉输入;闲置状态为悬空时设置为模拟输入;输出引脚根据功能需要设置就行 原因:当IO通过外围电路电阻接地被拉低时,如果设置为上拉输入,则在芯片内部的上拉电阻和外围的下拉电阻构成回路,电流损耗取决于这两个电阻;当IO通过外围电路电阻接电源被拉高时,则在芯片内部的下拉电阻和外围的上拉电阻构成回路,电流损耗也取决于这两个电阻;当悬空时,斯密特触发器是打开的,要判断输入的是高电平还是低电平,需要一点电流损耗,但是设备模拟输入,这个触发器是关闭的 --------------------- 假设你的这个GP
[单片机]
STM32进入<font color='red'>睡眠</font><font color='red'>模式</font>下的GPIO配置参考
为防盗福特密钥卡增“睡眠模式” Fiesta车型将首先配备
(图片:福特安全专家与新款智能密钥卡) 据外媒报道,为了应对越来越多的无钥匙启动汽车被盗事件,福特在其Fiesta车型的密钥卡内增加了“睡眠模式”,5月份,该项技术还将推广至Focus车型。 一直以来,窃贼们都将盗窃目标锁定在配备无钥匙进入系统的汽车上,此类汽车配备了继电器箱设备,当车主将密钥卡留在家中时,继电器箱还能够接收到密钥卡的信号,并利用此类信号打开车门,启动汽车。 为了应对此威胁,福特新推出的密钥卡内置了一个运动传感器。如果该传感器检测到钥匙没有移动的时间超过了40秒,密钥卡就会进入睡眠模式,从而防止任何人利用继电器箱或其他专业设备获取密钥卡信号。 但是只要密钥卡一移动,就会再次激活。据福特所说,当车主携带密钥卡走到
[汽车电子]
为防盗福特密钥卡增“<font color='red'>睡眠</font><font color='red'>模式</font>” Fiesta车型将首先配备
LM3S1138入门10,深度睡眠省电模式
这里的头文件LM3S1138_PinMap.h和Buzzer.h就不列举了,这里列举一下主函数。 基于《Stellaris外设驱动库》的SysCtl例程:深度睡眠省电模式示例 在深度睡眠模式下,CPU、存储器、外设(被使能继续工作的外设除外)都暂停工作,PLL也被关闭,并可采用内部振荡器IOSC(12MHz 30%)的16分频作为系统时钟,因此能够节省绝大部分的功耗。这对于产品的低功耗设计意义重大。被使能继续工作的外设所触发的中断可以将芯片唤醒。 掌握以下库函数的用法: SysCtlPeriDSlpEnable() SysCtlPeriClkGat() SysCtlDeepSleep() 程序运行后,按照初始化配置,系统
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved