基于stm32的HAL库的低功耗及其实验

低功耗

1. 什么是低功耗?

STM32的低功耗(low power mode)特性是其嵌入式处理器系列的一个重要优势,特别适用于需要长时间 运行且功耗敏感的应用场景,如便携式设备、物联网设备、智能家居系统等。

在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电 源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大 导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。

2. STM32电源系统结构

3. 低功耗模式介绍 

STM32具有运行、睡眠、停止和待机四种工作模式。

上电后默认是在运行模式,当内核不需要继续运行时,可以选择后面三种低功耗模式。

3.1 睡眠模式(sleep mode) 

在睡眠模式下,CPU停止工作,但所有外设(如ADC、通信接口等)仍然运行,时钟继续运转。这适用于需 要暂时关闭CPU但外围设备需要继续工作的场景。

模式特点:

对系统影响小,但是节能效果最差。

在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。

进入条件:

当系统控制寄存器中的SLEEPDEEP位被清除(通常为0),并且SLEEPONEXIT位根据需求设置时(如 果设置为1,则在最低优先级中断处理程序退出时进入Sleep模式;如果为0,则执行WFI或WFE时立即 进入)。

执行WFI(Wait For Interrupt)或WFE(Wait For Event)指令来进入。

唤醒条件:

任意一个中断都能将系统从Sleep模式唤醒。

如果执行WFE指令进入Sleep模式,则一旦发生唤醒事件时,MCU将唤醒。

3.2 停机模式(stop mode)

在停机模式下,CPU和核心外围设备的时钟会停止,但部分唤醒源(如外部中断和某些定时器)仍然运行。 这适用于需要长时间等待外部事件唤醒的应用,如等待用户输入或外部信号。Stop模式实现了非常低的功 耗,同时保留了SRAM和寄存器的内容。

模式特点:

节能效果好,程序不会复位。但恢复时间较长(比如震荡器需要重新起震等)。

在停机模式下,所有的I/O引脚都保持它们在运行模式时的状态。

退出停止模式,HSI RC振荡器被选为系统时钟

进入条件:

需要将SLEEPDEEP位设置为1以进入深度睡眠模式,然后通过设置电源控制/状态寄存器(PWR_CSR) 中的PDDS位为0来选择进入Stop模式。

根据需求设置LPDS位(LPDS = 0:表示在深睡眠模式下,电压调节器保持开启状态;LPDS = 1:表示 在深睡眠模式下,电压调节器进入低功耗模式。)。

执行WFI(Wait For Interrupt)或WFE(Wait For Event)指令来进入。

在进入Stop模式之前,通常需要关闭不必要的外设时钟,并保存需要保留的状态信息。

唤醒条件

Stop模式可以通过外部中断(如按键中断、USART接收中断等)唤醒。

RTC闹钟事件、USB唤醒、以太网(ETH)唤醒等也可以作为唤醒源,但这些通常需要通过外部中断来 触发。

3.3 待机模式(standby mode)

在该模式下,CPU、外围设备和时钟都被关闭,只保留唤醒逻辑和备份寄存器。这适用于不需要保留RAM内 容且可以从复位状态恢复的设备,常见于需要极低功耗且稀疏唤醒的应用。Standby模式是STM32中功耗最 低的模式之一。

模式特点:

节能效果最好,但程序会复位,只有少数条件唤醒。

在Standby模式下,大部分IO引脚处于高阻态,只有复位引脚、TAMPER引脚(如果配置为防侵入或校 准输出)和WKUP引脚可用作唤醒源。

进入条件:

Standby模式进入前,需要清除电源控制/状态寄存器(PWR_CSR)中的WUF位,以确保没有未处理的 唤醒标志。

将SLEEPDEEP位设置为1以进入深度睡眠模式,并设置PDDS位为1来选择进入Standby模式。

执行WFI或WFE指令进入Standby模式。

唤醒条件:

Standby模式可以通过WKUP引脚的上升沿唤醒。

