13.1 STM32低功耗模式概述
STM32在系統或電源復位后,芯片處于運行狀態,此時HCLK為CPU提供時鐘,內核執行程序代碼,當CPU不需要繼續運行時,可以采用低功耗模塊來降低芯片的運行電流,STM32有3種低功耗模式:
(1)睡眠模式:內核停止,外設繼續運行
(2)待機模式:1.8V的內核電源被關閉,SRAM內容丟失,PLL,HIS,HSE振蕩器斷電,此模式下最低電流2uA
(3)停機模式:停止所有時鐘,此模式下最低電流20uA
上述三種模式的配置與喚醒條件如下表所示。
模式 | 進入操作 | 喚醒 |
---|---|---|
睡眠 | WFI指令 | 任一中斷 |
WFE指令 | 喚醒事件 | |
待機 | PDDS位+SLEEPDEEP位+WFI或者WFE | WKUP引腳上升沿RTC警告事件NRST端口的復位信號IWDG復位 |
停機 | PDDS和LPDS位+SLEEPDEEP位+WFI或WFE | 任一外部中斷(需要在外部中斷寄存器中設置) |
從待機模式喚醒后,除了電源控制/狀態寄存器PWR_CSR,所有的寄存器被復位,喚醒后執行的代碼等同于復位后的執行,此時電源控制/狀態寄存器PWR_CSR將會指示內核由待機狀態退出,進入待機模式后,除了復位引腳以及被設置為防侵入或校準輸出時的TAMPER引腳和被使能的喚醒引腳,其他IO均進入高阻狀態。
13.2 相關寄存器
13.2.1 電源控制寄存器:PWR_CR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | DBP | PLS[2:0] | PVDE | CSBF | CWUF | PDDS | LPDS |
Bit 8:取消后備區域的寫保護
0:禁止寫入RTC和后備寄存器
1:允許寫入RTC和后備寄存器
Bit 7~Bit 5:PVD電平選擇
000:2.2V
001:2.3V
010:2.4V
011:2.5V
100:2.6V
101:2.7V
110:2.8V
111:2.9V
Bit 4:電源電壓監測器PVD使能
0:禁止PVD
1:開啟PVD
Bit 3:清除待機位
0:無功效
1:清除SBF待機位
Bit 2:清除喚醒位
0:無功效
1:2個系統時鐘周期后清除WUF喚醒位
Bit 1:掉電深睡眠
0:當CPU進入深睡眠時進入停機模式,調壓器的狀態由LPDS位控制
1:CPU進入深睡眠時進入待機模式
Bit 0:深睡眠下的低功耗
0:在停機模式下電壓調壓器開啟
1:在停機模式下電壓調壓器處于低功耗模式
13.2.2 電源控制/狀態寄存器:PWR_CSR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
EWUP | PVD0 | SBF | WUF |
Bit 8:使能WKUP引腳
0:WKUP引腳為通用I/O
1:WKUP引腳用于將CPU從待機模式喚醒,WKUP引腳被設為輸入下拉
Bit 2:PVD輸出
0:VDD/VDDA高于由PLS[2:0]選定的PVD閥值
1:VDD/VDDA低于由PLS[2:0]選定的PVD閥值
Bit 1:待機標志
0:系統不在待機模式
1:系統進入待機模式
Bit 0:喚醒標志
0:沒有發生喚醒事件
1:在WKUP引腳上發生喚醒事件或出現RTC鬧鐘事件
13.3 實驗例程
功能:芯片運行15s之后進入待機模式,然后按下接在WKUP端口的按鍵喚醒,CPU在喚醒模式下驅動接在PB5上的LED以1Hz頻率閃爍。
(1)打開sys.c文件編寫一個功能函數,添加以下代碼。
/***************************************************
Name :Standby_Set
Function :設置待機模式
Parameter :None
Return :None
***************************************************/
void Standby_Set()
{
SCB->SCR |= 1<<2 ; //使能SLEEPDEEP位
RCC->APB1ENR |= 1<<28 ; //使能電源時鐘
PWR->CSR |= 1<<8 ; //設置WKUP用于喚醒
PWR->CR |= 1<<2 ; //清除Wake-up 標志
PWR->CR |= 1<<1 ; //PDDS置位
__asm volatile("wfi"); //執行WFI指令
}
(2)打開sys.h文件添加功能函數的聲明。
void Standby_Set( void ) ; //設置待機模式
(3)打開1.c輸入以下代碼。
#include "sys.h"
#include "delay.h"
#include "usart1.h"
/***************************************************
Name :LED_Init
Function :LED初始化
Parameter :None
Return :None
***************************************************/
#define LED PBout( 5 ) //定義LED端口
void LED_Init()
{
RCC->APB2ENR |= 1<<3 ;
GPIOB->CRL &= 0xFF0FFFFF ;
GPIOB->CRL |= 0x00300000 ;
LED = 1 ;
}
/***************************************************
Name :TIM1_UP_IRQHandler
Function :TIM1中斷服務函數
Paramater :None
Return :None
***************************************************/
u8 TIM1_Count ;
void TIM1_UP_IRQHandler()
{
if( ( TIM1->SR&0x01 )==0x01 )
{
TIM1_Count ++ ;
if( TIM1_Count==15 )
{
Standby_Set() ; //進入待機模式
TIM1_Count = 0 ;
}
}
TIM1->SR &= ~( 1<<0 ) ;
}
/***************************************************
Name :TIM1_Init
Function :定時器1初始化
Parameter :
psc:預分頻系數
arr:重裝載值
Return :None
***************************************************/
void TIM1_Init( u16 psc, u16 arr )
{
RCC->APB2ENR |= 1<<11 ;
TIM1->DIER |= 1<<0 ;
TIM1->PSC = psc ;
TIM1->ARR = arr ;
TIM1->CR1 |= 1<<0 ;
NVIC_Init( 3, 2, TIM1_UP_IRQn, 2 ) ;
TIM1_Count = 0 ;
}
/***************************************************
Name :main
Function :主函數
Parameter :None
Return :None
***************************************************/
int main()
{
STM32_Clock_Init( 9 ) ; //STM32時鐘初始化
SysTick_Init( 72 ) ; //SysTick初始化
USART1_Init( 72, 115200 ) ; //初始化串口1波特率115200
LED_Init() ; //LED初始化
TIM1_Init( 7199, 9999 ) ; //定時器1初始化
while( 1 )
{
LED = 0 ;
delay_ms( 500 ) ;
LED = 1 ;
delay_ms( 500 ) ;
}
}
-
cpu
+關注
關注
68文章
10824瀏覽量
211140 -
STM32
+關注
關注
2266文章
10871瀏覽量
354791 -
程序代碼
+關注
關注
4文章
42瀏覽量
15426
發布評論請先 登錄
相關推薦
評論