若要理解低功耗,則先要說一下STM32的事件和中斷
事件是中斷的觸發源,開放了對應的中斷屏蔽位,則事件可以觸發相應的中斷。在STM32中,中斷與事件不是等價的,一個中斷肯定對應一個事件,但一個事件不一定對應一個中斷。
當外部有信號輸入時,如果通過了事件屏蔽寄存器,那么事件信號就進入脈沖觸發器,引發一個脈沖信號,直接傳遞給相應的外設,用於觸發,這就是一個純硬件的過程,理解DMA的應該知道,這個方式不需要CPU參與,但是這也有它的缺點,如功能比較單一,僅能提供信號,不能提供信息,也就是只能產生指定功能的事件。如果通過中斷屏蔽寄存器,就被直接送到CPU中,產生中斷,如進入上面的入口函數開始處理。從這就可看出,事件是單純硬件觸發執行的過程,與CPU本身設計支持有關,而中斷中則可以軟件實現各種功能,而低功耗模式的事件喚醒就是stm32支持的事件之一。
對於STM32來說,共有3種低功耗模式:睡眠模式,停機模式,待機模式。
睡眠模式
當Cortex-M3遇到WFE(等待中斷)或者WFI(等待事件)指令時會停止內部時鍾,中帶程序執行。盡管Cortex-M3停止工作,但是其外設仍在繼續工作,直到某個外設產生事件或者中斷時,內核將會被喚醒,藉此退出睡眠模式。
停機模式
倘若用戶將Cortex-M3處理器的電源控制寄存器(Cortex Power Control Register,Cor-tex_PCR)中的SLEEPDEEP位置位,然后將STM32電源控制寄存器(STM32 Power Control Register.STM32 PCR)中的PDDS(Power Down Deep Sleep)位清除,就完成了 STM32停機模式的設置。
當停機模式設置完畢后,CPU一旦遇到WFI或 WFE指令就會停止工作,HSI和HSE 也進人關閉狀態。但Flash和SRAM將會繼續保持電源供應,所以此時STM32的所有工作狀態仍然是保留着的。和睡眠模式一樣,停機模式也可以通過外設中斷喚醒,然面在停機模式下,除了外部中斷控制單元,所有設備的時鍾都被禁止了,只能通過在GPIO引腳上產生電平邊沿觸發外部中斷的方式來將STM32從停機狀態下喚醒。而前面也曾提到過,外部中斷通道除了與GPIO連接,還和RTC時鍾的報警事件連接,加之RTC的計數時鍾並非來源於STM32的設備總線(而是直接來自LSI或LSE),因此還可以使用RTC模塊實現定時將STM32從停機狀態中喚醒。
待機模式
將Cortex_PCR中的SLEEP位進行置位,再將STM32_PCR中的PDDS位進行置位,如此一來,STM32則進入待機模式。
若要喚醒待機模式,有多種方式進行喚醒,分別位:RTC的鬧鍾事件、NRST的外部引腳復位、獨立看門狗(IWDG)所產生的復位信號,以及GPIOA.0引腳上所產生的一個上升沿,但是若要是要該引腳所產生的上升沿來喚醒STM32,則必須事先設置為喚醒引腳功能。待機模式是STM32的最低功耗模式。
當進入待機模式后,所有的SRAM數據、Cortex-M3處理器的寄存器和STM32的寄存器內容都將會被清零。效果等同於硬件復位。