STM32速成笔记(13)—低功耗模式

发布者:TranquilGaze最新更新时间:2024-08-09 来源: elecfans关键字:STM32  低功耗模式 手机看文章 扫描二维码
随时随地手机看文章

一、STM32低功耗模式介绍

STM32提供了一些低功耗模式。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为CPU提供时钟,并执行程序代码。当 CPU 不需要继续运行(例如等待外部事件) 时,可以利用多种低功耗模式来节省功耗。

STM32 提供了 3 种低功耗模式,以达到不同层次的降低功耗的目的

  • • 睡眠模式 (内核停止工作,外设仍在运行)

  • • 停止模式 (所有时钟都停止)

  • • 待机模式 ( 1.8 V 内核电源关闭)

这三种模式所需的功耗是逐级递减,也就是说待机模式功耗是最低的。

在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM3 核心的外设全都照常运行 。在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分申源没有关闭,还保留了内核的寄存器、内存的信息,所以 从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码 。


在待机模式中,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了,也就是说, 从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测BOOT条件,从头开始执行程序 。


另外,在运行模式下也可以通过降低系统时钟,关闭APB和AHB总线上未被使用的外设时钟来降低功耗。

图片

低功耗模式一览表


二、睡眠模式

2.1 进入睡眠模式

通过执行WFI或WFE指令进入睡眠状态。根据Cortex-M3系统控制寄存器中的SLEEPONEXIT位的值,有两种选项可用于选择睡眠模式进入机制

  • • SLEEP-NOW 如果SLEEPONEXIT位被清除,当WRI或WFE被执行时,微控制器立即进入睡眠模式。

  • • SLEEP-ON-EXIT 如果SLEEPONEXIT位被置位,系统从最低优先级的中断处理程序中退出时,微控制器就立即进入睡眠模式。

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


2.2 退出睡眠模式

如果执行WFI指令进入睡眠模式 ,任意一个被嵌套向量中断控制器(NVIC)响应的外设中断都能将系统从睡眠模式唤醒。也就是任意一个外部中断都可以唤醒。

如果执行WVFE指令进入睡眠模式 ,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。唤醒事件可以通过下述方式产生

  • • 在外设控制寄存器中使能一个中断,而不是在NVIC(嵌套向量中断控制器)中使能,并且在Cortex-M3系统控制寄存器中使能SEVONPEND位。当MCU从WFE中唤醒后,外设的中断挂起位和外设的NVIC中断通道挂起位(在NVIC中断清除挂起寄存器中)必须被清除。

  • • 配置一个外部或内部的EXIT线为事件模式。当MCU从WFE中唤醒后,因为与事件线对应的挂起位未被设置,不必清除外设的中断挂起位或外设的NVIC中断通道挂起位。

该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。

图片

SLEEP-NOW模式

图片

SLEEP-ON-EXIT模式


三、停止模式

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

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


3.1 进入停止模式

在停止模式下,通过设置电源控制寄存器(PWR CR)的LPDS位使内部调节器进入低功耗模式能够降低更多的功耗。

如果正在进行闪存编程,直到对内存访问完成,系统才进入停止模式。如果正在进行对APB的访问,直到对APB访问完成,系统才进入停止模式。在停止模式下,如果在进入该模式前ADC和DAC没有被关闭,那么这些外设仍然消耗电流。通过设置寄存器ADC CR2的ADON位和寄存器DAC CR的ENx位为0可关闭这2个外设。


3.2 退出停止模式

当一个中断或唤醒事件导致退出停止模式时,HSI RC振荡器被选为系统时钟。当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。

图片

停止模式


四、待机模式

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

待机模式的进出方法如下

图片

待机模式


五、程序设计

这里介绍一下进入待机模式并唤醒的程序设计。配置进入待机模式有以下步骤

  • • 使能PWR外设时钟

  • • 使能唤醒管脚

  • • 进入待机模式

库函数中提供了进入待机模式的函数


/**

 * @brief  Enters STANDBY mode.

 * @param  None

 * @retval None

  */

void PWR_EnterSTANDBYMode(void)

{

  /* Clear Wake-up flag */

  PWR- >CR |= PWR_CR_CWUF;

  /* Select STANDBY mode */

  PWR- >CR |= PWR_CR_PDDS;

  /* Set SLEEPDEEP bit of Cortex System Control Register */

  SCB- >SCR |= SCB_SCR_SLEEPDEEP;

/* This option is used to ensure that store operations are completed */

#if defined ( __CC_ARM   )

  __force_stores();

#endif

  /* Request Wait For Interrupt */

  __WFI();

}

使能唤醒管脚的函数


/**

  * @brief  Enables or disables the WakeUp Pin functionality.

  * @param  NewState: new state of the WakeUp Pin functionality.

  *   This parameter can be: ENABLE or DISABLE.

  * @retval None

  */

void PWR_WakeUpPinCmd(FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_FUNCTIONAL_STATE(NewState));

  *(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState;

}

测试代码如下


int main(void)

{

    Med_Mcu_Iint();   // 系统初始化

    

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);   // 使能PWR外设时钟

    PWR_WakeUpPinCmd(ENABLE);   // 使能唤醒管脚 使能或者失能唤醒管脚功能

    

    while(1)

  {

        printf ('Time: 5 rn');

        delay_ms(1000);

        

        printf ('Time: 4 rn');

        delay_ms(1000);

        

        printf ('Time: 3 rn');

        delay_ms(1000);

        

        printf ('Time: 2 rn');

        delay_ms(1000);

        

        printf ('Time: 1 rn');

        delay_ms(1000);

        

        printf ('进入待机模式rn');

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

    }

}


测试结果如下

图片

待机唤醒测试结果

串口输出完“进入待机模式”后,串口不再输出。当按下WK UP时,重新开始倒计时,进入待机模式。

值得注意的是,进入待机模式被唤醒后,程序是重新开始运行的。对于一些只需要第一次开机才显示的页面或者一些第一次开机校准参数的程序,可以通过第一次开机向Flash固定地址写入数据,下次复位读取对应地址的数据,来判断是否是第一次开机的方法,避免它们在待机唤醒后再次被执行。


关键字:STM32  低功耗模式 引用地址:STM32速成笔记(13)—低功耗模式

上一篇:STM32F407 串口配置步骤
下一篇:stm32软复位 内核复位和系统复位

推荐阅读最新更新时间:2024-11-12 13:33

STM32之DAC例程
#include stm32f10x.h /* RCC时钟配置 */ void RCC_config() { ErrorStatus HSEStartUpStatus; /* RCC寄存器设置为默认配置 */ RCC_DeInit(); /* 打开外部高速时钟 */ RCC_HSEConfig(RCC_HSE_ON); /* 等待外部高速时钟稳定 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* 设置HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCL
[单片机]
STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置
cube基本配置,外设开启编码器,串口2 -------------------------------------------------------------------------------------------------------------------------- 错误:error: #20: identifier TIM_ICPOLARITY_BOTHEDGE is undefined 意思是,高级、通用定时器不能用BothEdge,只有基本定时器才能用BothEdge F4系列 /* 编码器初始化及使能编码器模式 */ ENCODER_TIMx_Init(); HA
[单片机]
<font color='red'>STM32</font> HAL库学习系列第5篇 定时器TIM---编码器接口<font color='red'>模式</font>配置
NVIC中断优先级管理
一,STM32中断介绍 CM3内核支持256个中断,16个内核中断和240个外部中断,具有256级可编程中断设置 STM32只使用了CM3内核的一部分,84个中断:16个内核中断+68个可屏蔽中断(外部中断),具有16级可编程的中断优先级 STM32F103系列只有60个可屏蔽中断(F107系列有68个) 二,中断管理 STM32有如此多的中断,那么是如何进行管理的 中断优先级分组:  SCB- AIRCR 3位寄存器 : 配置分组,确定中断具有几位抢占优先级和几位响应优先级 每一个中断都具有一个 4位IP寄存器,通过这4个位来设置抢占和响应优先级, 16级可编程中断优先级(2的4次方=16) 配置
[单片机]
NVIC中断优先级管理
stm32学习笔记——独立看门狗
独立看门狗知识点: 关键字寄存器IWDG_KR: a、写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET); b、写入0xAAAA(无论何时), IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位; c、写入0x5555,取消寄存器IWDG_PR和IWDG_RLR的保护功能
[单片机]
<font color='red'>stm32</font>学习<font color='red'>笔记</font>——独立看门狗
STM32 RTC时钟晶振 调电RTC计数器不走的问题
在初始化配置的情况下,RTC 日历时间我们默认设置一个时间点,此时备份区设置一个默认参数,表示已经设置过,后期只需要更新读取RTC- CNT 即可,如果出现断电计数器不走的情况,在生产上遇到,晶振贴片没有贴好,导致出厂默认读取的外部高速晶振HSE,这样后期不去掉纽扣电池点的话,默认都是外部高速晶振,这样外币32.768kHZ的晶振实际是没有用的,借此希望给大家一点提示。
[单片机]
<font color='red'>STM32</font> RTC时钟晶振 调电RTC计数器不走的问题
STM32低功耗模式简介
STM32F10xxx有三中低功耗模式: ●睡眠模式(Cortex?-M3内核停止,外设仍在运行) ●停止模式(所有的时钟都以停止) ●待机模式(1.8V电源关闭) 时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。 上电,默认使用内部HSI时钟8M,经测试10mA左右。待机模式可实现系统的最低功耗。 可将电流消耗降至两微安。 在待机模式下,所有的I/O引脚处于高阻态,除了以下的引脚: ●复位引脚(始终有效) ●当被设置为防侵入或校准输出时的TAMPER引脚 ●被使能的唤醒引脚 /*按钮GPIOB9进入睡眠,WKUP pin(GPIOA0)唤
[单片机]
<font color='red'>STM32</font><font color='red'>低功耗</font><font color='red'>模式</font>简介
STM32串口中断卡死主循环一直进中断问题分析
在一项目中,使用STM32作为主控,程序运行一段时间后概率出现主循环卡死现象。 问题分析如下: 1、程序USART2不停接收并处理串口数据,波特率115200; 2、主循环卡死; 3、USART1中断及TIM2中断响应函数运行正常;(USART1及TIM2中断优先级均比USART2高) 4、出现现象后,拔掉USART2的接收数据线,现象不能回复正常; 5、出现现象后,拔掉后再插入USART2的接收数据线,现象不能回复正常; 6、并未出现HardFault现象; 基于以上4点,可能原因如下: 1、USART2接收中断标志没有清除; 2、堆栈数据溢出,导致程序异常; 3、USART2中断重入导致异常; 4、USART2中断
[单片机]
<font color='red'>STM32</font>串口中断卡死主循环一直进中断问题分析
关于STM32开发工具之STM Studio调试和诊断工具讲解
STM Studio这个工具出来很久了,可能很多人都没听说过。之前没写过,今天就写点关于STM Studio的内容。 1写在前面 针对 STM32 软件的开发工具有很多,从开篇图片也能看到,不知大家用过其中哪些工具? STM32软件开发工具地址: https://www.st.com/en/development-tools/stm32-software-development-tools.html 本文就重点讲述其中的一个工具:STM Studio. 2关于STM Studio STM Studio是通过实时读取和显示变量来帮助调试和诊断STM32应用程序。 STM Studio在PC上运行,通过标准的ST-LINK开发
[单片机]
关于<font color='red'>STM32</font>开发工具之STM Studio调试和诊断工具讲解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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