一、STM32低功耗模式介紹
STM32提供了一些低功耗模式。默認情況下,系統復位或上電復位后,微控制器進入運行模式。在運行模式下,HCLK 為CPU提供時鐘,并執行程序代碼。當 CPU 不需要繼續運行(例如等待外部事件) 時,可以利用多種低功耗模式來節省功耗。
STM32 提供了 3 種低功耗模式,以達到不同層次的降低功耗的目的
- ? 睡眠模式 (內核停止工作,外設仍在運行)
- ? 停止模式 (所有時鐘都停止)
- ? 待機模式 ( 1.8 V 內核電源關閉)
這三種模式所需的功耗是逐級遞減,也就是說待機模式功耗是最低的。
在睡眠模式中,僅關閉了內核時鐘,內核停止運行,但其片上外設,CM3 核心的外設全都照常運行 。在停止模式中,進一步關閉了其它所有的時鐘,于是所有的外設都停止了工作,但由于其 1.8V 區域的部分申源沒有關閉,還保留了內核的寄存器、內存的信息,所以 從停止模式喚醒,并重新開啟時鐘后,還可以從上次停止處繼續執行代碼 。
在待機模式中,它除了關閉所有的時鐘,還把 1.8V 區域的電源也完全關閉了,也就是說, 從待機模式喚醒后,由于沒有之前代碼的運行記錄,只能對芯片復位,重新檢測BOOT條件,從頭開始執行程序 。
另外,在運行模式下也可以通過降低系統時鐘,關閉APB和AHB總線上未被使用的外設時鐘來降低功耗。
低功耗模式一覽表
二、睡眠模式
2.1 進入睡眠模式
通過執行WFI或WFE指令進入睡眠狀態。根據Cortex-M3系統控制寄存器中的SLEEPONEXIT位的值,有兩種選項可用于選擇睡眠模式進入機制
- ? SLEEP-NOW 如果SLEEPONEXIT位被清除,當WRI或WFE被執行時,微控制器立即進入睡眠模式。
- ? SLEEP-ON-EXIT 如果SLEEPONEXIT位被置位,系統從最低優先級的中斷處理程序中退出時,微控制器就立即進入睡眠模式。
在睡眠模式下,所有的I/O引腳都保持它們在運行模式時的狀態。
2.2 退出睡眠模式
如果執行WFI指令進入睡眠模式 ,任意一個被嵌套向量中斷控制器(NVIC)響應的外設中斷都能將系統從睡眠模式喚醒。也就是任意一個外部中斷都可以喚醒。
如果執行WVFE指令進入睡眠模式 ,則一旦發生喚醒事件時,微處理器都將從睡眠模式退出。喚醒事件可以通過下述方式產生
- ? 在外設控制寄存器中使能一個中斷,而不是在NVIC(嵌套向量中斷控制器)中使能,并且在Cortex-M3系統控制寄存器中使能SEVONPEND位。當MCU從WFE中喚醒后,外設的中斷掛起位和外設的NVIC中斷通道掛起位(在NVIC中斷清除掛起寄存器中)必須被清除。
- ? 配置一個外部或內部的EXIT線為事件模式。當MCU從WFE中喚醒后,因為與事件線對應的掛起位未被設置,不必清除外設的中斷掛起位或外設的NVIC中斷通道掛起位。
該模式喚醒所需的時間最短,因為沒有時間損失在中斷的進入或退出上。
SLEEP-NOW模式
SLEEP-ON-EXIT模式
三、停止模式
停止模式是在Cortex-M3的深睡眠模式基礎上結合了外設的時鐘控制機制,在停止模式下電壓調節器可運行在正常或低功耗模式。此時在1.8V供電區域的的所有時鐘都被停止,PLL、HSI和HSE RC振蕩器的功能被禁止,SRAM和寄存器內容被保留下來。
在停止模式下,所有的I/O引腳都保持它們在運行模式時的狀態。
3.1 進入停止模式
在停止模式下,通過設置電源控制寄存器(PWR CR)的LPDS位使內部調節器進入低功耗模式能夠降低更多的功耗。
如果正在進行閃存編程,直到對內存訪問完成,系統才進入停止模式。如果正在進行對APB的訪問,直到對APB訪問完成,系統才進入停止模式。在停止模式下,如果在進入該模式前ADC和DAC沒有被關閉,那么這些外設仍然消耗電流。通過設置寄存器ADC CR2的ADON位和寄存器DAC CR的ENx位為0可關閉這2個外設。
3.2 退出停止模式
當一個中斷或喚醒事件導致退出停止模式時,HSI RC振蕩器被選為系統時鐘。當電壓調節器處于低功耗模式下,當系統從停止模式退出時,將會有一段額外的啟動延時。如果在停止模式期間保持內部調節器開啟,則退出啟動時間會縮短,但相應的功耗會增加。
停止模式
四、待機模式
待機模式可實現系統的最低功耗。該模式是在Corex-M3深睡眠模式時關閉電壓調節器。整個1.8V供電區域被斷電。PLL、HSI和HSE振蕩器也被斷電。SRAM和寄存器內容丟失。只有備份的寄存器和待機電路維持供電。
待機模式的進出方法如下
待機模式
五、程序設計
這里介紹一下進入待機模式并喚醒的程序設計。配置進入待機模式有以下步驟
- ? 使能PWR外設時鐘
- ? 使能喚醒管腳
- ? 進入待機模式
庫函數中提供了進入待機模式的函數
/**
* @brief Enters STANDBY mode.
* @param None
* @retval None
*/
void PWR_EnterSTANDBYMode(void)
{
/* Clear Wake-up flag */
PWR- >CR |= PWR_CR_CWUF;
/* Select STANDBY mode */
PWR- >CR |= PWR_CR_PDDS;
/* Set SLEEPDEEP bit of Cortex System Control Register */
SCB- >SCR |= SCB_SCR_SLEEPDEEP;
/* This option is used to ensure that store operations are completed */
#if defined ( __CC_ARM )
__force_stores();
#endif
/* Request Wait For Interrupt */
__WFI();
}
使能喚醒管腳的函數
/**
* @brief Enables or disables the WakeUp Pin functionality.
* @param NewState: new state of the WakeUp Pin functionality.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void PWR_WakeUpPinCmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
*(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState;
}
測試代碼如下
int main(void)
{
Med_Mcu_Iint(); // 系統初始化
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); // 使能PWR外設時鐘
PWR_WakeUpPinCmd(ENABLE); // 使能喚醒管腳 使能或者失能喚醒管腳功能
while(1)
{
printf ("Time: 5 rn");
delay_ms(1000);
printf ("Time: 4 rn");
delay_ms(1000);
printf ("Time: 3 rn");
delay_ms(1000);
printf ("Time: 2 rn");
delay_ms(1000);
printf ("Time: 1 rn");
delay_ms(1000);
printf ("進入待機模式rn");
PWR_EnterSTANDBYMode(); // 進入待機模式
}
}
測試結果如下
待機喚醒測試結果
串口輸出完“進入待機模式”后,串口不再輸出。當按下WK UP時,重新開始倒計時,進入待機模式。
值得注意的是,進入待機模式被喚醒后,程序是重新開始運行的。對于一些只需要第一次開機才顯示的頁面或者一些第一次開機校準參數的程序,可以通過第一次開機向Flash固定地址寫入數據,下次復位讀取對應地址的數據,來判斷是否是第一次開機的方法,避免它們在待機喚醒后再次被執行。`
-
微控制器
+關注
關注
48文章
7649瀏覽量
152108 -
STM32
+關注
關注
2272文章
10923瀏覽量
357570 -
中斷處理
+關注
關注
0文章
94瀏覽量
11015 -
Cortex-M3
+關注
關注
9文章
270瀏覽量
59589 -
上電復位
+關注
關注
1文章
39瀏覽量
15866
發布評論請先 登錄
相關推薦
MCU學習筆記_STM32低功耗模式概述
![MCU學習<b class='flag-5'>筆記</b>_<b class='flag-5'>STM32</b><b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>概述](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
三 stm32低功耗模式
![三 <b class='flag-5'>stm32</b><b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32低功耗模式之待機模式
![<b class='flag-5'>STM32</b><b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>之待機<b class='flag-5'>模式</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
PWR-低功耗模式-STM32F4
![PWR-<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>-<b class='flag-5'>STM32</b>F4](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32 低功耗待機(STANDBY) 和關機(SHUTDOWN) 專用管腳喚醒 (EWUP)
![<b class='flag-5'>STM32</b> <b class='flag-5'>低功耗</b>待機(STANDBY) 和關機(SHUTDOWN) 專用管腳喚醒 (EWUP)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32 低功耗STOP模式,RTC喚醒
![<b class='flag-5'>STM32</b> <b class='flag-5'>低功耗</b>STOP<b class='flag-5'>模式</b>,RTC喚醒](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32 低功耗睡眠模式(SLEEP)事件(EVENT)喚醒實現及優化
![<b class='flag-5'>STM32</b> <b class='flag-5'>低功耗</b>睡眠<b class='flag-5'>模式</b>(SLEEP)事件(EVENT)喚醒實現及優化](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論