stm8s和stm8l低功耗对比

stm8s和stm8l低功耗对比  

  在低功耗应用中,一般来说mcu是常态halt模式,然后偶尔被唤醒(外部中断或者内部定时唤醒)进入运行模式。所以对比低功耗性能,一般来说只需要对比run模式和halt下的功耗即可,因为项目选用的是通过内部定时器唤醒,所以选用active halt mode。以下是stm8s003和stm8l151在这两种模式下的功耗对比: 

run mode:

  • stm8s ------

  • stm8l ------

  • 对比

   在使用同样的16M内部RC振荡器情况下,stm8s 3.7ma,stm8l 3.54ma,两款mcu耗电量差不多。

active halt mode:

  • stm8s

  • stm8l

  • 对比

  在同样的关闭外设,且使用内部低速RC振荡器唤醒的情况下:stm8s 10ua,stm8l 0.54ua。大约有20倍的差距,不过对于要求不是特别高的情况下,ua级别的差距影响不会太大。

实测:

为了实际验证,分别将单片机焊接到空板子上编写代码进行测试。

stm8 编写如下代码:

32ms唤醒一次

主程序:

void main(void)
{
  CLK_HSECmd ( DISABLE );
  CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);

  AWU_DeInit();
  AWU_Init(AWU_TIMEBASE_32MS);
  CLK_SlowActiveHaltWakeUpCmd(ENABLE); //关闭活跃停机模式下的电压调节器(MVR)
  CLK_FastHaltWakeUpCmd(DISABLE); //关闭快速唤醒
  FLASH_SetLowPowerMode(FLASH_LPMODE_POWERDOWN); //设置为停机后flash掉电

  GPIO_Init(GPIOA,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_LOW_SLOW);
  GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_LOW_SLOW);
  GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_LOW_SLOW);
  GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_LOW_SLOW);

  GPIO_WriteLow(GPIOA,GPIO_PIN_ALL);
  GPIO_WriteLow(GPIOB,GPIO_PIN_ALL);
  GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);
  GPIO_WriteLow(GPIOD,GPIO_PIN_ALL);

  AWU_Cmd(ENABLE);

  while(1)
  {
  halt();
  }
}

中断处理程序:

INTERRUPT_HANDLER(AWU_IRQHandler, 1)
{
  /* In order to detect unexpected events during development,
 it is recommended to set a breakpoint on the following instruction.
  */
  u8 awu_temp = 0;
  awu_temp = AWU_GetFlagStatus();
}

 程序下载到单片机后,串到台式万用表上实测电流11ua,见下图:

stm8l 编写如下代码:

32ms唤醒一次

主程序:

void main(void)

{

  GPIO_Init(GPIOA, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
  GPIO_Init(GPIOB, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
  GPIO_Init(GPIOC, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
  GPIO_Init(GPIOD, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
  GPIO_Init(GPIOE, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
  GPIO_Init(GPIOF, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);

  GPIO_Write(GPIOA,0x00);
  GPIO_Write(GPIOB,0x00);
  GPIO_Write(GPIOC,0x00);
  GPIO_Write(GPIOD,0x00);
  GPIO_Write(GPIOE,0x00);
  GPIO_Write(GPIOF,0x00);

  RTC_DeInit(); //初始化默认状态
  CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); //允许RTC时钟
  CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1); // 38K/1
  RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div2); //38/2=19K
  RTC_SetWakeUpCounter(19*32); //19*32 32ms
  RTC_ITConfig(RTC_IT_WUT, ENABLE); //开启中断
  PWR_FastWakeUpCmd(DISABLE); //关闭快速唤醒功能

  PWR_UltraLowPowerCmd(ENABLE);//超低功耗
  RTC_WakeUpCmd(ENABLE);

  while(1)

  {

  halt();

  }

}

中断处理程序:

INTERRUPT_HANDLER(RTC_CSSLSE_IRQHandler,4)
{
  /* In order to detect unexpected events during development,
  it is recommended to set a breakpoint on the following instruction.
  */

  RTC_ClearITPendingBit(RTC_IT_WUT);
}

将程序下载到单片机后,串到台式万用表测试电流在4ua左右,见下图:

原文出处:https://www.cnblogs.com/hanhuo/p/11350667.html

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )