STM8L051低功耗模式测试文档

2023-11-01 20浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

STM8L051的五种低功耗模式wait ,low power run mode,low power wait mode,Ative-Halt mode,Halt mode。

WAIT mode

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

low power run mode

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

low power wait mode

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

Active-Halt mode

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

Halt mode

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

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

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

}


百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台