stm32低功耗模式

相对于MSP430的低功耗,可能stm32F10XXX的低功耗模式可能捉襟见肘,但是要考虑到stm32的主频还是高于MSP430很多的,所以我们应该理性的去看待问题。

stm32F10XXX有几种模式:

1.run mode:程序一直运行

2.sleepmode:通过WFI或者WFE指令进入,CPU的时钟停止,其他运行。通过一些中断或者是事件唤醒

3.stop mode:所有的时钟都会停止。

4.standby mode:1.8V的域掉电。

                                                                               SLEEP MODE

1.进入sleepmode:

WFI:Wait For Interrupt:任意中断都可唤醒,但是中断配置时要注册到NVIC中

WFE:Wait for Event:任意事件可唤醒,其中唤醒可以分为两种,1.普通事件,例如闹钟事件,步骤是使能闹钟事件,然后cotex-M3 系统控制寄存器中SEVONPEND使能,当唤醒的时候要清对应的外设中断挂起位和NVIC对应的中断的IRQ通道挂起位。2。外部中断线上的事件:什么也不需要做。

注意:sleep模式唤醒是没有延时的。

经验:之前在ucos系统的项目中,由于ucos的节拍是由systick中断来产生的,所以几乎对于配置为sleep模式下系统是不会睡下去的,因为systick会唤醒sleep模式。

sleep模式对功耗的影响并不是很大,所以一般还是选择其他两种模式,如果非要进入这种模式的话有几方面可以注意的:

1:系统配置时,首先关闭所有外设的时钟,然后再开对应的自己板级开发对应的时钟,关闭所有时钟:

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL, DISABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, DISABLE);
2:设置全部GPIO口的状态为输入模式:

 GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable GPIOD and GPIOE clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB 
                         | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD 
                         | RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO, ENABLE);
  
  
  /* Disable the Serial Wire Jtag Debug Port SWJ-DP */
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); 
  
    /* PA  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
      /* PB  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
      /* PC  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
        /* PD  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
3:降低主频:具体的代码可以到ST官方固件库3.5中自带的RCC文件夹下寻找如何配置主频,当然配置这些频率的话要考虑到板级所使用的外设,比如USB等就需要特殊的频率。


                                                                                                            STOP MODE                                                                                                  

1.进入stop模式,外设的时钟关闭,电压调节器可以配置为低功耗的模式,具体的控制位在PWR_CR的LPDS位,SRAM和寄存器中的只保留,这就意味着在唤醒之后系统可以接着之前的状态运行。注意在进入stop模式之前还要检查ADC和DAC的ADC_CR2和DAC_CR的ENx位,并关闭,否则ADC和DAC仍然会有电能的消耗。

2如何进入stop的模式:调用stm32f10x_pwr.c中的PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)函数,第一个参数是调整是否将电压调节器设置为低功耗模式,第二个参数是使用WFI还是使用WFE进入stop模式。特别注意有时并不能保证进入stop模式,还要清EXTI的pending位,使用函数EXTI_ClearITPendingBit()和RTC Alarm flag,使用函数RTC_ClearFlag(uint16_t RTC_FLAG)。
3.唤醒:WFI:外部中断线使能,但是中断必须配置NVIC。WFE:外部中断线上的事件。启动后stm32默认采用HSI的时钟(有延迟),且假如电压调节器配置为低功耗的模式下会有一定的延迟。
                                                                                                           STANDBY模式
1.进入standbymode:standbymode是最低功耗的模式,除了backup domin 和自身的电路之外的所有都会关闭或者是丢失。
2.如何进入standbymode:调用stm32f10x_pwr.c中的PWR_EnterSTANDBYMode().
3.如何唤醒:wakeup引脚上升沿(假如配置的话),RTC alrm,IWDG,RESET ,唤醒之后,延时包括电压调节器的启动和重新复位的延时。而重启的状态几乎类似于掉电重启,仍采样boot的引脚,PWR_CSR寄存器的SBF标志可以是否是在standby模式。


















你可能感兴趣的:(stm32)