STM32的3种低功耗模式
STM32的这三种低功耗模式主要针对不同的功耗和性能需求,逐级降低功耗:
1、睡眠模式 (Sleep Mode)
特点:内核(CPU)停止运行,但系统时钟 (Systick) 和一些外设(如NVIC)仍然可以工作。这种模式非常适合短时间的休眠。
void lpwr_enter_sleep(void)
{
HAL_SuspendTick(); //暂停滴答定时器
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
}
2、停止模式 (Stop Mode)
特点:系统时钟停止,1.8V内核电源继续工作,PLL(锁相环,关闭后,系统失去倍频效果)、HIS(高速内部振荡器,内部时钟源,不再为CPU和外设提供高速时钟)和HSE RC(高速外部振荡器,用于系统时钟的基准源,失去高精度的时钟源)振荡器关闭,寄存器和SRAM数据保留。只有低速时钟 (LSI或LSE) 可以工作,允许使用低功耗的外部中断来唤醒。
void lpwr_enter_stop(void)
{
//暂停滴答定时器
HAL_SuspendTick();
//点亮LED2,代表进入停机模式
led2_on();
//进入到停机模式
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);
//熄灭LED2,代表退出停机模式
led2_off();
//当退出停机模式后,时钟也发生了变化,会从72M变为8M(HSI) 故需要重新配置系统时钟
stm32_clock_init(RCC_PLL_MUL9);
}
3、 待机模式 (Standby Mode)
特点:内核电源关闭,所有寄存器和SRAM内容丢失,仅保留备份寄存器和待机电路供电。种模式能够实现最低功耗,适用于极限低功耗场景。
不同模式进入的标志如下
不同模式的唤醒方式
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();
//测试 ,看代码会不会进行到下面
led2_on();
}
main.c 代码
#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();
uart1_init(115200);
KEY_init();
lpwr_init();
printf("hello world!\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)
led1_toggle();
i++;
delay_ms(10);
}
}