一、STM32待機模式介紹
1.1 STM32低功耗模式介紹
很多單片機具有低功耗模式,比如MSP430、STM8L等,我們的STM32 也不例外。默認情況下,系統復位或上電復位后,微控制器進入運行模 式。在運行模式下,HCLK 為CPU提供時鍾,並執行程序代碼。當 CPU 不 需繼續運行(例如等待外部事件)時,可以利用多種低功耗模式來節省 功耗。用戶需要根據最低電源消耗、最快速啟動時間和可用的喚醒源等 條件,選定一個最佳的低功耗模式。
當然在運行模式下,也可以通過如下方式降低功耗:
(1)降低系統時鍾速度
(2)不使用 APBx 和 AHB 外設時,將對應的外設時鍾關閉
STM32 提供了 3 種低功耗模式,以達到不同層次的降低功耗的目 的,這三種模式如下:
(1)睡眠模式( CM3 內核停止工作,外設仍在運行)
(2)停止模式(所有時鍾都停止)
(3)待機模式( 1.8 V 內核電源關閉) 這三種模式所需的功耗是逐級遞減,也就是說待機模式功耗是最低的 。三種低功耗模式匯總表如圖所示:
二、三種低功耗模式的比較
(1)在睡眠模式中,僅關閉了內核時鍾,內核停止運行,但其片上外設, CM3 核心的外設全都照常運行。
(2)在停止模式中,進一步關閉了其它所有 的時鍾,於是所有的外設以及內核都停止了工作,但由於其 1.8V 區域的部分電 源沒有關閉,還保留了內核的寄存器、內存的信息,所以從停止模式喚 醒,並重新開啟時鍾后,還可以從上次停止處繼續執行代碼。
(3)在待機模 式中,它除了關閉所有的時鍾,還把 1.8V 區域的電源也完全關閉了, 也就是說,從待機模式喚醒后,由於沒有之前代碼的運行記錄,只能對 芯片復位,重新檢測BOOT條件,從頭開始執行程序。
如何進入待機模式
從待機模式喚醒后,程序將按照復位(啟動引腳采樣、復位向量已獲 取等)后的方式重新執行。電源控制/狀態寄存器(PWR_CSR)將會指示內 核由待機狀態退出。
在進入待機模式后,除了復位引腳以及被設置為防侵入或校准輸出時 的 TAMPER (PC13)引腳和被使能的喚醒引腳( WK_UP 腳(PA0)), 其他的 IO 引腳都將處於高阻態。
三、待機模式配置步驟
(1)使能電源時鍾
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
(2)設置WK_UP引腳為喚醒源
PWR_WakeUpPinCmd(ENABLE);
(3)進入待機模式
PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 標志
PWR_EnterSTANDBYMode();//進入待機模式
四、編寫待機喚醒程序
本章所要實現的功能是:系統運行時D1指示燈閃爍,5秒后進入待機 模式,D1指示燈熄滅,同時串口printf輸出相關提示信息,通過K_UP按 鍵實現喚醒。
程序框架如下:
(1)配置進入與退出待機模式 (2)編寫主函數
1 #ifndef _wkup_H 2 #define _wkup_H
3
4 #include "system.h"
5
6
7 void Enter_Standby_Mode(void); 8
9 #endif
1 #include "wkup.h"
2
3 /******************************************************************************* 4 * 函 數 名 : Enter_Standby_Mode 5 * 函數功能 : 進入待機模式 6 * 輸 入 : 無 7 * 輸 出 : 無 8 *******************************************************************************/
9 void Enter_Standby_Mode(void) 10 { 11
12 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR外設時鍾
13
14 PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up(喚醒)標志
15
16 PWR_WakeUpPinCmd(ENABLE);//使能喚醒管腳 使能或者失能喚醒管腳功能
17
18
19 PWR_EnterSTANDBYMode();//進入待機模式
20 }
1 #include "system.h"
2 #include "SysTick.h"
3 #include "led.h"
4 #include "usart.h"
5 #include "wkup.h"
6
7
8 /******************************************************************************* 9 * 函 數 名 : main 10 * 函數功能 : 主函數 11 * 輸 入 : 無 12 * 輸 出 : 無 13 *******************************************************************************/
14 int main() 15 { 16
17 SysTick_Init(72); 18 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優先級分組 分2組
19 LED_Init(); 20 USART1_Init(9600); 21
22 while(1) 23 { 24 printf("time: 5\r\n"); 25 led1=0; 26 delay_ms(1000); //隔1秒顯示計數
27
28 printf("time: 4\r\n"); 29 led1=1; 30 delay_ms(1000); 31
32 printf("time: 3\r\n"); 33 led1=0; 34 delay_ms(1000); 35
36 printf("time: 2\r\n"); 37 led1=1; 38 delay_ms(1000); 39
40 printf("time: 1\r\n"); 41 led1=0; 42 delay_ms(1000); 43
44 printf("進入系統待機模式\r\n"); 45 Enter_Standby_Mode(); 46 } 47 }