精华内容
下载资源
问答
  • stm32低功耗

    2017-07-20 14:53:30
    cpu: STM32F042F6 目的:低功耗解决方案 方案:利用RTC闹钟事件将cpu从停止模式中唤醒,处理完事情后 重新设置时间,(闹钟时间不变)。进入低功耗。 说明:对于新手,先将寄存器摸清楚是非常有必要的。 */ /** * ...
    /**
    时间:2017年7月20日
    cpu: STM32F042F6
    目的:低功耗解决方案
    方案:利用RTC闹钟事件将cpu从停止模式中唤醒,处理完事情后
          重新设置时间,(闹钟时间不变)。进入低功耗。
    说明:对于新手,先将寄存器摸清楚是非常有必要的。
    */
    
    
    /** 
    * 重新设置时间
    */
    void rtc_timeregulate(void)
    {
    	RTC_TimeTypeDef RTC_TimeStructure;
    	RTC_TimeStructure.RTC_H12     = RTC_H12_AM;
        RTC_TimeStructure.RTC_Hours = 10;
    	RTC_TimeStructure.RTC_Minutes = 0;
    	RTC_TimeStructure.RTC_Seconds = 0;
        RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure);
    }
    
    /**
    * RTC中断函数 
    */
    void RTC_IRQHandler(void)
    {
      if(RTC_GetITStatus(RTC_IT_ALRA) != RESET)
      {
        PWR_BackupAccessCmd(ENABLE);
        RTC_ClearITPendingBit(RTC_IT_ALRA);
        EXTI_ClearITPendingBit(EXTI_Line17);
        rtc_irqcallback();
        rtc_timeregulate();
    	
    	/* 进入低功耗模式 */
    	PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE);
      } 
    }
    
    /**
    * RTC中断回调函数
    */
    void rtc_irqcallback(void)
    {
    	run_all(); /* 系统运行 */
    }
    
    /**
    * RTC初始化时要设置系统时间和闹钟 
    */
    void RTC_TimeRegulate(void)
    { 
      RTC_TimeTypeDef RTC_TimeStructure;
      RTC_AlarmTypeDef  RTC_AlarmStructure;
    
      RTC_TimeStructure.RTC_H12     = RTC_H12_AM;
      RTC_TimeStructure.RTC_Hours = 10;
      RTC_TimeStructure.RTC_Minutes = 0;
      RTC_TimeStructure.RTC_Seconds = 0;
      RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure);
    
      /* Disable the Alarm A */
      RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
    
      RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM;
      RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 10;
      RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0;
      RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 5;
    
      RTC_AlarmStructure.RTC_AlarmMask = ( RTC_AlarmMask_DateWeekDay|RTC_AlarmMask_Hours|RTC_AlarmMask_Minutes);
      RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
    	
      /* Enable the RTC Alarm A Interrupt */
      RTC_ITConfig(RTC_IT_ALRA, ENABLE);
       
      /* Enable the alarm  A */
      RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
    }
    
    /**
    * RTC配置函数
    */
    void RTC_CheckAndConfig(void)
    {
        RTC_InitTypeDef RTC_InitStructure;
        EXTI_InitTypeDef  EXTI_InitStructure;
    
        RTC_Configuration();
    
        /* Configure the RTC data register and RTC prescaler */
        RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;
        RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;
        RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
    
        /* Check on RTC init */
        if (RTC_Init(&RTC_InitStructure) == ERROR)
            {
                //printf("\n\r        /!\\***** RTC Prescaler Config failed ********/!\\ \n\r");
            }
    
        /* Configure the time register */
        RTC_TimeRegulate();
    
        /* RTC Alarm A Interrupt Configuration */
        EXTI_ClearITPendingBit(EXTI_Line17);
        EXTI_InitStructure.EXTI_Line = EXTI_Line17;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
    
        RTC_NVIC_Config();
    }
    
    /**
    * RTC的时钟配置,内部时钟
    */
    void RTC_Configuration(void)
    {
    
        /* Enable the PWR clock */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    
        /* Allow access to RTC */
        PWR_BackupAccessCmd(ENABLE);
    
        /* The RTC Clock may varies due to LSI frequency dispersion. */
        /* Enable the LSI OSC */
        RCC_LSICmd(ENABLE);
    
        /* Wait till LSI is ready */
        while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
            {
            }
    
        /* Select the RTC Clock Source */
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
    
        SynchPrediv = 0x18F;
        AsynchPrediv = 0x63;
    
        /* Enable the RTC Clock */
        RCC_RTCCLKCmd(ENABLE);
    
        /* Wait for RTC APB registers synchronisation */
        RTC_WaitForSynchro();
    }

    展开全文
  • STM32低功耗例子

    2018-09-19 09:19:58
    stm32低功耗例子,非常好用,大家可以下载试试,学习低功耗
  • STM32低功耗做法.docx

    2017-11-01 16:25:09
    STM32低功耗做法.docx
  • STM32低功耗--待机模式

    2020-12-21 17:43:40
    STM32低功耗模式。待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。
  • 本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。 一、STM32芯片性能 使用芯片型号:stm32,CORTEX -M0.封装TSSOP20. 运行模式:...



    本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。

    一、STM32芯片性能

    使用芯片型号:stm32,CORTEX -M0.封装TSSOP20.

    运行模式:内部时钟(HSI),系统时钟频率采用48MHZ

    工作电压:3.3V

    芯片具体参数如下:


    二、芯片功耗

    功耗:


    芯片工作模式:

    工作模式:外设正常运行,内核CPU及SRAM供电,未使用外设的时钟默认关闭。

    睡眠模式只有CPU停止工作,各个外设正常工作,依靠任何中断/事件唤醒。

    停机模式1.8V供电区域时钟被停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测器也可进入低功耗模式,但SRAM和寄存器不断电,此时只能依靠外部中断(EXTI)RTC时钟才能唤醒。

    待机模式:1.8V供电区域被时钟停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测器也可进入低功耗模式,SRAM和不属于待机电路的寄存器也被断电关闭,此时即使是外部中断(EXTI)也不能将其唤醒,只能通过复位(外部复位,看门狗复位)、唤醒引脚、RTC时钟来唤醒。

    注意:无论是在停止模式 还是待机模式下,RTCIWDG及其时钟源不会被关闭。

    各个模式功耗:

    功耗计算方式:功耗=工作电压*工作电流。




    I/O模块损耗:

    静态损耗:

    内部上下拉电阻损耗:这部分损耗主要取决于内部电阻的大小,一般为了降低内部电阻损耗常常需要降低电阻两端电压,若引脚为低电压则采用下拉电阻,若引脚为高电压则采用上拉电阻。

    I/O额外损耗:当引脚设为输入I/O时,用来区分电压高低的斯密特触发器电路会产生一部分消耗,为此可将引脚设为模拟输入模式。

    动态损耗:对于悬浮的引脚,由于其电压不稳定会产生外部电磁干扰和损耗,因此必须把悬浮引脚设为模拟模式或输出模式,引脚电压的切换会对外部和内部电容负载产生动态损耗,其损耗与电压切换频率和负载电容有关。具体损耗值如下:


    三、CORTEX-M0低功耗功能、指令、相关寄存器

    CORREX内核支持低功耗模式有2种:

    睡眠模式CPU时钟停止,对应stm32睡眠模式

    深度睡眠模式:系统时钟停止,PLL,FLASH 关闭,对应stm32停机模式。

    进入睡眠模式:

    CPU处理完中断后软件必须能使其进入睡眠模式,当CPU执行WFI指令,其将会立即进入睡眠模式,当异常产生或中断被挂起时,其立即被唤醒。

    CPU执行WFE指令时,它首先会检查对应的事件标志位,当事件标志寄存器为0时进入睡眠模式,否则将寄存器事件标志清0并继续执行程序。事件标志可由外部事件标志或SEV指令产生。

    返回方式:通过设置内核SCB寄存器的Sleep-on-exit位,可以选择系统被唤醒执行完中断服务程序后进入主线程模式后是否立即进入睡眠模式。

    从睡眠中唤醒:

    WFI唤醒或sleep-on-exit

    一般来说,使能的异常可以唤醒内核。对于一些系统,在唤醒后执行中断处理程序前需要先执行重新恢复的任务,则首先需要屏蔽所有中断(PRIMASK=1),中断发生后内核被唤醒但不执行中断处理,待执行完恢复任务后再将PRIMASK设为0,此后执行中断处理任务。

    WFE唤醒:

    使能异常可以唤醒内核。外部事件或SEV指令发送的事件也可唤醒内核。

    注意:当SCRSEVONPEND设置为1时,任何使能/非使能中断或事件都可唤醒内核。

    中断唤醒控制器(WIC):

    WIC只有在SCR寄存器DEEPSLEEP位设为1时才能使能,WIC不可编程也没有相关的控制寄存器,它仅与硬件信号有关,当进入深睡眠时内核大部分模块被关闭,系统计数器也被关闭,因此当内核被唤醒时需要较多的时间恢复到睡眠前的状态并处理中断。

    外部事件输入:可在WFE模式下唤醒内核。

    相关指令:

    WFE  等待事件,若无事件则睡眠,中断、事件唤醒

    WFI   等待中断,立即进入睡眠,中断唤醒

    SEV  软件发送一个事件,在核系统中可唤醒另一个内核。

    微控制器软件接口标准

    由指令对应的C语言接口:

    //core_cmInstr.h

    void __WFE(void) // Wait for Event

    void __WFI(void) // Wait for Interrupt

    void __SEV(void) // Send Event

    相关寄存器:

    SCR寄存器:


    SEVONPEND:

    0: 只有使能的中断或事件才能唤醒内核。

    1: 任何中断和事件都可以唤醒内核。

    SLEEPDEEP:

    0: 低功耗模式为睡眠模式。

    1: 进入低功耗时为深度睡眠模式。

    SLEEPONEXIT:

    0:  被唤醒进入线程模式后不再进入睡眠模式。

    1: 被唤醒后执行完相应的中断处理函数后进入睡眠模式。

    四、STM32时钟管理

    运行模式下可通过关闭和降低相关外设的时钟频率来减少功耗。

    APB 外设时钟和DMA时钟可用软件禁止。

    睡眠模式停止CPU时钟。在CPU睡眠中存储器接口时钟(FlashRAM接口)可被停止。当连接到APB所有外设的时钟禁止后,当进入睡眠期间AHB APB桥时钟由CPU的硬件关闭。

    CPU进入停止模式时停止V18域、PLLHSIHSI14HSE振荡器的时钟。

    HDMI CEC, USART1 I2C1 即使在MCU 进入停止模式下仍有能力打开HIS振荡器 (假如HIS被选为这些外设的时钟)

    LSE振荡器已使能的情况下,HDMI CEC 和 USART1 当在系统进入停止模式下也可由LSE振荡器驱动 (假如LSE被选为这些外设时钟)。但是这些外设没有打开LSE振荡器的能力。

    CPU进入待机模式时停止V18域、PLLHSIHSI14HSE振荡器的时钟。

    当设置DBGMCU_CR寄存器中的DBG_STOP DBG_STANDBY位,那么CPU在相应的深度睡眠模式下也可以具有调试功能。

    当系统由中断(停止模式)或复位(待机模式)唤醒后,HSI振荡器被选为系统时钟(不管进入停止模式或待机模式前选用的是何种时钟)

    假如当前正在进行闪存编程,只有在闪存编程全部完成之后才会进入深度睡眠模式(深度睡眠延后)。若当前正在使用APB域,那么只有全部完成APB域的操作后才进入深度睡眠模式。

    五、STM32低功耗设置


    STM32工作模式主要有运行、睡眠、停止、待机4种模式,前面已介绍过。详细见第二节。

    供电框图

      由上图可以看到整个stm32芯片的供电图,模拟电路部分采用VDDA独立供电,各个部分可以独立被关断或开启。备份电路部分由电池供电,主要有RTC时钟及相关的备份寄存器,VDD掉电后可由电池供电,对于没有VBAT引脚的芯片,其电源直接与VDD相连。核心部分分为1.8V工作域和VDD工作域,1.8V工作域主要有内核、存储、外设部分,VDD供电域主要有I/O、待机电路(唤醒电路,独立看门狗)、电压调节器(Voltage Regulator)

    电压调节器

    器件复位后电压调节器总是打开着的,其根据应用模式有三种不同的工作模式。

    运行模式:调节器以全功耗模式为域 (内核,内存和数字外设提供1.8V电源。

    停止模式:调节器以低功耗模式为保持寄存器及SRAM数据部分域提供1.8V的电源。

    待机模式:调节器断电,除了待机电路及备份域电路外,寄存器和SRAM的内容全部丢失。

    相关寄存器介绍:

    1cortex-mo中的SCR寄存器

    SEVONPEND:

    0: 只有使能的中断或事件才能唤醒内核。

    1: 任何中断和事件都可以唤醒内核。

    SLEEPDEEP:

    0: 低功耗模式为睡眠模式。

    1: 进入低功耗时为深度睡眠模式。

    SLEEPONEXIT:

    0:  被唤醒进入线程模式后不再进入睡眠模式。

    1: 被唤醒后执行完相应的中断处理函数后进入睡眠模式。

    2,电源控制寄存器PWR_CR


    其中与低功耗有关的控制位:

    CSBF: 清除待机标志,该位始终读出为0,写1清除待机标志。

    CWUF: 清除唤醒标志,该位始终读出为0。写1清除唤醒标志。

    PDDS: 掉电深睡眠

    0: CPU进入深睡眠时进入停机模式,调压器的状态由LPDS位控制。

    1: CPU进入深睡眠时进入待机模式。

    LPDS: 深睡眠下的低功耗

    0: 在停机模式下电压调节器开启

    1: 在停机模式下电压调节器处于低功耗模式

    3,电源控制/状态寄存器(PWR_CSR)


    EWUP2/EWUP1: 使能WKUP2EWUP1引脚。

    0: WKUP1/2 引脚作为通用IO口。WKUP1引脚上的事件不能将CPU从待机模式唤醒。

    1: WKUP1/2引脚用于将CPU从待机模式唤醒,WKUP1引脚被强置为输入下拉的配置(WKUP1引脚上的上升沿将系统从待机模式唤醒)

    SBF: 待机标志

    该位由硬件设置,只能设置电源控制寄存器PWR_CRCSBF位清除。

    0:系统不在待机模式

    1:系统进入待机模式

    WUF: 唤醒标志

    由硬件设置,只能设置电源控制寄存器PWR_CRCWUF位清除。

    0: 没有唤醒事件发生

    1: WKUPRTC闹钟产生一个唤醒事件

    注意:当WKUP引脚已经是高电平时,在(通过设置EWUP)使能WKUP引脚时,会检测到一个额外唤醒的事件。 

    低功耗模式的进入与退出问题

    1、睡眠模式

    进入睡眠模式:

    STM32在运行状态时,执行WFIWFE指令可进入睡眠模式。

    条件:SLEEPDEEP=0,设为睡眠模式。此时CPU时钟被停止。

    若令被唤醒的STM32执行完中断处理任务后进入睡眠模式,则可将SLEEPONEXIT设为1.

    退出睡眠模式:

    执行WFI指令进入睡眠,可通过使能中断唤醒。执行WFE指令进入睡眠可由事件唤醒,CPU时钟打开。产生事件的两种方式:

    配置一个外部或内部EXTI线做为事件模式。

    使能外设中断但不使能NVIC中断,同时将SEVONPEND设为1,此时任何中断和事件都可以唤醒内核,此时必须清除NVIC和外设的中断标志以免唤醒后出错。

    2、停止模式

    进入停止模式:

    进入停止模式后1.8电压区域时钟被停止,PLLHSIHSE被关闭,但SRAM和寄存器正常供电。进入停止模式方法:首先确定所有中断/事件标志被清除否则不会进入停止模式,关闭ADC\DAC电源,将SLEEPDEEP设为深睡眠模式,在深睡眠后选择进入停机模式(PDDS=0),可关闭或开启电压调节器(LPDS),执行WFIWFE指令进入停机模式。

    退出停止模式:

    一个使能的外部中断或外部事件可唤醒STM32SMT32被唤醒后系统时钟被设为HSI。因此在唤醒后还需软件恢复时钟设置,并清除相关的低功耗标志。

    3、待机模式

    进入待机模式:

    进入SRAM和寄存器内容丢失,进入条件:将SLEEPDEEP设为深睡眠模式,在深睡眠后选择进入待机模式(PDDS=1),关闭电压调节器(LPDS),执行WFIWFE指令进入待机模式。

    在待机模式下,除了复位引脚(始终有效)、当配置为防侵入或校准输出时的TAMPER 引脚、使能的唤醒(WKUP)引脚外,所有的I/O口线处于高阻态。因此进入待机模式前不需要再特意配置引脚的低功耗特性。

    退出待机模式:

    IWDG复位,WKUP引脚上的上升沿或RTC 闹钟事件可唤醒STM32,当退出待机模式时除了电源控制/状态寄存器(PWR_CSR)外所有寄存器复位,整个系统被复位。

    4、低功耗模式下的RTC自动唤醒

    RTC可以在不需要依赖外部中断的情况下唤醒低功耗模式下的微控制器(自动唤醒模式)RTC提供一个可编程的时间基数,用于周期性从停止或待机模式下唤醒。

    从停止模式下唤醒,必须进行如下操作:

    配置外部中断线17为上升沿触发。

    配置RTC使其可产生RTC闹钟事件。

    从待机模式中唤醒,不必配置外部中断线17

    5、调试模式

    默认情况下,如果在进行调试微处理器时,使微处理器进入停止或待机模式,将失去调试连接。这是因为Cortex-M0的内核失去了时钟。通过设置DBGMCU_CR寄存器中的某些配置位,可以在使用低功耗模式下调试软件。

    六、低功耗模式总结

    降低STM32功耗方法主要有:

    关闭不需要的外设、降低STM32的系统频率。

    合理设置I/O降低I/O静态和动态损耗。

    进入低功耗模式。

    恢复到正常运行状态:

    睡眠模式由中断或事件唤醒,唤醒后可清除唤醒标志。

    停止模式:唤醒后需恢复时钟设置,并将改动的I/O设置恢复。

    待机模式:唤醒后系统被恢复,随后系统被复位,可清除待机标志。

     

    七、固件库使用

    主要文件:

    stm32f0xx_rcc.cstm32f0xx_gpio.cstm32f0xx_pwr.c

     

    时钟及I/O设置相关函数(部分):

    void RCC_XXXPeriphClockCmd(X,X) ; //用于使能和关闭外设时钟

    void SystemInit (void)//系统初始化设置时钟

    GPIO_Init(GPIOX, &GPIO_InitStructure);//设置相关引脚

     

    低功耗函数(部分):

     

    //唤醒引脚配置

    void PWR_WakeUpPinCmd(uint32_t PWR_WakeUpPin, FunctionalState NewState);

    ///清除寄存器状态标识

    FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);

    void PWR_ClearFlag(uint32_t PWR_FLAG);

    进入低功耗模式:

    void  PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry);

    Void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);

    void PWR_EnterSTANDBYMode(void);

     

    函数解析:

    下面是一个进入停机模式的函数,此函数功能和使用方法在注释部分已经非常明确。通过源代码可以看出SMT32在停机模式下寄存器的设置情况。调用此函数STM32可进入低功耗模式。


    void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)

    {

      uint32_t tmpreg = 0;

     

      /* Check the parameters */

      assert_param(IS_PWR_REGULATOR(PWR_Regulator));

      assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));

     

      /* Select the regulator state in STOP mode ---------------------------------*/

      tmpreg = PWR->CR;

      /* Clear PDDS and LPDSR bits */

      tmpreg &= CR_DS_MASK;

     

      /* Set LPDSR bit according to PWR_Regulator value */

      tmpreg |= PWR_Regulator;

     

      /* Store the new value */

      PWR->CR = tmpreg;

     

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

      SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;

     

      /* Select STOP mode entry --------------------------------------------------*/

      if(PWR_STOPEntry == PWR_STOPEntry_WFI)

      {

        /* Request Wait For Interrupt */

        __WFI();

      }

      else

      {

        /* Request Wait For Event */

        __WFE();

      }

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

      SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);  

    }

     博客地址:Beep  http://blog.csdn.net/beep_

    展开全文
  • STM32低功耗总结——转载

    万次阅读 2018-05-23 11:22:48
    本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。 一、STM32芯片性能 使用芯片型号:stm32,CORTEX -M0.封装TSSOP20. 运行...



    本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。

    一、STM32芯片性能

    使用芯片型号:stm32,CORTEX -M0.封装TSSOP20.

    运行模式:内部时钟(HSI),系统时钟频率采用48MHZ

    工作电压:3.3V

    芯片具体参数如下:


    二、芯片功耗

    功耗:


    芯片工作模式:

    工作模式:外设正常运行,内核CPU及SRAM供电,未使用外设的时钟默认关闭。

    睡眠模式只有CPU停止工作,各个外设正常工作,依靠任何中断/事件唤醒。

    停机模式1.8V供电区域时钟被停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测器也可进入低功耗模式,但SRAM和寄存器不断电,此时只能依靠外部中断(EXTI)RTC时钟才能唤醒。

    待机模式:1.8V供电区域被时钟停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测器也可进入低功耗模式,SRAM和不属于待机电路的寄存器也被断电关闭,此时即使是外部中断(EXTI)也不能将其唤醒,只能通过复位(外部复位,看门狗复位)、唤醒引脚、RTC时钟来唤醒。

    注意:无论是在停止模式 还是待机模式下,RTCIWDG及其时钟源不会被关闭。

    各个模式功耗:

    功耗计算方式:功耗=工作电压*工作电流。




    I/O模块损耗:

    静态损耗:

    内部上下拉电阻损耗:这部分损耗主要取决于内部电阻的大小,一般为了降低内部电阻损耗常常需要降低电阻两端电压,若引脚为低电压则采用下拉电阻,若引脚为高电压则采用上拉电阻。

    I/O额外损耗:当引脚设为输入I/O时,用来区分电压高低的斯密特触发器电路会产生一部分消耗,为此可将引脚设为模拟输入模式。

    动态损耗:对于悬浮的引脚,由于其电压不稳定会产生外部电磁干扰和损耗,因此必须把悬浮引脚设为模拟模式或输出模式,引脚电压的切换会对外部和内部电容负载产生动态损耗,其损耗与电压切换频率和负载电容有关。具体损耗值如下:


    三、CORTEX-M0低功耗功能、指令、相关寄存器

    CORREX内核支持低功耗模式有2种:

    睡眠模式CPU时钟停止,对应stm32睡眠模式

    深度睡眠模式:系统时钟停止,PLL,FLASH 关闭,对应stm32停机模式。

    进入睡眠模式:

    CPU处理完中断后软件必须能使其进入睡眠模式,当CPU执行WFI指令,其将会立即进入睡眠模式,当异常产生或中断被挂起时,其立即被唤醒。

    CPU执行WFE指令时,它首先会检查对应的事件标志位,当事件标志寄存器为0时进入睡眠模式,否则将寄存器事件标志清0并继续执行程序。事件标志可由外部事件标志或SEV指令产生。

    返回方式:通过设置内核SCB寄存器的Sleep-on-exit位,可以选择系统被唤醒执行完中断服务程序后进入主线程模式后是否立即进入睡眠模式。

    从睡眠中唤醒:

    WFI唤醒或sleep-on-exit

    一般来说,使能的异常可以唤醒内核。对于一些系统,在唤醒后执行中断处理程序前需要先执行重新恢复的任务,则首先需要屏蔽所有中断(PRIMASK=1),中断发生后内核被唤醒但不执行中断处理,待执行完恢复任务后再将PRIMASK设为0,此后执行中断处理任务。

    WFE唤醒:

    使能异常可以唤醒内核。外部事件或SEV指令发送的事件也可唤醒内核。

    注意:当SCRSEVONPEND设置为1时,任何使能/非使能中断或事件都可唤醒内核。

    中断唤醒控制器(WIC):

    WIC只有在SCR寄存器DEEPSLEEP位设为1时才能使能,WIC不可编程也没有相关的控制寄存器,它仅与硬件信号有关,当进入深睡眠时内核大部分模块被关闭,系统计数器也被关闭,因此当内核被唤醒时需要较多的时间恢复到睡眠前的状态并处理中断。

    外部事件输入:可在WFE模式下唤醒内核。

    相关指令:

    WFE  等待事件,若无事件则睡眠,中断、事件唤醒

    WFI   等待中断,立即进入睡眠,中断唤醒

    SEV  软件发送一个事件,在核系统中可唤醒另一个内核。

    微控制器软件接口标准

    由指令对应的C语言接口:

    //core_cmInstr.h

    void __WFE(void) // Wait for Event

    void __WFI(void) // Wait for Interrupt

    void __SEV(void) // Send Event

    相关寄存器:

    SCR寄存器:


    SEVONPEND:

    0: 只有使能的中断或事件才能唤醒内核。

    1: 任何中断和事件都可以唤醒内核。

    SLEEPDEEP:

    0: 低功耗模式为睡眠模式。

    1: 进入低功耗时为深度睡眠模式。

    SLEEPONEXIT:

    0:  被唤醒进入线程模式后不再进入睡眠模式。

    1: 被唤醒后执行完相应的中断处理函数后进入睡眠模式。

    四、STM32时钟管理

    运行模式下可通过关闭和降低相关外设的时钟频率来减少功耗。

    APB 外设时钟和DMA时钟可用软件禁止。

    睡眠模式停止CPU时钟。在CPU睡眠中存储器接口时钟(FlashRAM接口)可被停止。当连接到APB所有外设的时钟禁止后,当进入睡眠期间AHB APB桥时钟由CPU的硬件关闭。

    CPU进入停止模式时停止V18域、PLLHSIHSI14HSE振荡器的时钟。

    HDMI CEC, USART1 I2C1 即使在MCU 进入停止模式下仍有能力打开HIS振荡器 (假如HIS被选为这些外设的时钟)

    LSE振荡器已使能的情况下,HDMI CEC 和 USART1 当在系统进入停止模式下也可由LSE振荡器驱动 (假如LSE被选为这些外设时钟)。但是这些外设没有打开LSE振荡器的能力。

    CPU进入待机模式时停止V18域、PLLHSIHSI14HSE振荡器的时钟。

    当设置DBGMCU_CR寄存器中的DBG_STOP DBG_STANDBY位,那么CPU在相应的深度睡眠模式下也可以具有调试功能。

    当系统由中断(停止模式)或复位(待机模式)唤醒后,HSI振荡器被选为系统时钟(不管进入停止模式或待机模式前选用的是何种时钟)

    假如当前正在进行闪存编程,只有在闪存编程全部完成之后才会进入深度睡眠模式(深度睡眠延后)。若当前正在使用APB域,那么只有全部完成APB域的操作后才进入深度睡眠模式。

    五、STM32低功耗设置


    STM32工作模式主要有运行、睡眠、停止、待机4种模式,前面已介绍过。详细见第二节。

    供电框图

      由上图可以看到整个stm32芯片的供电图,模拟电路部分采用VDDA独立供电,各个部分可以独立被关断或开启。备份电路部分由电池供电,主要有RTC时钟及相关的备份寄存器,VDD掉电后可由电池供电,对于没有VBAT引脚的芯片,其电源直接与VDD相连。核心部分分为1.8V工作域和VDD工作域,1.8V工作域主要有内核、存储、外设部分,VDD供电域主要有I/O、待机电路(唤醒电路,独立看门狗)、电压调节器(Voltage Regulator)

    电压调节器

    器件复位后电压调节器总是打开着的,其根据应用模式有三种不同的工作模式。

    运行模式:调节器以全功耗模式为域 (内核,内存和数字外设提供1.8V电源。

    停止模式:调节器以低功耗模式为保持寄存器及SRAM数据部分域提供1.8V的电源。

    待机模式:调节器断电,除了待机电路及备份域电路外,寄存器和SRAM的内容全部丢失。

    相关寄存器介绍:

    1cortex-mo中的SCR寄存器

    SEVONPEND:

    0: 只有使能的中断或事件才能唤醒内核。

    1: 任何中断和事件都可以唤醒内核。

    SLEEPDEEP:

    0: 低功耗模式为睡眠模式。

    1: 进入低功耗时为深度睡眠模式。

    SLEEPONEXIT:

    0:  被唤醒进入线程模式后不再进入睡眠模式。

    1: 被唤醒后执行完相应的中断处理函数后进入睡眠模式。

    2,电源控制寄存器PWR_CR


    其中与低功耗有关的控制位:

    CSBF: 清除待机标志,该位始终读出为0,写1清除待机标志。

    CWUF: 清除唤醒标志,该位始终读出为0。写1清除唤醒标志。

    PDDS: 掉电深睡眠

    0: CPU进入深睡眠时进入停机模式,调压器的状态由LPDS位控制。

    1: CPU进入深睡眠时进入待机模式。

    LPDS: 深睡眠下的低功耗

    0: 在停机模式下电压调节器开启

    1: 在停机模式下电压调节器处于低功耗模式

    3,电源控制/状态寄存器(PWR_CSR)


    EWUP2/EWUP1: 使能WKUP2EWUP1引脚。

    0: WKUP1/2 引脚作为通用IO口。WKUP1引脚上的事件不能将CPU从待机模式唤醒。

    1: WKUP1/2引脚用于将CPU从待机模式唤醒,WKUP1引脚被强置为输入下拉的配置(WKUP1引脚上的上升沿将系统从待机模式唤醒)

    SBF: 待机标志

    该位由硬件设置,只能设置电源控制寄存器PWR_CRCSBF位清除。

    0:系统不在待机模式

    1:系统进入待机模式

    WUF: 唤醒标志

    由硬件设置,只能设置电源控制寄存器PWR_CRCWUF位清除。

    0: 没有唤醒事件发生

    1: WKUPRTC闹钟产生一个唤醒事件

    注意:当WKUP引脚已经是高电平时,在(通过设置EWUP)使能WKUP引脚时,会检测到一个额外唤醒的事件。 

    低功耗模式的进入与退出问题

    1、睡眠模式

    进入睡眠模式:

    STM32在运行状态时,执行WFIWFE指令可进入睡眠模式。

    条件:SLEEPDEEP=0,设为睡眠模式。此时CPU时钟被停止。

    若令被唤醒的STM32执行完中断处理任务后进入睡眠模式,则可将SLEEPONEXIT设为1.

    退出睡眠模式:

    执行WFI指令进入睡眠,可通过使能中断唤醒。执行WFE指令进入睡眠可由事件唤醒,CPU时钟打开。产生事件的两种方式:

    配置一个外部或内部EXTI线做为事件模式。

    使能外设中断但不使能NVIC中断,同时将SEVONPEND设为1,此时任何中断和事件都可以唤醒内核,此时必须清除NVIC和外设的中断标志以免唤醒后出错。

    2、停止模式

    进入停止模式:

    进入停止模式后1.8电压区域时钟被停止,PLLHSIHSE被关闭,但SRAM和寄存器正常供电。进入停止模式方法:首先确定所有中断/事件标志被清除否则不会进入停止模式,关闭ADC\DAC电源,将SLEEPDEEP设为深睡眠模式,在深睡眠后选择进入停机模式(PDDS=0),可关闭或开启电压调节器(LPDS),执行WFIWFE指令进入停机模式。

    退出停止模式:

    一个使能的外部中断或外部事件可唤醒STM32SMT32被唤醒后系统时钟被设为HSI。因此在唤醒后还需软件恢复时钟设置,并清除相关的低功耗标志。

    3、待机模式

    进入待机模式:

    进入SRAM和寄存器内容丢失,进入条件:将SLEEPDEEP设为深睡眠模式,在深睡眠后选择进入待机模式(PDDS=1),关闭电压调节器(LPDS),执行WFIWFE指令进入待机模式。

    在待机模式下,除了复位引脚(始终有效)、当配置为防侵入或校准输出时的TAMPER 引脚、使能的唤醒(WKUP)引脚外,所有的I/O口线处于高阻态。因此进入待机模式前不需要再特意配置引脚的低功耗特性。

    退出待机模式:

    IWDG复位,WKUP引脚上的上升沿或RTC 闹钟事件可唤醒STM32,当退出待机模式时除了电源控制/状态寄存器(PWR_CSR)外所有寄存器复位,整个系统被复位。

    4、低功耗模式下的RTC自动唤醒

    RTC可以在不需要依赖外部中断的情况下唤醒低功耗模式下的微控制器(自动唤醒模式)RTC提供一个可编程的时间基数,用于周期性从停止或待机模式下唤醒。

    从停止模式下唤醒,必须进行如下操作:

    配置外部中断线17为上升沿触发。

    配置RTC使其可产生RTC闹钟事件。

    从待机模式中唤醒,不必配置外部中断线17

    5、调试模式

    默认情况下,如果在进行调试微处理器时,使微处理器进入停止或待机模式,将失去调试连接。这是因为Cortex-M0的内核失去了时钟。通过设置DBGMCU_CR寄存器中的某些配置位,可以在使用低功耗模式下调试软件。

    六、低功耗模式总结

    降低STM32功耗方法主要有:

    关闭不需要的外设、降低STM32的系统频率。

    合理设置I/O降低I/O静态和动态损耗。

    进入低功耗模式。

    恢复到正常运行状态:

    睡眠模式由中断或事件唤醒,唤醒后可清除唤醒标志。

    停止模式:唤醒后需恢复时钟设置,并将改动的I/O设置恢复。

    待机模式:唤醒后系统被恢复,随后系统被复位,可清除待机标志。

     

    七、固件库使用

    主要文件:

    stm32f0xx_rcc.cstm32f0xx_gpio.cstm32f0xx_pwr.c

     

    时钟及I/O设置相关函数(部分):

    void RCC_XXXPeriphClockCmd(X,X) ; //用于使能和关闭外设时钟

    void SystemInit (void)//系统初始化设置时钟

    GPIO_Init(GPIOX, &GPIO_InitStructure);//设置相关引脚

     

    低功耗函数(部分):

     

    //唤醒引脚配置

    void PWR_WakeUpPinCmd(uint32_t PWR_WakeUpPin, FunctionalState NewState);

    ///清除寄存器状态标识

    FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);

    void PWR_ClearFlag(uint32_t PWR_FLAG);

    进入低功耗模式:

    void  PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry);

    Void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);

    void PWR_EnterSTANDBYMode(void);

     

    函数解析:

    下面是一个进入停机模式的函数,此函数功能和使用方法在注释部分已经非常明确。通过源代码可以看出SMT32在停机模式下寄存器的设置情况。调用此函数STM32可进入低功耗模式。


    void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)

    {

      uint32_t tmpreg = 0;

     

      /* Check the parameters */

      assert_param(IS_PWR_REGULATOR(PWR_Regulator));

      assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));

     

      /* Select the regulator state in STOP mode ———————————*/

      tmpreg = PWR->CR;

      /* Clear PDDS and LPDSR bits */

      tmpreg &= CR_DS_MASK;

     

      /* Set LPDSR bit according to PWR_Regulator value */

      tmpreg |= PWR_Regulator;

     

      /* Store the new value */

      PWR->CR = tmpreg;

     

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

      SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;

     

      /* Select STOP mode entry ————————————————–*/

      if(PWR_STOPEntry == PWR_STOPEntry_WFI)

      {

        /* Request Wait For Interrupt */

        __WFI();

      }

      else

      {

        /* Request Wait For Event */

        __WFE();

      }

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

      SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);  

    }

     博客地址:Beep  http://blog.csdn.net/beep_

    展开全文
  • STM32低功耗——转载

    千次阅读 2017-04-11 10:34:52
    本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。一、STM32芯片性能使用芯片型号:stm32,CORTEX -M0.封装TSSOP20.运行模式:内部时钟(HSI)...



    本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。

    一、STM32芯片性能

    使用芯片型号:stm32,CORTEX -M0.封装TSSOP20.

    运行模式:内部时钟(HSI),系统时钟频率采用48MHZ

    工作电压:3.3V

    芯片具体参数如下:


    二、芯片功耗

    功耗:


    芯片工作模式:

    工作模式:外设正常运行,内核CPU及SRAM供电,未使用外设的时钟默认关闭。

    睡眠模式只有CPU停止工作,各个外设正常工作,依靠任何中断/事件唤醒。

    停机模式1.8V供电区域时钟被停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测器也可进入低功耗模式,但SRAM和寄存器不断电,此时只能依靠外部中断(EXTI)RTC时钟才能唤醒。

    待机模式:1.8V供电区域被时钟停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测器也可进入低功耗模式,SRAM和不属于待机电路的寄存器也被断电关闭,此时即使是外部中断(EXTI)也不能将其唤醒,只能通过复位(外部复位,看门狗复位)、唤醒引脚、RTC时钟来唤醒。

    注意:无论是在停止模式 还是待机模式下,RTCIWDG及其时钟源不会被关闭。

    各个模式功耗:

    功耗计算方式:功耗=工作电压*工作电流。




    I/O模块损耗:

    静态损耗:

    内部上下拉电阻损耗:这部分损耗主要取决于内部电阻的大小,一般为了降低内部电阻损耗常常需要降低电阻两端电压,若引脚为低电压则采用下拉电阻,若引脚为高电压则采用上拉电阻。

    I/O额外损耗:当引脚设为输入I/O时,用来区分电压高低的斯密特触发器电路会产生一部分消耗,为此可将引脚设为模拟输入模式。

    动态损耗:对于悬浮的引脚,由于其电压不稳定会产生外部电磁干扰和损耗,因此必须把悬浮引脚设为模拟模式或输出模式,引脚电压的切换会对外部和内部电容负载产生动态损耗,其损耗与电压切换频率和负载电容有关。具体损耗值如下:


    三、CORTEX-M0低功耗功能、指令、相关寄存器

    CORREX内核支持低功耗模式有2种:

    睡眠模式CPU时钟停止,对应stm32睡眠模式

    深度睡眠模式:系统时钟停止,PLL,FLASH 关闭,对应stm32停机模式。

    进入睡眠模式:

    CPU处理完中断后软件必须能使其进入睡眠模式,当CPU执行WFI指令,其将会立即进入睡眠模式,当异常产生或中断被挂起时,其立即被唤醒。

    CPU执行WFE指令时,它首先会检查对应的事件标志位,当事件标志寄存器为0时进入睡眠模式,否则将寄存器事件标志清0并继续执行程序。事件标志可由外部事件标志或SEV指令产生。

    返回方式:通过设置内核SCB寄存器的Sleep-on-exit位,可以选择系统被唤醒执行完中断服务程序后进入主线程模式后是否立即进入睡眠模式。

    从睡眠中唤醒:

    WFI唤醒或sleep-on-exit

    一般来说,使能的异常可以唤醒内核。对于一些系统,在唤醒后执行中断处理程序前需要先执行重新恢复的任务,则首先需要屏蔽所有中断(PRIMASK=1),中断发生后内核被唤醒但不执行中断处理,待执行完恢复任务后再将PRIMASK设为0,此后执行中断处理任务。

    WFE唤醒:

    使能异常可以唤醒内核。外部事件或SEV指令发送的事件也可唤醒内核。

    注意:当SCRSEVONPEND设置为1时,任何使能/非使能中断或事件都可唤醒内核。

    中断唤醒控制器(WIC):

    WIC只有在SCR寄存器DEEPSLEEP位设为1时才能使能,WIC不可编程也没有相关的控制寄存器,它仅与硬件信号有关,当进入深睡眠时内核大部分模块被关闭,系统计数器也被关闭,因此当内核被唤醒时需要较多的时间恢复到睡眠前的状态并处理中断。

    外部事件输入:可在WFE模式下唤醒内核。

    相关指令:

    WFE  等待事件,若无事件则睡眠,中断、事件唤醒

    WFI   等待中断,立即进入睡眠,中断唤醒

    SEV  软件发送一个事件,在核系统中可唤醒另一个内核。

    微控制器软件接口标准

    由指令对应的C语言接口:

    //core_cmInstr.h

    void __WFE(void) // Wait for Event

    void __WFI(void) // Wait for Interrupt

    void __SEV(void) // Send Event

    相关寄存器:

    SCR寄存器:


    SEVONPEND:

    0: 只有使能的中断或事件才能唤醒内核。

    1: 任何中断和事件都可以唤醒内核。

    SLEEPDEEP:

    0: 低功耗模式为睡眠模式。

    1: 进入低功耗时为深度睡眠模式。

    SLEEPONEXIT:

    0:  被唤醒进入线程模式后不再进入睡眠模式。

    1: 被唤醒后执行完相应的中断处理函数后进入睡眠模式。

    四、STM32时钟管理

    运行模式下可通过关闭和降低相关外设的时钟频率来减少功耗。

    APB 外设时钟和DMA时钟可用软件禁止。

    睡眠模式停止CPU时钟。在CPU睡眠中存储器接口时钟(FlashRAM接口)可被停止。当连接到APB所有外设的时钟禁止后,当进入睡眠期间AHB APB桥时钟由CPU的硬件关闭。

    CPU进入停止模式时停止V18域、PLLHSIHSI14HSE振荡器的时钟。

    HDMI CEC, USART1 I2C1 即使在MCU 进入停止模式下仍有能力打开HIS振荡器 (假如HIS被选为这些外设的时钟)

    LSE振荡器已使能的情况下,HDMI CEC 和 USART1 当在系统进入停止模式下也可由LSE振荡器驱动 (假如LSE被选为这些外设时钟)。但是这些外设没有打开LSE振荡器的能力。

    CPU进入待机模式时停止V18域、PLLHSIHSI14HSE振荡器的时钟。

    当设置DBGMCU_CR寄存器中的DBG_STOP DBG_STANDBY位,那么CPU在相应的深度睡眠模式下也可以具有调试功能。

    当系统由中断(停止模式)或复位(待机模式)唤醒后,HSI振荡器被选为系统时钟(不管进入停止模式或待机模式前选用的是何种时钟)

    假如当前正在进行闪存编程,只有在闪存编程全部完成之后才会进入深度睡眠模式(深度睡眠延后)。若当前正在使用APB域,那么只有全部完成APB域的操作后才进入深度睡眠模式。

    五、STM32低功耗设置


    STM32工作模式主要有运行、睡眠、停止、待机4种模式,前面已介绍过。详细见第二节。

    供电框图

      由上图可以看到整个stm32芯片的供电图,模拟电路部分采用VDDA独立供电,各个部分可以独立被关断或开启。备份电路部分由电池供电,主要有RTC时钟及相关的备份寄存器,VDD掉电后可由电池供电,对于没有VBAT引脚的芯片,其电源直接与VDD相连。核心部分分为1.8V工作域和VDD工作域,1.8V工作域主要有内核、存储、外设部分,VDD供电域主要有I/O、待机电路(唤醒电路,独立看门狗)、电压调节器(Voltage Regulator)

    电压调节器

    器件复位后电压调节器总是打开着的,其根据应用模式有三种不同的工作模式。

    运行模式:调节器以全功耗模式为域 (内核,内存和数字外设提供1.8V电源。

    停止模式:调节器以低功耗模式为保持寄存器及SRAM数据部分域提供1.8V的电源。

    待机模式:调节器断电,除了待机电路及备份域电路外,寄存器和SRAM的内容全部丢失。

    相关寄存器介绍:

    1cortex-mo中的SCR寄存器

    SEVONPEND:

    0: 只有使能的中断或事件才能唤醒内核。

    1: 任何中断和事件都可以唤醒内核。

    SLEEPDEEP:

    0: 低功耗模式为睡眠模式。

    1: 进入低功耗时为深度睡眠模式。

    SLEEPONEXIT:

    0:  被唤醒进入线程模式后不再进入睡眠模式。

    1: 被唤醒后执行完相应的中断处理函数后进入睡眠模式。

    2,电源控制寄存器PWR_CR


    其中与低功耗有关的控制位:

    CSBF: 清除待机标志,该位始终读出为0,写1清除待机标志。

    CWUF: 清除唤醒标志,该位始终读出为0。写1清除唤醒标志。

    PDDS: 掉电深睡眠

    0: CPU进入深睡眠时进入停机模式,调压器的状态由LPDS位控制。

    1: CPU进入深睡眠时进入待机模式。

    LPDS: 深睡眠下的低功耗

    0: 在停机模式下电压调节器开启

    1: 在停机模式下电压调节器处于低功耗模式

    3,电源控制/状态寄存器(PWR_CSR)


    EWUP2/EWUP1: 使能WKUP2EWUP1引脚。

    0: WKUP1/2 引脚作为通用IO口。WKUP1引脚上的事件不能将CPU从待机模式唤醒。

    1: WKUP1/2引脚用于将CPU从待机模式唤醒,WKUP1引脚被强置为输入下拉的配置(WKUP1引脚上的上升沿将系统从待机模式唤醒)

    SBF: 待机标志

    该位由硬件设置,只能设置电源控制寄存器PWR_CRCSBF位清除。

    0:系统不在待机模式

    1:系统进入待机模式

    WUF: 唤醒标志

    由硬件设置,只能设置电源控制寄存器PWR_CRCWUF位清除。

    0: 没有唤醒事件发生

    1: WKUPRTC闹钟产生一个唤醒事件

    注意:当WKUP引脚已经是高电平时,在(通过设置EWUP)使能WKUP引脚时,会检测到一个额外唤醒的事件。 

    低功耗模式的进入与退出问题

    1、睡眠模式

    进入睡眠模式:

    STM32在运行状态时,执行WFIWFE指令可进入睡眠模式。

    条件:SLEEPDEEP=0,设为睡眠模式。此时CPU时钟被停止。

    若令被唤醒的STM32执行完中断处理任务后进入睡眠模式,则可将SLEEPONEXIT设为1.

    退出睡眠模式:

    执行WFI指令进入睡眠,可通过使能中断唤醒。执行WFE指令进入睡眠可由事件唤醒,CPU时钟打开。产生事件的两种方式:

    配置一个外部或内部EXTI线做为事件模式。

    使能外设中断但不使能NVIC中断,同时将SEVONPEND设为1,此时任何中断和事件都可以唤醒内核,此时必须清除NVIC和外设的中断标志以免唤醒后出错。

    2、停止模式

    进入停止模式:

    进入停止模式后1.8电压区域时钟被停止,PLLHSIHSE被关闭,但SRAM和寄存器正常供电。进入停止模式方法:首先确定所有中断/事件标志被清除否则不会进入停止模式,关闭ADC\DAC电源,将SLEEPDEEP设为深睡眠模式,在深睡眠后选择进入停机模式(PDDS=0),可关闭或开启电压调节器(LPDS),执行WFIWFE指令进入停机模式。

    退出停止模式:

    一个使能的外部中断或外部事件可唤醒STM32SMT32被唤醒后系统时钟被设为HSI。因此在唤醒后还需软件恢复时钟设置,并清除相关的低功耗标志。

    3、待机模式

    进入待机模式:

    进入SRAM和寄存器内容丢失,进入条件:将SLEEPDEEP设为深睡眠模式,在深睡眠后选择进入待机模式(PDDS=1),关闭电压调节器(LPDS),执行WFIWFE指令进入待机模式。

    在待机模式下,除了复位引脚(始终有效)、当配置为防侵入或校准输出时的TAMPER 引脚、使能的唤醒(WKUP)引脚外,所有的I/O口线处于高阻态。因此进入待机模式前不需要再特意配置引脚的低功耗特性。

    退出待机模式:

    IWDG复位,WKUP引脚上的上升沿或RTC 闹钟事件可唤醒STM32,当退出待机模式时除了电源控制/状态寄存器(PWR_CSR)外所有寄存器复位,整个系统被复位。

    4、低功耗模式下的RTC自动唤醒

    RTC可以在不需要依赖外部中断的情况下唤醒低功耗模式下的微控制器(自动唤醒模式)RTC提供一个可编程的时间基数,用于周期性从停止或待机模式下唤醒。

    从停止模式下唤醒,必须进行如下操作:

    配置外部中断线17为上升沿触发。

    配置RTC使其可产生RTC闹钟事件。

    从待机模式中唤醒,不必配置外部中断线17

    5、调试模式

    默认情况下,如果在进行调试微处理器时,使微处理器进入停止或待机模式,将失去调试连接。这是因为Cortex-M0的内核失去了时钟。通过设置DBGMCU_CR寄存器中的某些配置位,可以在使用低功耗模式下调试软件。

    六、低功耗模式总结

    降低STM32功耗方法主要有:

    关闭不需要的外设、降低STM32的系统频率。

    合理设置I/O降低I/O静态和动态损耗。

    进入低功耗模式。

    恢复到正常运行状态:

    睡眠模式由中断或事件唤醒,唤醒后可清除唤醒标志。

    停止模式:唤醒后需恢复时钟设置,并将改动的I/O设置恢复。

    待机模式:唤醒后系统被恢复,随后系统被复位,可清除待机标志。

     

    七、固件库使用

    主要文件:

    stm32f0xx_rcc.cstm32f0xx_gpio.cstm32f0xx_pwr.c

     

    时钟及I/O设置相关函数(部分):

    void RCC_XXXPeriphClockCmd(X,X) ; //用于使能和关闭外设时钟

    void SystemInit (void)//系统初始化设置时钟

    GPIO_Init(GPIOX, &GPIO_InitStructure);//设置相关引脚

     

    低功耗函数(部分):

     

    //唤醒引脚配置

    void PWR_WakeUpPinCmd(uint32_t PWR_WakeUpPin, FunctionalState NewState);

    ///清除寄存器状态标识

    FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);

    void PWR_ClearFlag(uint32_t PWR_FLAG);

    进入低功耗模式:

    void  PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry);

    Void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);

    void PWR_EnterSTANDBYMode(void);

     

    函数解析:

    下面是一个进入停机模式的函数,此函数功能和使用方法在注释部分已经非常明确。通过源代码可以看出SMT32在停机模式下寄存器的设置情况。调用此函数STM32可进入低功耗模式。


    void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)

    {

      uint32_t tmpreg = 0;

     

      /* Check the parameters */

      assert_param(IS_PWR_REGULATOR(PWR_Regulator));

      assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));

     

      /* Select the regulator state in STOP mode ———————————*/

      tmpreg = PWR->CR;

      /* Clear PDDS and LPDSR bits */

      tmpreg &= CR_DS_MASK;

     

      /* Set LPDSR bit according to PWR_Regulator value */

      tmpreg |= PWR_Regulator;

     

      /* Store the new value */

      PWR->CR = tmpreg;

     

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

      SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;

     

      /* Select STOP mode entry ————————————————–*/

      if(PWR_STOPEntry == PWR_STOPEntry_WFI)

      {

        /* Request Wait For Interrupt */

        __WFI();

      }

      else

      {

        /* Request Wait For Event */

        __WFE();

      }

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

      SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);  

    }

     博客地址:Beep  http://blog.csdn.net/beep_

    document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000) var fromjs = ("#fromjs");
        if (fromjs.length > 0) {
    ("#fromjs .markdown_views pre").addClass("prettyprint"); prettyPrint(); ('pre.prettyprint code').each(function () {
                    var lines =
    (this).text().split('\n').length; var numbering=('
    • ').addClass('pre-numbering').hide();
    (this).addClass(hasnumbering).parent().append(numbering); for (i = 1; i
    展开全文
  • stm32低功耗模式

    2019-12-30 14:19:11
    stm32低功耗模式 stm32f103系列有3种低功耗模式: 睡眠模式 停止模式 待机模式 从上往下功耗越低。 1. 睡眠模式 在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM3核心的外设全都还照常运行。...
  • 测试完基于STM32的CC1101通信,后期需要低功耗配置。...1.stm32低功耗(1)进入stop模式由于项目需要在睡眠时也保留RAM的数据,顾考虑采用stop模式以减少STM32的功耗,进入stop的方法很简单,直接调用库函数中的 PW...
  • 基于stm32低功耗的待机模式程序,为野火的原版程序,适用于野火指南者(MINI开发板),我在这个程序里面加了一些注释,更加详细的程序分析请参考我相关的博客
  • STM32低功耗模式解读

    万次阅读 2015-08-25 12:26:23
    本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。 一、STM32芯片性能 使用芯片型号:stm32f030f4,CORTEX -M0.封装TSSOP20. 运行模式:内部...
  • STM32低功耗学习

    2020-09-05 22:15:16
    一、STM32低功耗模式 ①运行模式,特点是不省电(while(1)) ②睡眠模式,特点是内核休眠(关闭内核时钟) ③停止模式,特点是内核外设休眠 ④待机模式,特点是停止供电。 1、STM32睡眠模式详解 进入方式:**内核...
  • STM32低功耗时引脚配置

    千次阅读 2019-03-15 22:20:49
    置顶/星标公众号,不错过每一条消息! 今天回答一位读者问的关于STM32低功耗问题。1写在前面有低功耗产品设计经验的朋友都应该知道,一个产品的功耗不光是硬件功耗的事...
  • 挑战STM32低功耗设计 基于神舟3号开发板。。
  • STM32 低功耗 stop模式

    千次阅读 2016-06-16 10:58:55
    STM32 低功耗 stop模式
  • STM32单片机,低功耗芯片型号、外设、功耗、功能、使用场景、价格介绍
  • stm32低功耗实验之待机模式 https://blog.csdn.net/qq_27312943/article/details/52554155 一 待机模式简介 在stm32的低功耗模式中,待机模式可以实现系统的最低功耗,在这种模式下,只需要2uA左右的电流。 ...
  • 1. STM32低功耗模式概述 2. 寄存器和库函数配置 3. HAL库配置PVD实例 1. STM32低功耗模式概述 系统或电源复位后,微控制器处于运行状态,HCLK位CPU提供时钟,内核执行代码。当CPU不需要继续运行时,乐意利用多种低...
  • STM32低功耗实验总结

    千次阅读 2017-09-24 21:36:53
    1、 首先回答一个问题,STM32能不能做低功耗?...2、 STM32低功耗有哪些需要注意的地方?  一开始我测试到STM32为16uA的时候,还是非常高兴的,以为真的可以做为我的应用,我的应用是让MCU定时醒来干活,干一
  • STOP模式: STM32低功耗运行模式之一,该模式下CPU会停止工作,但RAM中的数据仍然保留。待中断或事件触发后程序可以继续运行。 note:1、STOP模式退出后,系统时钟会自动配置为MSI或HSI,需要手动重新配置时钟,...
  • STM32低功耗模式实践

    千次阅读 2016-01-28 09:28:31
    STM32低功耗模式实践 STM32一共有三种低功耗模式,睡眠模式、停止模式以及待机模式。 其中,睡眠模式时内核停止运行,但外设仍在工作,所有外设的时钟不会被关闭。 停止模式,除了Cortex-M3内核停止外,所有外设...
  • STM32低功耗模式笔记

    千次阅读 2018-11-25 23:27:41
    STM32低功耗模式   一、低功耗注意事项: 1、所有IO管脚,如果高阻状态端口是高电平,就设成上拉输入;如果高阻状态是低电平,设成下拉输入;如果高阻是中间状态,设成模拟输入。这个很多人都提到过,必须的。...
  • stm32的超低功耗mcu的datasheet 根据文档资料所说低功耗可以媲美msp430
  • STM32低功耗模式–停止模式 STM32F10xx低功耗模式 睡眠模式:Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行 停止模式:所有的时钟都已停止 待机模式:1.8V电源关闭 ...
  • STM32低功耗模式下GPIO如何配置最节能,这里总结了一下四点,亲测有效(基于STM32L011芯片 LL库),可降低几百微安。 1、将未使用的GPIO 配置为模拟输入模式 GPIO始终有一个输入通道,可以是数字或模拟通道,如果...
  • 网上相关STM32低功耗的资料我都看了一下,有的对,有对可能不适用于我这种情况,有的没把细节说清楚。现在总结一下,帮助遇到同样难题的朋友少走弯路。我们公司的板子主要由STM32L151 + NB模块5311 + I2C外插式...
  • STM32RET6编写的一个低功耗烟雾传感器程序,实测可以使用,具体性能可以再优化,代码后期继续上传。
  • STM32低功耗--停止模式

    2020-12-16 17:17:25
    STM32F10x低功耗模式有三种:睡眠模式、停止模式、待机模式。一般我们做开发大多都是选择停机模式,因为停机模式功耗较低。而且任一中断或事件都能唤醒。
  • STM32低功耗模式有3种:睡眠模式(CM3内核停止,外设仍然运行);停止模式(所有时钟都停止);待机模式(1.8V内核电源关闭); 在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需要2uA左右的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,137
精华内容 854
关键字:

stm32低功耗