1. 程式人生 > >STM8L051低功耗模式測試文件

STM8L051低功耗模式測試文件

一、各個低功耗模式的程式碼實現

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模式

}