STM8L051低功耗模式测试文档

 STM8L051的五种低功耗模式wait low power run modelow power wait modeAtive-Halt modeHalt mode

  1. WAIT  mode

  在等待模式,CPU的时钟是停止的,被选择的外设继续运行。WAIT mode 分为两种方式:WFEWFIWFE是等待事件发生,才从等待模式中唤醒。WFI是等待中断发生,才从等待模式中唤醒。

  1. low power run mode

  在低功耗运行模式下,CPU和被选择的外设在工作,程序执行在LSI或者LSE下,从RAM中执行程序,FlashEEPROM都要停止运行。电压被配置成Ultra Low Power模式。进入此模式可以通过软件配置,退出此模式可以软件配置或者是复位。

  1. low power wait mode

   这种模式进入是在low power run mode下,执行wfe。在此模式下CPU时钟会被停止,其他的外设运行情况和low power run mode类似。在此模式下可以被内部或外部事件、中断和复位唤醒。当被事件唤醒后,系统恢复到low power run mode

  1. Active-Halt mode

   在此模式下,除了RTC外,CPU和其他外设的时钟被停止。系统唤醒是通过RTC中断、外部中断或是复位。

  1. Halt mode

   在此模式下,CPU和外设的时钟都被停止。系统唤醒是通过外部中断或复位。关闭内部的参考电压可以进一步降低功耗。通过配置ULP位和FWU位,也可以6us的快速唤醒,不用等待内部的参考电压启动。

 

一、各个低功耗模式的代码实现

 1、  WAIT  mode

   等待模式分为两种:WFIWFE

  1.1 WFI mode

     当执行“wfi”语句时,系统就进入WFI模式,当中断发生时,CPU被从WFI模式唤醒,执行中断服务程序和继续向下执行程序。

通过置位CFG_GCRAL位,使主程序服务完中断服务程序后,重新返回到WFI 模式。

程序如下:

void Mcuwfi()

{

   PWR_UltraLowPowerCmd(ENABLE);  //开启电源的低功耗模式

   CLK_HSEConfig(CLK_HSE_OFF);    //关闭HSE时钟   (16MHz

   

  #ifdef USE_LSE

    CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSE);

    CLK_SYSCLKSourceSwitchCmd(ENABLE);

    while (((CLK->SWCR)& 0x01)==0x01);

    CLK_HSICmd(DISABLE);

  #else

    CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);

    CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI);

    CLK_SYSCLKSourceSwitchCmd(ENABLE);             

    while (((CLK->SWCR)& 0x01)==0x01);

    CLK_HSICmd(DISABLE);

  #endif                     //切换时钟到LSI38KHz

   

   wfi();                    //进入WFI模式

   #ifdef Only_Interrupt       //设置CFG_GCRAL位,服务完中断后回到WFI模式

   CFG->GCR =CFG_GCR_AL;

   #endif

}

 

  1.2  WFE

  当执行“wfe”语句时,系统就进入WFE模式。

 WFE有两种唤醒模式,一种是:中断唤醒,一种是:事件唤醒。

当中断唤醒时,当执行到wfe时,进入wfe模式休眠。系统执行步骤如下:进入WFE模式 ---> 有中断产生 --->系统唤醒 --->执行中断服务程序  --->继续休眠 。

当事件唤醒时,当执行到wfe时,进入wfe模式休眠。系统执行步骤如下:进入WFE模式 ---> 有中断产生 --->系统唤醒 --->执行中断服务程序  --->继续往下执行 。

 

  1. low power run mode

这种模式程序在RAM中执行,EEPROMFLASH是在IDDQ(低功耗模式),时钟切换到低速时钟。

进入此模式的步骤如下:

  1. 进入RAM
  2. 切换系统时钟到LSELSI
  3. 关闭高速时钟、外设和ADC
  4. 屏蔽中断
  5. 通过设置FLASH_CR1EEPM位来关闭FLASHEEPROM
  6. 等待FLASHEEPROM关闭
  7. 通过设置CLK_REGCSRREGOFF位进入校准低功耗模式

退出low power run mode的步骤如下:

  1. 通过重置CLK_REGCSRREGOFF位进入主校准模式,延时等待主校准稳定。
  2. 通过设置FLASH_CR1EEPM位来打开FLASHEEPROM,延时等待FLASHEEPROM打开。
  3. 屏蔽所有中断。

程序如下:

void LPR_init(void)

{

/*Switch the clock to LSE and disable HSI*/

  CLK_HSEConfig(CLK_HSE_OFF);

  #ifdef USE_LSE

    CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSE);

    CLK_SYSCLKSourceSwitchCmd(ENABLE);

    while (((CLK->SWCR)& 0x01)==0x01);

    CLK_HSICmd(DISABLE);

  #else

    CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);

    CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI);

    CLK_SYSCLKSourceSwitchCmd(ENABLE);

    while (((CLK->SWCR)& 0x01)==0x01);

    CLK_HSICmd(DISABLE);

  #endif

//PWR_UltraLowPowerCmd(ENABLE); 

/*Configure event for WAKEUP and FUNCTION, disable the interrupts*/

  CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1); //切换系统时钟                                                                                            //  LSI

  

  sim();                                                     //屏蔽中断

  LPR_Ram(); // Call in RAM                                //程序在RAM里执行

 

  //if(lowpowerwait_flag==1)

// {

//   lowpowerwait_flag=0;

 //Switch on the regulator

  // CLK->REGCSR = 0xb9;

  // while(((CLK->REGCSR)&0x1) != 0x1);

   /*Switch the clock to HSI*/

    CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);

    CLK_HSICmd(ENABLE);

    while (((CLK->ICKCR)& 0x02)!=0x02);

  

    CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);

    CLK_SYSCLKSourceSwitchCmd(ENABLE);

    while (((CLK->SWCR)& 0x01)==0x01);

    sim();                                   //退出Low power run mode

 

 //}

}

 

 

  1. Low power wait mode

 进入Low power wait mode模式是在MCU进入Low power run mode后执行wfe指令。从Low power wait mode模式退出只能通过外部中断。退出Low power wait mode模式后,CPU会返回到Low power run mode

 

 

 

 __ramfunc voidLPR_Ram(void)

//voidLPR_Ram(void)

#endif

  uint8_t i = 0;

/* To reduce consumption to minimal 

  Swith off the Flash */

  FLASH->CR1 = 0x08;

  while(((CLK->REGCSR)&0x80)==0x80);

/* Swith off the Regulator*/

  CLK->REGCSR = 0x02;

  while(((CLK->REGCSR)&0x01)==0x01);

  

  if(lowpowerwait_flag==0)

       while(1);

  Else                   //在此处进入Low power wait mode,进入WFE的配置。

  {

    

   /* Set trigger on GPIOB pin3*/ 

     WFE->CR2 = 0x01; 

  

/*Wait for end of counter */

    wfe();

    EXTI->SR1 |= 0x10;

    EXTI->SR2 |= 0x01;

    WFE->CR2 = 0x00;   //退出Low power wait mode,进入Low power run mode  

  }

}

 

  1. Active-Halt mode

  在Active-Halt模式下,主时钟和CPU,以及大部分的外设都停止了,只剩下LSELSI为一部分的外设提供时钟,能在Active-Halt模式运行的外设包括:SWIMbeeperIWDGRTCLCD。进入Active-Halt模式,是通过halt语句。退出是通过外部中断、RTC和复位。

参看代码如下:

void McuActive_Halt()

{

  //Halt_Init();

  PWR_UltraLowPowerCmd(ENABLE);   

  RTC_Config(10000);                       //初始化RTC

/*  

  #ifdef USE_LSE

    CLK_LSEConfig(CLK_LSE_OFF);

    while ((CLK->ECKCR & 0x04) != 0x00);

  #else

    CLK_LSICmd(DISABLE);

    while ((CLK->ICKCR & 0x04) != 0x00);

  #endif*/

      sim();

      halt();                          //进入Active-Halt模式

}

 

  1. Halt mode

   在Halt mode下,系统时钟停止,CPU和所有的外设停止。进入Halt mode,是执行halt语句。退出此模式,是通过外部中断和复位。Halt modeActive-Halt mode的区别是:Active-Halt mode下的一些外设还在工作。

 

参考代码如下:

void McuHalt()

{

     Halt_Init();    //关闭外设

      sim();      //屏蔽中断

      halt();      //进入Halt模式

}

猜你喜欢

转载自blog.csdn.net/zhanghui1456/article/details/50086185