STM32 低功耗模式

目录

背景

低功耗模式

睡眠模式

进入睡眠模式

退出睡眠模式

停止模式

进入停止模式

退出停止模式

待机模式

进入待机模式

退出待机模式

程序

睡眠模式

休眠模式配置

进入休眠模式

退出睡眠模式

停止模式

停止模式配置

进入停止模式

退出停止模式

待机模式

待机模式配置

进入待机模式

退出待机模式


背景

STM32的低功耗模式主要用于减少设备的能耗,从而延长设备的使用时间,特别是在依赖电池供电的设备中尤为重要‌。通过进入不同的低功耗模式,STM32可以在不同的应用场景下实现最佳的能耗管理。本篇文章会介绍STM32的三种低功耗模式、以及如何进入和退出这三种模式。

低功耗模式

在系统或电源复位以后,微控制器处于运行状态。当 CPU 不需继续运行时,可以利用多种低功
耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间
和可用的唤醒源等条件,选定一个最佳的低功耗模式。
STM32F10xxx 有三种低功耗模式:
● 睡眠模式 (Cortex™-M3 内核停止,所有外设包括 Cortex-M3 核心的外设,如 NVIC 、系统时
钟 (SysTick) 等仍在运行 )
● 停止模式 ( 所有的时钟都已停止 )
● 待机模式 (1.8V 电源关闭 )


三种低功耗模式的区别
睡眠模式:停止CPU
停止模式:停止CPU和时钟和芯片内部外设(外设中的外是相对与内核的内而言的!)
待机模式:CPU停止、外设停止、时钟停止、SRAM也停止,寄存器停止、只有备份寄存器保存

睡眠模式

进入睡眠模式

通过执行 WFI或WFE指令进入睡眠状态 。根据 Cortex™-M3 系统控制寄存器中的 SLEEPONEXIT
位的值,有两种选项可用于选择睡眠模式进入机制:
● SLEEP-NOW :如果 SLEEPONEXIT 位被清除,当 WRI 或 WFE 被执行时,微控制器立即进
入睡眠模式。
● SLEEP-ON-EXIT :如果 SLEEPONEXIT 位被置位,系统从最低优先级的中断处理程序中退
出时,微控制器就立即进入睡眠模式。
在睡眠模式下,所有的 I/O 引脚都保持它们在运行模式时的状态。

退出睡眠模式

如果执行 WFI 指令进入睡眠模式, 任意一个被嵌套向量中断控制器响应的外设中断都能将系统从
睡眠模式唤醒
如果执行 WFE 指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。

停止模式

停止模式是在 Cortex™-M3 的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压
调节器可运行在正常或低功耗模式。此时在 1.8V 供电区域的的所有时钟都被停止, PLL 、 HSI 和
HSE RC 振荡器的功能被禁止, SRAM 和寄存器内容被保留下来。
在停止模式下,所有的 I/O 引脚都保持它们在运行模式时的状态。

进入停止模式

关于如何进入停止模式,详见表 11 。
在停止模式下,通过设置电源控制寄存器 (PWR_CR) 的 LPDS 位使内部调节器进入低功耗模式,
能够降低更多的功耗。
如果正在进行闪存编程,直到对内存访问完成,系统才进入停止模式。
如果正在进行对 APB 的访问,直到对 APB 访问完成,系统才进入停止模式。

退出停止模式

关于如何退出停止模式,
当一个中断或唤醒事件导致退出停止模式时,HSI RC振荡器被选为系统时钟。(也就是说退出之后,需要手动重新配置RCC复位时钟控制) 当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。

待机模式

待机模式可实现系统的最低功耗。该模式是在 Cortex-M3 深睡眠模式时关闭电压调节器。整个
1.8V 供电区域被断电。 PLL 、 HSI 和 HSE 振荡器也被断电。 SRAM 和寄存器内容丢失。只有备份
的寄存器和待机电路维持供电 ( 见图 4) 。

进入待机模式

关于如何进入待机模式,详见表 12 。

退出待机模式

