1. 程式人生 > >[CortexM0--stm32f0308]Low Power Mode

[CortexM0--stm32f0308]Low Power Mode

資料 中斷 npe 計時 epo 出場 操作 一個 parent

問題描寫敘述

stm32f0308正常是運行在Run mode下。這樣的mode是在reset之後的默認模式。Low Power Mode。即低功耗模式。用於在IC空暇時能夠考慮選擇進入。使系統耗能減少,在必要的時候通過喚醒在進入Run mode正常工作。

Low Power Mode,在嵌入式系統中考慮的非常多,也非常關鍵,由於一般都是用移動電源供電,合理使用Low Power Mode。會非常好的提高設備的續航能力。

Low Power Mode方式

  1. Sleep Mode:CPU時鐘關閉。全部peripheral時鐘運行。
  2. Stop Mode:全部時鐘均停止;
  3. Standby Mode:1.8 V domain power-off。這裏domain power-off應當是相當於關閉了給IC供電的電源。
    另外,假設在Run Mode下,也能夠通過例如以下手段來減少功耗:
  4. 減少System Clock的速度,即通過Clock的配置,利用分頻的作用。將系統Clock從最高的48MHz減少,這部分的配置能夠參考Clock相關文檔或文章。
  5. 當不使用APB或AHB peripheral時,使用門控時鐘的方式。在peripheral配置使用時。通常會先通過RCC_AH/PBClockCmd(xx,Enable)之類的接口來使能peripheral時鐘,有時候,可能這個peripheral並沒有再使用了。那能夠通過RCC_AH/PBClockCmd(xx,Disable)的接口將其關閉,也能夠省些電。

    這裏的RCC_AH/PBClockCmd()是stm32的固件庫中提供的,須要了解細節的能夠看下stm32固件庫,當中主要是通過對RCC_APBENR和RCC_AHBENR register操作來使能/禁止某項peripheral的時鐘的。
    幾種Low Power Mode的比較例如以下:
    技術分享

Sleep Mode

怎樣進入Sleep Mode?

運行WFI (Wait For Interrupt) 指令或WFE (Wait for Event)指令。進入Sleep Mode的機制能夠通過Cortex-M0 System Control register的SLEEPONEXIT bit來選擇:
6. Sleep-now:SLEEPONEXIT bit置零,在WFI/WFE指令運行之後馬上進Sleep Mode;
7. Sleep-on-exit:SLEEPONEXIT bit置1,在MCU退出了最低優先級的ISR之後,即系統沒有不論什麽ISR在處理時,就會進入Sleep Mode。

怎樣退出Sleep Mode?

退出Sleep Mode的方式和使用的進入Sleep Mode的指令WFI和WFE有關,使用WFI進入Sleep Mode,不論什麽中斷的發生都會導致退出Sleep Mode,而WFE指令進入的Sleep Mode,在event發生時會退出Sleep Mode,對於WFE指令進入Sleep Mode的方式,須要使用例如以下兩種方式配置其退出Sleep Mode:
8. 使能一個peripheral中斷(非NVIC中斷),使能Cortex-M0 System Control register的SEVONPEND bit。當MCU從WFE Sleep Mode醒來時,須要清掉peripheral interrupt pending bit和peripheral NVIC IRQ channel pending bit ;
9. 配置一個外部或內部EXTI line為event模式。

Sleep Mode進入退出場景比較

技術分享
技術分享

Stop Mode

比Sleep Mode更進一步,IC內部Clock應當都停止了,SRAM和register。IO口狀態是保持在上一刻進入Stop Mode時的狀態。

Stop Mode進出場景比較

技術分享

Standby Mode

比Stop Mode更省電,SRAM和register僅僅有部分維持數據(需看下register表,應當有標明為Standby Circuitry的)。

Standby Mode進出場景比較

技術分享
在上面的Stop Mode和Standby Mode中, 貌似IWDG,RTC。LSI和LSE還是由這幾個peripheral各自的register編程設定而受控制的,由於即使是進入了Low Power Mode,RTC的功能還是須要的,由於要計時,這非常重要。

Low Power Mode下的debug問題

由於進入Stop Mode和Standby Mode後,Cortex M0事實上已經停止了(Clock關閉了)。因此用swd此時應當是沒辦法debug的,只是stm32f0308的資料說,通過設置DBGMCU_CR register的一些配置,還是能夠debug的,可是沒有進一步具體的說明了……只是,對於stm32f0308這顆IC,貌似在進入Low Power Mode後,也不是必需去debug,由於Stop Mode和Standby Mode本來就沒有代碼在運行了,除非是stm自己在開發和驗證IC時。可能須要做些debug,所以這裏對使用者來說。應當沒有什麽所謂了。

Low Power Mode的RTC喚醒方式

RTC alarm方式能夠用來喚醒Stop mode和Standby Mode,RTC時鐘源能夠選擇LSE,也能夠是LSI,這兩個低速時鐘都適合用於低功耗的。


對於RTC alarm喚醒Stop Mode。須要:
10. 配置EXTI line 17為上升沿;
11. 配置RTC可產生RTC alarm。


對於RTC alarm喚醒Standby Mode,則僅僅須要RTC可產生RTC alarm就可以。

[CortexM0--stm32f0308]Low Power Mode