STM32的低功耗模式有3種:
1、睡眠模式(CM3內核停止,外設仍然運行)
2、停機模式(所有時鍾都停止)
3、待機模式(1.8v內核電源關閉)

進入待機模式的方法,以及設置WK_UP引腳用於把STM32從待機模式喚醒的方法
一般步驟如下:
1、設置SLEEPDEEP位
SCB_SCR的第二位
2、使能電源時鍾,設置WK_UP引腳作為喚醒源
因為要配置電源控制寄存器,所以必須先使能電源時鍾。然后再設置PWR_CSR的EWUP位,使能WK_UP用於將CPU從待機模式喚醒。
3、設置 PDDS PDDS位,執行 WFI 指令,進入待機模式。
通過 PWR_CR 設置 PDDS 位,使得 CPU 進入深度睡眠時待機模式,最后執行 WFI指令開始進入待機模式,並等WK_UP中斷的到來
4、最后編寫WK_UP中斷函數
下面是進入待機模式的代碼
//進入待機模式 void STAND_By(void){ SCB->SCR |= 1<<2; //設置SLEEPDEEP位 RCC->APB1ENR |= 1<<28;//使能電源時鍾 PWR->CSR |= 1<<8; //設置WK_UP作為喚醒源 PWR->CR |= 1<<1; //設置PDDS位,進入深睡眠模式 PWR->CR |= 1<<2; //清除喚醒位 __ASM volatile("wfi"); //執行WFI命令 }
最后實現的現象是,燒入程序,復位后,開始執行程序,進入待機模式,長按WK_UP鍵3秒,退出待機模式,重新執行代碼(從待機模式喚醒后的代碼執行 等同於復位后代碼的執行),小燈開始閃爍。
之后如果再次長按WK_UP鍵3秒,就會再次進入待機模式。
//WK_UP鍵初始化 void WKUP_Init(void){ RCC->APB2ENR |= 1<< 2; //使能GPIOA時鍾 //設置GPIOA為上拉輸入 GPIOA->CRL &= 0xFFFFFFF0; GPIOA->CRL |= 0x00000008; GPIOA->IDR |= 1<<0; //中斷配置 Ex_NVIC_Config(GPIO_A,0,RTIR);//上升沿有效 if(CHECK_Wkup()==0) STAND_By(); MY_NVIC_Init(2,2,EXTI0_IRQn,2);//中斷分組 }
上訴代碼中非常重要的一句話是:
if(CHECK_Wkup()==0) STAND_By();
只有加上這句話,才能實現長按喚醒,而不是一按就喚醒。