当一个外部复位 (NRST 引脚 ) 、 IWDG 复位、 WKUP 引脚上的上升沿或 RTC 闹钟事件的上升沿发
生时 ( 见图 154 :简化的 RTC 框图 ) ,微控制器从待机模式退出。从待机唤醒后,除了电源控制 / 状
态寄存器 (PWR_CSR)( 见第 4.4.2 节 ) ,所有寄存器被复位。
从待机模式唤醒后的代码执行等同于复位后的执行 ( 采样启动模式引脚、读取复位向量等 ) 。电源
控制 / 状态寄存器 (PWR_CSR)( 见第 4.4.2 节 ) 将会指示内核由待机状态退出。

程序

睡眠模式

休眠模式配置

KEY_INT_INIT();//外部中断初始化(PA0是按键中断输入)

NVIC_SystemLPConfig(NVIC_LP_SEVONPEND,DISABLE);	//SEVONPEND: 0:只有使能的中断或事件才能唤醒内核。1:任何中断和事件都可以唤醒内核。(0=DISABLE,1=ENABLE) 
NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,DISABLE);	//SLEEPDEEP: 0:低功耗模式为睡眠模式。1:进入低功耗时为深度睡眠模式。
NVIC_SystemLPConfig(NVIC_LP_SLEEPONEXIT,DISABLE); //SLEEPONEXIT: 0: 被唤醒进入线程模式后不再进入睡眠模式。1:被唤醒后执行完相应的中断处理函数后进入睡眠模式。


PS:ISR Interrupt Serve Routine(中断服务程序)

进入休眠模式

		__WFI(); //进入睡眠模式,等待中断唤醒
//		__WFE(); //进入睡眠模式,等待事件唤醒

退出睡眠模式

通过外部中断退出

停止模式

停止模式配置

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);  //使能电源PWR时钟

进入停止模式

PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);//进入停机模式

PWR_EnterSTOPMode库函数的定义如下





退出停止模式

RCC_Configuration(); //系统时钟初始化(停机唤醒后会改用HSI时钟,需要重新对时钟初始化) 

外部中断发生
退出停止模式之后,一定要重新配置RCC!因为停止模式会关闭时钟源!

待机模式

待机模式配置

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);  //使能电源PWR时钟
	PWR_WakeUpPinCmd(ENABLE);//WKUP唤醒功能开启(待机时WKUP脚PA0为模拟输入)

使能唤醒脚

进入待机模式

PWR_EnterSTANDBYMode();//进入待机模式

PWR_EnterSTANDBYMode库函数定义位

退出待机模式

wakeup管脚退出

相关推荐
Zevalin爱灰灰16 分钟前
编程技巧(基于STM32)第一章 定时器实现非阻塞式程序——按键控制LED灯闪烁模式
stm32·单片机·嵌入式硬件
红花与香菇2____2 小时前
【学习笔记】Cadence电子设计全流程(二)原理图库的创建与设计(上)
笔记·嵌入式硬件·学习·pcb设计·cadence·pcb工艺
Jerry.yl2 小时前
关于 BK3633 上电时受串口 UART2 影响而无法启动的问题说明
嵌入式硬件·物联网·bk3633
苏慕TRYACE4 小时前
RT-Thread+STM32L475VET6实现红外遥控实验
stm32·单片机·嵌入式硬件·rt-thread
小幽余生不加糖5 小时前
deepseek帮我设计物理量采集单片机口保护电路方案
单片机·嵌入式硬件
Ronin-Lotus6 小时前
蓝桥杯篇---IAP15F2K61S2串口
单片机·嵌入式硬件·职场和发展·蓝桥杯·c·iap15f2k61s2
xiaohai@Linux6 小时前
ESP32 在IDF_V5.3.1版本下实现AP无线热点模式!(带WIFI事件处理)
c语言·嵌入式硬件·tcp/ip·wifi·esp32
yyqzjw8 小时前
【STM32】外部时钟|红外反射光电开关
stm32·单片机·嵌入式硬件
charlie1145141918 小时前
(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
c语言·stm32·单片机·嵌入式硬件·学习·教程
苏慕TRYACE8 小时前
RT-Thread+STM32L475VET6——ADC采集电压
stm32·单片机·嵌入式硬件·rt-thread