STM32F407HAL库-9.待机唤醒

电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行的同时,又有低功耗的要求。在很多应用场合中都对电子设备的功耗要求非常苛刻,如 某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。因此,STM32有专门的电源管理外设监控电源并管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。

为了方便进行电源管理,STM32 把它的外设、内核等模块根据功能划分了供电区域, 其内部电源区域划分如下图:

 

从框图了解到,STM32的电源系统主要分为备份域电路、内核电路以及ADC电路三部分,介绍如下:

①:备份域电路

STM32的LSE 振荡器、RTC、备份寄存器及备份 SRAM 这些器件被包含进备份域电路中,这部分的电路可以通过STM32的 VBAT 引脚获取供电电源,在实际应用中一般会使用 3V 的钮扣电池对该引脚供电。

在图中备份域电路的左侧有一个电源开关结构,在它的上方连接了 VBAT 电源,下方连接了 VDD 主电源(一般为 3.3V),右侧引出到备份域电路中。当 VDD 主电源存在时,由于 VDD 电压较高,备份域电路通过VDD供电,当VDD掉电时,备份域电路由钮扣电池通过 VBAT 供电,保证电路能持续运行,从而可利用它保留关键数据。

②:调压器供电电路

在 STM32 的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及 RAM,调压器的输出电压约为 1.2V,因而使用调压器供电的这些电路区域被称为 1.2V 域。

 调压器可以运行在“运行模式”、“停止模式”以及“待机模式”。在运行模式下,1.2V 域全功率运行;在停止模式下1.2V域运行在低功耗状态,1.2V 区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及 SRAM 的内容;在待机模式下,整个 1.2V 域都断电,该区域的内核寄存器及 SRAM 内容都会丢失(备份区域的寄存器及 SRAM 不受影响)。

③:ADC电源及参考电压

为了提高转换精度,STM32的 ADC 配有独立的电源接口,方便进行单独的滤波。 ADC 的工作电源使用 VDDA 引脚输入,使用 VSSA 作为独立的地连接,VREF 引脚则为 ADC 提供测量使用的参考电压。用户可以在VREF上连接一个单独的外部参考电压ADC输入。V REF上的电压范围从1.8 V到VDDA。

STM32芯片主要通过引脚 VDD 从外部获取电源,在它的内部具有电源监控器用于检测 VDD的电压,以实现复位功能及掉电紧急处理功能,保证系统可靠地运行。

1、上电复位与掉电复位(POR与PDR)

当检测到 VDD 的电压低于阈值 VPOR 及 VPDR 时,无需外部电路辅助,STM32 芯片会自动保持在复位状态,防止因电压不足强行工作而带来严重的后果。见下图,在刚开始电压低于 VPOR 时(约 1.72V),STM32 保持在上电复位状态(POR,Power On Reset),当 VDD 电压持续上升至大于 VPOR 时,芯片开始正常运行,而在芯片正常运行的时候,当检测到 VDD 电压下降至低于 VPDR 阈值(约 1.68V),会进入掉电复位状态(PDR,Power Down Reset)。

2、断电复位(BOR)

POR 与 PDR 的复位电压阈值是固定的,如果用户想要自行设定复位阈值,可以使用 STM32 的 BOR 功能(Brownout Reset)。VBOR是通过设备选项字节配置的。默认情况下,BOR是关闭的。可以选择3个可编程V BOR阈值水平。

  • BOR3(VBOR3)。断电阈值为3
  • BOR2(VBOR2)。断电阈值为2
  • BOR1(VBOR1)。断电阈值为1

 3、可编程电压检测器(PVD)

