stm8s和stm8l低功耗對比
在低功耗應用中,一般來說mcu是常態halt模式,然後偶爾被喚醒(外部中斷或者內部定時喚醒)進入執行模式。所以對比低功耗效能,一般來說只需要對比run模式和halt下的功耗即可,因為專案選用的是通過內部定時器喚醒,所以選用active halt mode。以下是stm8s003和stm8l151在這兩種模式下的功耗對比:
run mode:
![](https://i.iter01.com/images/f75235648c2b53dda06ad7760fbc2914b70c3e31af8ce58c2a7e644cea8fd817.png)
![](https://i.iter01.com/images/159e7bc9fd9da62670476a379500c11b9e1688cc67fb9a84559837773ec00e9c.png)
在使用同樣的16M內部RC振盪器情況下,stm8s 3.7ma,stm8l 3.54ma,兩款mcu耗電量差不多。
active halt mode:
![](https://i.iter01.com/images/271eb7c6eee37069b026ce690f34d576cc25346b89257b3e28e8cea5fc021945.png)
![](https://i.iter01.com/images/0fa123a4676b87ef271cdbd54499365c9415bb7a680b343d94d524d3dcbd0100.png)
在同樣的關閉外設,且使用內部低速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,見下圖:
![](https://i.iter01.com/images/6c0ab563425c82c7e49f6e3f41b800ef2c0e3957a930614f140aac583e429e46.png)
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://i.iter01.com/images/edb63dd113cea5957de940c921a49168510de5a8397970e6c1301fd09e812e96.png)