0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至子 来源:二土电子 作者:二土电子 2023-10-24 15:39 次阅读

一、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访问完成,系统才进入停止模式。在停止模式下,如果在进入该模式前ADCDAC没有被关闭,那么这些外设仍然消耗电流。通过设置寄存器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固定地址写入数据,下次复位读取对应地址的数据,来判断是否是第一次开机的方法,避免它们在待机唤醒后再次被执行。`

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6809

    浏览量

    147636
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348738
  • 中断处理
    +关注

    关注

    0

    文章

    92

    浏览量

    10890
  • Cortex-M3
    +关注

    关注

    9

    文章

    268

    浏览量

    59162
  • 上电复位
    +关注

    关注

    1

    文章

    38

    浏览量

    15628
收藏 人收藏

    评论

    相关推荐

    详解STM32低功耗模式

    本文讨论下STM32低功耗模式,先看如下手册。
    的头像 发表于 11-08 12:18 1305次阅读

    stm32低功耗模式

    最近学习了stm32低功耗模式, 发现很多可以学习的地方, 单片机功耗要低才能续航很久模式1sleep_mode
    发表于 08-02 08:31

    STM32低功耗模式

    STM32低功耗模式共有三个:睡眠模式-(sleep): 睡眠模式功耗是mA级别,一般在实际
    发表于 08-12 08:15

    STM32低功耗模式

    很多单片机都有低功耗模式STM32 也不例外。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省
    发表于 08-20 07:55

    STM32有哪几种低功耗模式

    MCU学习笔记电源管理系统1. STM32低功耗模式概述2. 寄存器和库函数配置3. HAL库配置PVD实例1.STM32
    发表于 11-03 08:36

    基于STM32单片机低功耗模式机制详细解析

    本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32
    发表于 10-24 16:16 1.9w次阅读
    基于<b class='flag-5'>STM32</b>单片机<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>机制详细解析

    探究STM32低功耗的几种模式

    低功耗模式 本文讨论下STM32低功耗模式,先看如下手册。 对比了 STM32F0 和
    的头像 发表于 07-26 17:49 1w次阅读
    探究<b class='flag-5'>STM32</b><b class='flag-5'>低功耗</b>的几种<b class='flag-5'>模式</b>

    MCU学习笔记_STM32低功耗模式概述

    MCU学习笔记电源管理系统1. STM32低功耗模式概述2. 寄存器和库函数配置3. HAL库配置PVD实例1. STM32
    发表于 10-28 17:36 9次下载
    MCU学习<b class='flag-5'>笔记</b>_<b class='flag-5'>STM32</b><b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>概述

    stm32低功耗模式

    前言在做很多产品的时候,功耗是必须要考虑的一项因素,一定程度上决定了你的产品是否有竞争力,降低功耗可以从硬件上和软件上进行处理,而软件上进入低功耗模式是降
    发表于 12-07 15:51 9次下载
    三 <b class='flag-5'>stm32</b><b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>

    STM32学习笔记 | 电源管理及低功耗设计要点

    STM32学习笔记 | 电源管理及低功耗设计要点
    发表于 12-07 16:06 18次下载
    <b class='flag-5'>STM32</b>学习<b class='flag-5'>笔记</b> | 电源管理及<b class='flag-5'>低功耗</b>设计要点

    STM32低功耗模式之待机模式

    上周完成了一个小项目,项目涉及到stm32低功耗的待机模式,特在此记录下32的待机模式。 芯片:STM32f030F4 库:HAL库
    发表于 12-07 16:21 7次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>之待机<b class='flag-5'>模式</b>

    PWR-低功耗模式-STM32F4

    使用芯片===>STM32F429IGT6(制作不易,希望大佬能给个赞支持下小丁)目录1、低功耗模式简介很多单片机有低功耗模式
    发表于 12-28 19:25 9次下载
    PWR-<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>-<b class='flag-5'>STM32</b>F4

    STM32开发笔记46:STM32F0低功耗设计

    单片机型号:STM32F070F6P6项目中需要使单片机STM32F070F6P6进入低功耗模式,本文记录整个过程。1、STM32F070的
    发表于 12-31 19:06 12次下载
    <b class='flag-5'>STM32</b>开发<b class='flag-5'>笔记</b>46:<b class='flag-5'>STM32</b>F0<b class='flag-5'>低功耗</b>设计

    STM32 低功耗STOP模式,RTC唤醒

    芯片:STM32L071CB开发环境:STM32CubeMX + keil5.33使用实时时钟RTC的 WakeUpTimer定时器产生的中断将STM32从STOP低功耗
    发表于 12-31 19:06 43次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>低功耗</b>STOP<b class='flag-5'>模式</b>,RTC唤醒

    AN2629 STM32F1低功耗模式

    AN2629 STM32F1低功耗模式
    发表于 11-24 08:30 0次下载
    AN2629 <b class='flag-5'>STM32</b>F1<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>