上述 POR、PDR 以及 BOR功能都是使用其电压阈值与外部供电电压 VDD 比较,当低 于工作阈值时,会直接进入复位状态,这可防止电压不足导致的误操作。除此之外, STM32 还提供了可编程电压检测器 PVD,它也是实时检测 VDD 的电压,当检测到电压低于 VPVD 阈值时,会向内核产生一个 PVD 中断(EXTI16 线中断)以使内核在复位前进行紧急处理。该电压阈值可通过电源控制寄存器 PWR_CSR 设置。

 默认情况下,微控制器在系统或开机复位后处于运行模式。在运行模式下,CPU由HCLK计时,程序代码执行。当CPU不需要继续运行时,例如在等待外部事件时,可以使用几种低功耗模式来节省电能。用户可以选择在低功耗、短启动时间和可用唤醒源之间做出最佳的模式。

STM32F4具有三种低功耗模式:

  1. 睡眠模式:Cortex-M4与FPU内核停止,外围设备继续运行如NVIC、系统时钟等。
  2. 停止模式:在停止模式下,1.2V域中所有时钟停止,锁相环、HSI和HSE RC振荡器禁用。内部SRAM和寄存器内容被保存。电压调节器可以配置在正常或低功耗模式。
  3. 待机模式:待机模式可以实现最低的功耗,它基于Cortex-M4深睡眠模式,并禁用了电压调节器。因此1.2V域被关闭。锁相环、HSI振荡器和HSE振荡器也被关闭。除RTC寄存器,RTC备份寄存器,备份SRAM和备用电路外,SRAM和寄存器内容都会丢失。

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

电源控制(PWR)寄存器包括:PWR电源控制寄存器(PWR_CR)、PWR电源控制/状态寄存器(PWR_CSR)。

bsp_wakeup.c程序如下:

#include "bsp_wakeup.h"

// 系统进入待机模式
static void PWR_Enter_Standby(void)
{
	__HAL_RCC_PWR_CLK_ENABLE(); // 使能 PWR 时钟
	__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除 Wake_UP 标志
	HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // 设置 WKUP 用于唤醒
	HAL_PWR_EnterSTANDBYMode(); // 进入待机模式
}

// 唤醒按键初始化
void WAKEUP_Init(void)
{
	GPIO_InitTypeDef GPIO_Initure; // 定义初始化GPIO结构体变量
	__HAL_RCC_GPIOE_CLK_ENABLE(); // 开始GPIOE时钟
	
	GPIO_Initure.Pin = GPIO_PIN_3; // PE3引脚
	GPIO_Initure.Pull = GPIO_PULLUP; // 上拉
	GPIO_Initure.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发
	GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH; // 高速
	HAL_GPIO_Init(GPIOE, &GPIO_Initure); // GPIOE初始化
	
	HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 2);
	HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}

// 中断服务函数
void EXTI3_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}

// 中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_3)
	{
		PWR_Enter_Standby(); // 进入待机模式
	}
}

主函数如下:

int main(void)
{
	CLOCLK_Init(); // 配置系统时钟为168M
	LED_Init(); // LED初始化
	WAKEUP_Init(); // 初始化进入待机模式引脚
	
	while(1)
	{
	    LED1_ON;
	    LED2_ON;
	    HAL_Delay(500);
	    LED1_OFF;
	    LED2_OFF;
	    HAL_Delay(500);
	}
}

现象:将程序下载到开发板后,可以看到LED1和LED2灯开始闪烁,当我们按下KEY1按键时,开发板进入待机模式,LED灯停止闪烁,此时我们按下KEY_UP按键来唤醒待机模式,按下后可以看到LED灯又重新开始闪烁。

参考文章链接:https://www.cnblogs.com/firege/p/5805734.html

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32的Stop模式是一种低功耗模式,可以降低芯片的功耗以延长电池寿命。在Stop模式下,芯片的大部分功能都被关闭,只有一些必要的模块继续工作。 在使用HAL实现Stop模式的唤醒时,可以按照以下步骤进行: 1. 配置待唤醒的外设:使用HAL提供的相应函数对需要唤醒的外设进行配置,如GPIO、外部中断等。确保外设能够唤醒芯片。 2. 配置唤醒源:使用HAL提供的函数对Stop模式的唤醒源进行配置。常见的唤醒源包括外部中断、RTC闹钟、唤醒定时器等。根据实际需求选择相应的唤醒源,并配置相应的参数。 3. 进入Stop模式:调用HAL提供的函数将芯片进入Stop模式。可以选择进入低功耗或深度睡眠模式。 4. 唤醒处理:当外部事件触发唤醒源后,芯片将会被唤醒并执行唤醒后的处理。可以使用中断的方式处理唤醒事件,或者在主循环中轮询检测唤醒事件。 5. 恢复外设和时钟:在芯片被唤醒后,需要重新配置和使能之前被关闭的外设和时钟。使用HAL提供的相应函数对外设和时钟进行恢复。 需要注意的是,在Stop模式下芯片的工作频率会降低,因此需要重新校准外部设备(如外部晶振)的时钟。 通过以上步骤,就可以使用HAL实现STM32的Stop模式唤醒。在低功耗要求较高的应用中,采用Stop模式进行合理的功耗管理可以达到较高的电池寿命。 ### 回答2: STM32的Stop模式是一种功耗较低的模式,在这种模式下,系统会停止运行,只保留必要的模块以维持一些基本功能。当需要唤醒系统时,HAL提供了一种方便的方法。 首先,我们需要在使用Stop模式前进行一些初始化设置。我们可以调用HAL_PWR_EnterSTOPMode函数,将系统设置为Stop模式。在进入Stop模式前,我们需要关闭不需要的外设以降低功耗,例如关闭闹钟、定时器、串口等。同时,我们还需要配置唤醒源,以决定何时唤醒系统。 在停止模式下,系统处于低功耗状态,只有唤醒源被触发时,才能唤醒系统。当唤醒源被触发时,系统会从Stop模式中恢复。在STM32中,常见的唤醒源有外部中断、定时器中断、RTC闹钟中断等。我们可以使用HAL提供的相应函数来配置唤醒源,例如HAL_PWR_EnableWakeUpPin函数用于配置外部中断唤醒。 当唤醒源被触发后,我们需要进行一些必要的操作以恢复系统。例如重新初始化各个外设,开启必要的中断以实现相应功能。然后,我们可以调用HAL_PWR_DisableWakeUpPin函数来关闭唤醒源,并将系统从Stop模式恢复到正常运行模式。 通过调用HAL提供的相关函数,我们可以很方便地实现STM32的Stop模式唤醒功能。这种低功耗模式在一些对功耗有严格要求的应用中非常有用,能够有效地延长系统的电池寿命。 ### 回答3: STM32的Stop模式是一种低功耗模式,可以使MCU进入待机状态以减少能耗。HALSTM32的一个开发,使用它可以简化MCU的编程过程。 在使用HAL实现STM32的Stop模式唤醒时,需要以下几个步骤: 1. 配置RCC时钟:首先需要配置RCC (Reset and Clock Control)模块来启用所需的外设时钟。具体配置内容包括使能所需外设时钟,设置系统时钟源等。 2. 配置唤醒源:在进入Stop模式前,需要配置唤醒源以确定如何唤醒MCU。唤醒源可以是外部中断、定时器中断、低功耗定时器中断等。可以使用HAL提供的相应函数进行配置。 3. 进入Stop模式:调用相应的HAL函数进入Stop模式。在进入Stop模式前,需要进行一些准备工作,如关闭不需要的外设、保存必要的数据和状态等。然后调用HAL提供的函数,将MCU设置为Stop模式。 4. 唤醒处理:当满足唤醒条件时,MCU会从Stop模式中唤醒唤醒后,需要进行一些处理,如重新使能外设时钟、恢复保存的数据和状态等。可以使用HAL提供的相应函数完成这些处理。 需要注意的是,在使用HAL实现Stop模式唤醒时,需要对不同型号的STM32芯片进行不同的配置和操作。具体的配置和操作方法可以参考相关的官方文档和参考资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值