RTC闹钟事件也可以作为唤醒源。

独立看门狗(IWDG)复位和NRST引脚上的外部复位也可以唤醒STM32,但这通常用于系统复位而非 低功耗唤醒。

 4寄存器及库函数介绍

4. 寄存器及库函数介绍

小实验:低功耗实验

实验目的

1. 按下按键 2 ,进入低功耗模式(睡眠、停机、待机);

2. 按下按键 1 ,退出低功耗模式;

3. 正常模式下,LED1 闪烁;进入停机模式,LED2 长亮,退出停机模式则 LED2 熄灭。

/------------------------------lpwr-------------------------------/

初始化

#include "lpwr.h"
#include "led.h"

void lpwr_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    gpio_initstruct.Pin = GPIO_PIN_0;
    gpio_initstruct.Mode = GPIO_MODE_IT_RISING;//上升沿触发
	gpio_initstruct.Pull = GPIO_PULLUP;//上拉
	gpio_initstruct.Speed= GPIO_SPEED_FREQ_HIGH; 
    HAL_GPIO_Init(GPIOA,&gpio_initstruct);

    //设置中断优先级
	HAL_NVIC_SetPriority(EXTI0_IRQn,2,2);
	//使能中断
	HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}

设置中断--没写不会正常工作

void EXTI0_IRQHandler(void)
{
	//公共处理函数
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

休眠模式

void lpwr_enter_sleep(void)
{
	HAL_SuspendTick();//关闭disable滴答定时器安心睡觉
	HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);//电压调节器  其中的参数由介绍得
}

停机模式

void lpwr_enter_stop(void)
{
	//暂停滴答定时器
		HAL_SuspendTick();//关闭disable滴答定时器安心睡觉
	//点亮LED,代表进入停机模式
		led3_on();
	//进入到停机模式
		HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);//电压调节其低功耗  WFI?
	//熄灭LED2
		led3_off();
	  stm32_clock_init(RCC_PLL_MUL9);//从停机模式唤醒需要从新配置系统时钟
}

待机模式

void lpwr_enter_standby(void)
{
	//使能电源时钟 (关闭电压调节器)不需要使能使用电源时钟
	__HAL_RCC_PWR_CLK_ENABLE();
	//使能WAKEUP引脚的唤醒功能  只有一个
	HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
	//清除唤醒标记,否则将持续保持唤醒状态
	__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
	//进入待机模式
	HAL_PWR_EnterSTANDBYMode();
	//测试:看看代码会不会运行到下面  --- 实验测得是从头开始运行,会复位
	led3_on();
}

/------------------------main----------------------------/

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "lpwr.h"
#include "key.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    led_init();	/* LED初始化 */
		uart1_init(115200);
		lpwr_init();
		key_init();
//			led1_on();
//			led1_off();
		printf("helloworld!\r\n");
		uint8_t i = 0;
    while(1)
    { 
						if(key_scan() == 2)
						{
							//lpwr_enter_sleep();
							//lpwr_enter_stop();
							lpwr_enter_standby();
						}
      			if((i % 20) == 0)//循环闪烁led   平时一直闪烁  
							led1_toggle();
						i++;
						delay_ms(20);
						
    }
}

出现的问题及相关函数介绍

如果编程是没有加#include “sys.h”定义GPIO_InitTypeDef 就会疯狂报错

为什么激活后速度变得非常慢

3.2 停机模式(stop mode) 在停机模式下,CPU和核心外围设备的时钟会停止,但部分唤醒源(如外部中断和某些定时器)仍然运行。 这适用于需要长时间等待外部事件唤醒的应用,如等待用户输入或外部信号。Stop模式实现了非常低的功 耗,同时保留了SRAM和寄存器的内容。 模式特点: 节能效果好,程序不会复位。但恢复时间较长(比如震荡器需要重新起震等)。 在停机模式下,所有的I/O引脚都保持它们在运行模式时的状态。 退出停止模式,HSI RC振荡器被选为系统时钟

意思是8MHz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值