(stm32f103學習總結)—待機喚醒實驗


一、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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM