STM8L051低功耗模式測試文件
一、各個低功耗模式的程式碼實現
1、 WAIT mode
等待模式分為兩種:WFI和WFE。
1.1 WFI mode
當執行“wfi”語句時,系統就進入WFI模式,當中斷髮生時,CPU被從WFI模式喚醒,執行中斷服務程式和繼續向下執行程式。
通過置位CFG_GCR的AL位,使主程式服務完中斷服務程式後,重新返回到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 //切換時鐘到LSI(38KHz)
wfi(); //進入WFI模式
#ifdef Only_Interrupt //設定CFG_GCR的AL位,服務完中斷後回到WFI模式
CFG->GCR =CFG_GCR_AL;
#endif
}
1.2 WFE
當執行“wfe”語句時,系統就進入WFE模式。
WFE有兩種喚醒模式,一種是:中斷喚醒,一種是:事件喚醒。
當中斷喚醒時,當執行到wfe時,進入wfe模式休眠。系統執行步驟如下:進入WFE模式 ---> 有中斷產生 --->系統喚醒 --->執行中斷服務程式 --->繼續休眠 。
當事件喚醒時,當執行到wfe時,進入wfe模式休眠。系統執行步驟如下:進入WFE模式 ---> 有中斷產生 --->系統喚醒 --->執行中斷服務程式 --->繼續往下執行 。
- low power run mode
這種模式程式在RAM中執行,EEPROM和FLASH是在IDDQ(低功耗模式),時鐘切換到低速時鐘。
進入此模式的步驟如下:
- 進入RAM
- 切換系統時鐘到LSE或LSI
- 關閉高速時鐘、外設和ADC
- 遮蔽中斷
- 通過設定FLASH_CR1的EEPM位來關閉FLASH和EEPROM
- 等待FLASH和EEPROM關閉
- 通過設定CLK_REGCSR的REGOFF位進入校準低功耗模式
退出low power run mode的步驟如下:
- 通過重置CLK_REGCSR的REGOFF位進入主校準模式,延時等待主校準穩定。
- 通過設定FLASH_CR1的EEPM位來開啟FLASH和EEPROM,延時等待FLASH和EEPROM開啟。
- 遮蔽所有中斷。
程式如下:
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
//}
}
- 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
}
}
- Active-Halt mode
在Active-Halt模式下,主時鐘和CPU,以及大部分的外設都停止了,只剩下LSE或LSI為一部分的外設提供時鐘,能在Active-Halt模式執行的外設包括:SWIM、beeper、IWDG、RTC和LCD。進入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模式
}
- Halt mode
在Halt mode下,系統時鐘停止,CPU和所有的外設停止。進入Halt mode,是執行halt語句。退出此模式,是通過外部中斷和復位。Halt mode和Active-Halt mode的區別是:Active-Halt mode下的一些外設還在工作。
參考程式碼如下:
void McuHalt()
{
Halt_Init(); //關閉外設
sim();//遮蔽中斷
halt(); //進入Halt模式
}