STM8L051低功耗模式测试文档

2019-11-14来源: 51hei关键字:STM8L051  低功耗模式  测试文档

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


}


关键字:STM8L051  低功耗模式  测试文档 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479982.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm8l 低功耗 halt_active模式
下一篇:halt低功耗模式

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm8l051 halt之后外部中断唤醒问题
最近用到stm8l051 halt,在halt之后开启了外部中断,有时灵,有时不灵,设置下降沿触发,但是按键(低有效)放开了才会从HALT退出,最后发现在进去外部中断的时候一直在外部中断里面不退出。在外部中断程序里面把端口的外部中断和端口使能的外部中断功能关闭,问题解决,可以在下降沿从halt退出。1、开启halt,其他代码省略,只贴halt部分:    /* 禁止TIM3 */    TIM3->SR1 = (uint8_t)(~(uint8_t)TIM3_IT_Update);    CLK_PeripheralClockConfig
发表于 2019-12-05
STM8L052低功耗模式
Stm8L系列单片机的低功耗有五种模式:§ wait模式§ Lowpower run模式§ Lowpower wait模式§ Active-haltwith full RTC模式§ Halt模式最低功耗的就是就是halt模式。这里也主要总结一下如何进入halt模式,进入以后可以通过什么方式唤醒,以及有很多客户会关心的如何自动唤醒。Halt模式进入很简单,执行一条halt指令,调用库函数也就是halt()就行了。但是进入前要注意把所有的中断挂起标志给清除掉。要是不清零又恰巧有中断标志的时候进入该模式也会被立马唤醒。进入这种模式,所有的外设全都关闭了,所有时钟关闭。这时候它自己是醒不过来的,只能靠掐人中(给个外部中断)或者重新复活
发表于 2019-12-05
STM8L读写EEPROM(24LC64)
使用24LC64(24XX64)是低功耗应用的EEPROM,存储容量 8K byte(64K bit),IIC 最大时钟频率400 KHz(24FC64达到1MHz),低功耗CMOS技术:工作电流 1 mA(典型)、 待机电流 1 μ A(典型),32字节的页写缓冲器,超过100万擦/写周期,数据保存>200年。24C02只有8字节的页写缓冲器,操作的地址只有8位,而24LC64操作的地址包含高8位和低8位。两者的数据手册去区别如下:1、AT24C02页写时序:2、24LC64页写时序:STM8L的程序设计如下:(1)数据的页写操作:(2)数据的连续读取:
发表于 2019-12-03
STM8L读写EEPROM(24LC64)
记一次stm8l程序跑飞
项目使用stm8l051f3做主控,CC2500做数据接收,不发送。跑飞的现象就是,刚开始能运行,经过一段未知长度的时间,有可能是3分钟,有可能是30分钟,指示灯不再闪烁,中断按键单片机无反应。接入调试器发现跑到了一个非常大的地址,已经超过了mcu的内部flash空间。可以确定是程序跑飞。经验是:程序跑飞,查条件语句是否都有做处理。程序跑飞,查内存溢出。查了好久,查出是内存溢出导致。因为发送端发送的数据固定是32字节,所以在接收端只开辟了一个32字节的buffer去读取收到的数据
发表于 2019-12-02
STM8L052C6T6液晶LCD驱动过程
; for (counter = 0; counter <= LCD_RAMRegister_13; counter++)    {        LCD->RAM[counter] = 0xff;    }}下面着重记录一下踩过的坑:LCD_Init();函数里面的最后一个参数是LCD_VoltageSource_Internal还是LCD_VoltageSource_External官方STM8L-DISCOVERY的原理图上[object Object]R25这个0R电阻没有焊接,所以代码里使用的是
发表于 2019-12-02
STM8L052C6T6液晶LCD驱动过程
stm8l151低功耗程序架构
最近帮医院做了一款体温记录仪,整个硬件方案资源是:stm8L151 + NTC*2 + EEPROM + 锂电池充电保护电路 + 18mAh纽扣电池;软件逻辑是,每隔一分钟,采样两路温度并保存在EEP里;通过USB转TTL,上位机能够读取,展示温度曲线,最大最小平均值等简单的运算;整个方案很简单,但也走了不少弯路......单片机程序框架之伪代码:void main(void){    CLK_Config();    GPIO_Config();    ADC_Config();    USART_Config();   
发表于 2019-12-02
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved