本文主要解讀STM32低功耗模式的機制,并不側重STM32低功耗的程序實現,而且借助STM32固件庫實現STM32低功耗會變的非常簡單。
一、STM32芯片性能
使用芯片型號:stm32f030f4,CORTEX-M0.封裝TSSOP20.
運行模式:內部時鐘(HSI),系統時鐘頻率采用48MHZ。
工作電壓:3.3V
芯片具體參數如下:
二、芯片功耗
功耗:
芯片工作模式:
工作模式:外設正常運行,內核CPU及SRAM供電,未使用外設的時鐘默認關閉。
睡眠模式:只有CPU停止工作,各個外設正常工作,依靠任何中斷/事件喚醒。
停機模式:1.8V供電區域時鐘被停止,內部HSI,PLL,外部時鐘HSE均關閉,同時電壓檢測器也可進入低功耗模式,但SRAM和寄存器不斷電,此時只能依靠外部中斷(EXTI)和RTC時鐘才能喚醒。
待機模式:1.8V供電區域被時鐘停止,內部HSI,PLL,外部時鐘HSE均關閉,同時電壓檢測器也可進入低功耗模式,SRAM和不屬于待機電路的寄存器也被斷電關閉,此時即使是外部中斷(EXTI)也不能將其喚醒,只能通過復位(外部復位,看門狗復位)、喚醒引腳、RTC時鐘來喚醒。
注意:無論是在停止模式還是待機模式下,RTC和IWDG及其時鐘源不會被關閉。
各個模式功耗:
功耗計算方式:功耗=工作電壓*工作電流。
I/O模塊損耗:
靜態損耗:
內部上下拉電阻損耗:這部分損耗主要取決于內部電阻的大小,一般為了降低內部電阻損耗常常需要降低電阻兩端電壓,若引腳為低電壓則采用下拉電阻,若引腳為高電壓則采用上拉電阻。
I/O額外損耗:當引腳設為輸入I/O時,用來區分電壓高低的斯密特觸發器電路會產生一部分消耗,為此可將引腳設為模擬輸入模式。
動態損耗:對于懸浮的引腳,由于其電壓不穩定會產生外部電磁干擾和損耗,因此必須把懸浮引腳設為模擬模式或輸出模式,引腳電壓的切換會對外部和內部電容負載產生動態損耗,其損耗與電壓切換頻率和負載電容有關。具體損耗值如下:
三、CORTEX-M0低功耗功能、指令、相關寄存器
CORREX內核支持低功耗模式有2種:
睡眠模式:CPU時鐘停止,對應STM32睡眠模式
深度睡眠模式:系統時鐘停止,PLL,FLASH關閉,對應STM32停機模式。
進入睡眠模式:
當CPU處理完中斷后軟件必須能使其進入睡眠模式,當CPU執行WFI指令,其將會立即進入睡眠模式,當異常產生或中斷被掛起時,其立即被喚醒。
當CPU執行WFE指令時,它首先會檢查對應的事件標志位,當事件標志寄存器為0時進入睡眠模式,否則將寄存器事件標志清0并繼續執行程序。事件標志可由外部事件標志或SEV指令產生。
返回方式:通過設置內核SCB寄存器的Sleep-on-exit位,可以選擇系統被喚醒執行完中斷服務程序后進入主線程模式后是否立即進入睡眠模式。
從睡眠中喚醒:
WFI喚醒或sleep-on-exit:
一般來說,使能的異??梢詥拘褍群?。對于一些系統,在喚醒后執行中斷處理程序前需要先執行重新恢復的任務,則首先需要屏蔽所有中斷(PRIMASK=1),中斷發生后內核被喚醒但不執行中斷處理,待執行完恢復任務后再將PRIMASK設為0,此后執行中斷處理任務。
WFE喚醒:
使能異??梢詥拘褍群?。外部事件或SEV指令發送的事件也可喚醒內核。
注意:當SCR的SEVONPEND設置為1時,任何使能/非使能中斷或事件都可喚醒內核。
中斷喚醒控制器(WIC):
WIC只有在SCR寄存器DEEPSLEEP位設為1時才能使能,WIC不可編程也沒有相關的控制寄存器,它僅與硬件信號有關,當進入深睡眠時內核大部分模塊被關閉,系統計數器也被關閉,因此當內核被喚醒時需要較多的時間恢復到睡眠前的狀態并處理中斷。
外部事件輸入:可在WFE模式下喚醒內核。
相關指令:
WFE等待事件,若無事件則睡眠,中斷、事件喚醒
WFI等待中斷,立即進入睡眠,中斷喚醒
SEV軟件發送一個事件,在核系統中可喚醒另一個內核。
由指令對應的C語言接口:
//core_cmInstr.h
void__WFI(void)//WaitforInterrupt
void__SEV(void)//SendEvent
相關寄存器:
SCR寄存器:
SEVONPEND:
0:只有使能的中斷或事件才能喚醒內核。
1:任何中斷和事件都可以喚醒內核。
SLEEPDEEP:
0:低功耗模式為睡眠模式。
1:進入低功耗時為深度睡眠模式。
SLEEPONEXIT:
0:被喚醒進入線程模式后不再進入睡眠模式。
1:被喚醒后執行完相應的中斷處理函數后進入睡眠模式。
四、STM32時鐘管理
運行模式下可通過關閉和降低相關外設的時鐘頻率來減少功耗。
APB外設時鐘和DMA時鐘可用軟件禁止。
睡眠模式停止CPU時鐘。在CPU睡眠中存儲器接口時鐘(Flash和RAM接口)可被停止。當連接到APB所有外設的時鐘禁止后,當進入睡眠期間AHB到APB橋時鐘由CPU的硬件關閉。
CPU進入停止模式時停止V18域、PLL、HSI、HSI14和HSE振蕩器的時鐘。
HDMICEC,USART1和I2C1即使在MCU進入停止模式下仍有能力打開HIS振蕩器(假如HIS被選為這些外設的時鐘)。
在LSE振蕩器已使能的情況下,HDMICEC和USART1當在系統進入停止模式下也可由LSE振蕩器驅動(假如LSE被選為這些外設時鐘)。但是這些外設沒有打開LSE振蕩器的能力。
CPU進入待機模式時停止V18域、PLL、HSI、HSI14和HSE振蕩器的時鐘。
當設置DBGMCU_CR寄存器中的DBG_STOP或DBG_STANDBY位,那么CPU在相應的深度睡眠模式下也可以具有調試功能。
當系統由中斷(停止模式)或復位(待機模式)喚醒后,HSI振蕩器被選為系統時鐘(不管進入停止模式或待機模式前選用的是何種時鐘)。
假如當前正在進行閃存編程,只有在閃存編程全部完成之后才會進入深度睡眠模式(深度睡眠延后)。若當前正在使用APB域,那么只有全部完成APB域的操作后才進入深度睡眠模式。
五、STM32低功耗設置
STM32工作模式主要有運行、睡眠、停止、待機4種模式。
供電框圖
由上圖可以看到整個STM32芯片的供電圖,模擬電路部分采用VDDA獨立供電,各個部分可以獨立被關斷或開啟。備份電路部分由電池供電,主要有RTC時鐘及相關的備份寄存器,VDD掉電后可由電池供電,對于沒有VBAT引腳的芯片,其電源直接與VDD相連。核心部分分為1.8V工作域和VDD工作域,1.8V工作域主要有內核、存儲、外設部分,VDD供電域主要有I/O、待機電路(喚醒電路,獨立看門狗)、電壓調節器(VoltageRegulator)。
電壓調節器
器件復位后電壓調節器總是打開著的,其根據應用模式有三種不同的工作模式。
運行模式:調節器以全功耗模式為域(內核,內存和數字外設)提供1.8V電源。
停止模式:調節器以低功耗模式為保持寄存器及SRAM數據部分域提供1.8V的電源。
待機模式:調節器斷電,除了待機電路及備份域電路外,寄存器和SRAM的內容全部丟失。
相關寄存器介紹:
1,cortex-mo中的SCR寄存器
SEVONPEND:
0:只有使能的中斷或事件才能喚醒內核。
1:任何中斷和事件都可以喚醒內核。
SLEEPDEEP:
0:低功耗模式為睡眠模式。
1:進入低功耗時為深度睡眠模式。
SLEEPONEXIT:
0:被喚醒進入線程模式后不再進入睡眠模式。
1:被喚醒后執行完相應的中斷處理函數后進入睡眠模式。
2,電源控制寄存器PWR_CR
其中與低功耗有關的控制位:
CSBF:清除待機標志,該位始終讀出為0,寫1清除待機標志。
CWUF:清除喚醒標志,該位始終讀出為0。寫1清除喚醒標志。
PDDS:掉電深睡眠
0:當CPU進入深睡眠時進入停機模式,調壓器的狀態由LPDS位控制。
1:當CPU進入深睡眠時進入待機模式。
LPDS:深睡眠下的低功耗
0:在停機模式下電壓調節器開啟
1:在停機模式下電壓調節器處于低功耗模式
3,電源控制/狀態寄存器(PWR_CSR)
EWUP2/EWUP1:使能WKUP2或EWUP1引腳。
0:WKUP1/2引腳作為通用IO口。WKUP1引腳上的事件不能將CPU從待機模式喚醒。
1:WKUP1/2引腳用于將CPU從待機模式喚醒,WKUP1引腳被強置為輸入下拉的配置(WKUP1引腳上的上升沿將系統從待機模式喚醒)。
SBF:待機標志
該位由硬件設置,只能設置電源控制寄存器PWR_CR的CSBF位清除。
0:系統不在待機模式
1:系統進入待機模式
WUF:喚醒標志
由硬件設置,只能設置電源控制寄存器PWR_CR的CWUF位清除。
0:沒有喚醒事件發生
1:從WKUP或RTC鬧鐘產生一個喚醒事件
注意:當WKUP引腳已經是高電平時,在(通過設置EWUP位)使能WKUP引腳時,會檢測到一個額外喚醒的事件。
低功耗模式的進入與退出問題
1、睡眠模式
進入睡眠模式:
當STM32在運行狀態時,執行WFI或WFE指令可進入睡眠模式。
條件:SLEEPDEEP=0,設為睡眠模式。此時CPU時鐘被停止。
若令被喚醒的STM32執行完中斷處理任務后進入睡眠模式,則可將SLEEPONEXIT設為1.
退出睡眠模式:
執行WFI指令進入睡眠,可通過使能中斷喚醒。執行WFE指令進入睡眠可由事件喚醒,CPU時鐘打開。產生事件的兩種方式:
配置一個外部或內部EXTI線做為事件模式。
評論
查看更多