stm8s和stm8l低功耗對比

  • 2019 年 10 月 3 日
  • 筆記

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左右,見下圖: