stm32幾種低功耗模式的實現和差別

2021-09-26 07:58:04 字數 4095 閱讀 1480

stm32幾種常見的低功耗模式

按功耗由高到低排列,stm32具有執行、睡眠、停止和待機四種工作模式。上電復位後stm32處於執行狀態,當核心不需要繼續執行,就可以選擇進入後面的三種低功耗模式降低功耗,這三種模式中,電源消耗不同、喚醒時間不同、喚醒源不同,使用者需要根據應用需求,選擇最佳的低功耗模式。三種低功耗的模式說明如下圖:

從表中可以看到,這三種低功耗模式層層遞進,執行的時鐘或晶元功能越來越少,因而功耗越來越低

不同模式下軟體工作方式的對比

睡眠模式:在睡眠模式中,僅關閉了核心時鐘,核心停止執行,但其片上外設,cm4核心的外設全都還照常執行,在軟體上表現為不再執行新的**。這個狀態會保留睡眠前的核心暫存器、記憶體的資料。喚醒後 ,若由中斷喚醒,先進入中斷,退出中斷服務程式後,接著執行wfi指令後的程式;若由事件喚醒,直接接著執行wfe後的程式。喚醒延遲:無延遲。(wfi:wait for interrupt,wfe:wait for event

停止模式:在停止模式中,進一步關閉了其它所有的時鐘,於是所有的外設都停止了工作,但由於其1.2v區域的部分電源沒有關閉,還保留了核心的暫存器、記憶體的資訊,所以從停止模式喚醒,並重新開啟時鐘後,還可以從上次停止處繼續執行**。喚醒後,若由中斷喚醒,先進入中斷,退出中斷服務程式後,接著執行wfi指令後的程式;若由事件喚醒,直接接著執行wfe後的程式。**喚醒後,stm32會使用hsif1hsi8mf412m)作為系統時鐘。**所以,**有必要在喚醒以後,在程式上重新配置系統時鐘,將時鐘切換回hse。**喚醒延遲 :基礎延遲為hsi振盪器的啟動時間,若調壓器工作在低功耗模式,還需要加上調壓器從低功耗切換至正常模式下的時間,若 flash 工作在掉電模式,還需要加上 flash 從掉電模式喚醒的時間。

待機模式:待機模式,它除了關閉所有的時鐘,還把1.2v區域的電源也完全關閉了,也就是說,從待機模式喚醒後,由於沒有之前**的執行記錄,只能對晶元復位,重新檢測 boot條件,從頭開始執行程式

所以,軟體工作的對比就很明顯了,睡眠模式的喚醒是無延遲的喚醒,而停止模式的喚醒是有延時的。睡眠和停止模式下,喚醒以後,程式還可以從上次停止的地方繼續執行,但是,待機模式必須重新復位,從頭開始執行。

不同模式下喚醒方式的對比(重要)

睡眠模式下,任一乙個中斷都是可以喚醒的(針對呼叫wfi命令進入的睡眠);而停止模式下,是任一乙個外部中斷才能喚醒,注意是任一外部中斷,不是任一中斷;而待機模式又有所不同,外部中斷並不能喚醒待機模式,比較常見的喚醒有:

wkup引腳上公升沿(按下pa0,使之出現上公升沿,只要pa0出現乙個上公升沿即可喚醒微控制器,而不管這個上公升沿持續多長時間,軟體上只需要在進入待機模式之前,將pa0配置為喚醒功能即可);

nrst引腳復位(即按下復位按鍵),這種方式是讓微控制器重新復位了,這是硬體上的喚醒;

微控制器系統重新上電,這跟第2點是一樣的,都是硬體復位。

不同模式下功耗的對比

目前這方面的資料比較少,**stm32**的中文參考手冊上提及的也比較少,因此以下內容只能作為參考,stm32f1在停機模式下的功耗大概是20幾ua,而在待機模式下最低可以達到5ua;而stm32f4在停機模式下的功耗大概是350ua,而在待機模式下最低可以達到2.2ua資料參考**於正點原子《stm32f1開發指南》和《stm32f4開發指南》。

實際中的專案應用(重要)

在很多應用場合中都對電子裝置的功耗要求非常苛刻,如某些感測器資訊採集裝置,僅靠小型的電池提供電源,要求工作長達數年之久,且期間不需要任何維護;由於智慧型穿戴裝置的小型化要求,電池體積不能太大導致容量也比較小,所以也很有必要從控制功耗入手,提高裝置的續行時間。其實,只要是涉及到可攜式的產品,都免不了要使用電池作為電源,否則,如果還是需要接乙個插頭使用市電來供電的話,那就無法稱之為可攜式了, 比如手機、運動手環、藍芽耳機、智慧型手錶等都是類似的。所以,控制功耗,提高產品的續航時間,就顯得尤為重要。

目前來說,針對stm32而言,比較常用的低功耗模式是停止模式和待機模式。具體如下:

待機模式:在實際應用中,通常會有乙個開關機的按鍵(pa0),如果使用者按下按鍵的話,就會開機或者關機,開機對應的就是喚醒,而關機對應的就是待機(類似於手機的開關機按鍵)。在此過程中,電池會一直給微控制器的3.3v電源供電,也就是說,微控制器一直都是有電的,但是它的所有外設以及時鐘都處於關閉狀態,之所以還要給微控制器供電,只是為了在使用者按下按鍵時檢測pa0的上公升沿而已,如果不給微控制器供電的話,那麼還怎麼檢測呢?檢測不了。

停止模式:按道理來說,待機模式的功耗遠比待機模式要低,為什麼還要選擇停止模式呢?通常是這樣的,乙個可攜式的系統,除了考慮按鍵開關機以為,通常還需要給電池充電,而在充電的時候呢,往往需要顯示一些充電的資訊(現在的手機充電就是這樣的),如果是在開機狀態下充電的話,完全沒有問題;但是,如果是在關機狀態下充電呢?如果是在關機狀態下充電,肯定就需要微控制器能夠自己喚醒自己(不需要使用者按下pa0),然後才有可能在oled上顯示充電的資訊(手機關機了,或者沒有電了,接通電源以後,可以自動顯示充電的動畫,就是這樣做的)。

不按下pa0就實現喚醒功能,可以實現嗎?可以,只需要在硬體上做一些改動即可,比如,將充電口的電壓降壓以後跟pa0相連,這樣,只要充電口在充電,pa0必定會出現乙個從低到高的脈衝,這樣就可以喚醒了。然而……,可是……,如果真的這麼做的話,從軟體的層面上,到底應該怎麼樣來區分pa0的上公升沿是由於充電造成的呢?還是由於使用者按下按鍵造成的呢(畢竟,如果是使用者按下按鍵的話,軟體上是要開機的,而如果只是充電,那麼,只需要顯示一下充電的資訊就好了)?恐怕不好判斷。

所以,這個時候,就可以考慮選擇停止模式了,開關機按鍵接到乙個引腳,充電口接到另外乙個引腳,兩個引腳都配置為外部中斷,兩個引腳也都可以喚醒微控制器,分開了不同的訊號電平,這樣子,在軟體上就可以很容易地判斷出,當前到底是使用者按下按鍵,還是充電口在充電了。

改進方式:針對第2點提出的問題,其實是有改進空間的,改進的空間就是在硬體上實現乙個脈衝電路(在這裡完全可以用乙個簡單的rc延時就實現了),就是說充電口的電平再經過乙個rc電路以後,出來的就不會一直是高電平,而只是乙個脈衝了,再把這個脈衝訊號接到pa0即可,這個時候插入充電口和按下pa0就都會在pa0上出現乙個脈衝了。軟體上,可以利用長按開機,再長按關機(或者是先短按再長按也行)的機制來進行判別,如果pa0僅僅只是出現乙個上公升沿並且檢測到充電晶元正在充電,此時就是充電口插入了,喚醒微控制器,顯示充電效果即可,如果是先短按再長按的話,就開機。

STM32低功耗模式 停止模式

停止模式是在cortex m3的深睡眠模式基礎上結合了外設的時鐘控制機制,在停止模式下電壓調節器可執行在正常或低功耗模式。此時在1.8v供電區域的的所有時鐘都被停止,pll hsi和hse rc振盪器的功能被禁止,sram和暫存器內容被保留下來。thumb指令不支援彙編內聯 採用如下方法實現執行彙編...

STM32低功耗設計

具體要點為 1 所有io管腳,如果高阻狀態埠是高電平,就設成上拉輸入,如果高阻狀態是低電平,設成下拉輸入,如果高阻是中間狀態,設成模擬輸入。這個很多人都提到過,必須的。作為輸出口就免了,待機你想輸出個什麼東西,一定要輸,硬體上加上下拉就可以了 2 兩個晶振輸入腳要remap成普通io!使用內部晶振。...

STM32的3種低功耗模式

睡眠模式 核心停止,外設如nvic,系統時鐘systick仍執行。停止模式 所有時鐘都已停止 1.8v核心電源工作 pll,his和hserc振盪器功能禁止 暫存器和sram內容保留。待機模式 1.8v核心電源關閉 只有備份暫存器和待機電路維持供電 暫存器和sram內容全部丟失 實現最低功耗。在待機...