stm32的低功耗模式有三種:- 睡眠模式(內(nèi)核停止,外設(shè)運(yùn)行)
- 停機(jī)模式(所有時鐘都停止)
- 待機(jī)模式(1.8V內(nèi)核電源也關(guān)閉)
在這三種模式中,最低功耗的是待機(jī)模式,在此模式下,最低只需要2uA左右的電流。整個1.8V供電區(qū)被斷電,PLL、HSI、HSE振蕩器都被關(guān)閉。SRAM和寄存器內(nèi)容丟失。停機(jī)模式是次低功耗的的,其典型的電流損耗在20uA左右。最后就是睡眠模式。
stm32低功耗一覽表
這三種低功耗模式,喚醒后程序都會初始化運(yùn)行。在例子中做了一番論證,結(jié)果如此。
直接操作寄存器
進(jìn)入待機(jī)模式的通用步驟,其中涉及到2個寄存器,也就是電源控制寄存器(PWR_CR)和電源控制/狀態(tài)寄存器(PWR_CSR)。
電源控制寄存器(PWR_CR),該寄存器的各位描述如下:
這是一個低9位有效的寄存器。
- DBP[8]:取消后備區(qū)域的寫保護(hù) 位 8 在復(fù)位后,RTC和后備寄存器處于被保護(hù)狀態(tài)以防意外寫入。0:禁止寫入RTC和后備寄存器 1:允許寫入RTC和后備寄存器
- PLS[ 7:5]:PVD電平選擇。 這些位用于選擇電源電壓監(jiān)測器的電壓閥值。
000:2.2V 100:2.6V 001:2.3V 101:2.7V
010:2.4V 110:2.8V 011:2.5V 111:2.9V
- PVDE[4]:電源電壓監(jiān)測器(PVD)使能。0:禁止PVD 1:開啟PVD
- CSBF[3]:清除待機(jī)位,始終讀出為0。 0:無功效 1:清除SBF待機(jī)位(寫)
- CWUF[2]:清除喚醒位,始終讀出為0。 0:無功效 1:2個系統(tǒng)時鐘周期后清除WUF喚醒位(寫)
- PDDS[1]:掉電深睡眠,與LPDS位協(xié)同操作。 0:當(dāng)CPU進(jìn)入深睡眠時進(jìn)入停機(jī)模式,調(diào)壓器的狀態(tài)由LPDS位控制。 1:CPU進(jìn)入深睡眠時進(jìn)入待機(jī)模式。
- LPDS[0]:深睡眠下的低功耗。PDDS=0時,與PDDS位協(xié)同操作 0:在停機(jī)模式下電壓調(diào)壓器開啟 1:在停機(jī)模式下電壓調(diào)壓器處于低功耗模式
本文引用地址:
http://m.butianyuan.cn/article/201611/321195.htm電源控制寄存器(PWR_CR),該寄存器的各位描述如下:
低9位有效的寄存器,只用了4位,其他位保留
- EWUP[8]:使能WKUP引腳 ,在系統(tǒng)復(fù)位時清除這一位。
- PVDO[2]:PVD輸出 ,當(dāng)PVD被PVDE位使能后該位才有效。
- SBF[1]:待機(jī)標(biāo)志。
- WUF[0]:喚醒標(biāo)志。
待機(jī)函數(shù)實現(xiàn):(參見 system.c文件)
01 | //THUMB指令不支持匯編內(nèi)聯(lián) |
02 | //采用如下方法實現(xiàn)執(zhí)行匯編指令WFI |
11 | // var = 0 ,設(shè)定為睡眠模式 |
12 | // var = 1 ,設(shè)定為停機(jī)模式,電流消耗在20uA左右 |
13 | // var = 2 ,設(shè)定為待機(jī)模式,電流消耗在2uA左右 |
15 | voidSys_Standby(u8 var) |
18 | RCC->APB1ENR |= 1<<28;//使能電源時鐘 |
22 | case0:{break; }//WFI進(jìn)入睡眠模式 |
24 | case1:{//PDDS+LPDS+SLEEPDEEP+WFI進(jìn)入停機(jī)模式 |
26 | SCB->SCR |= 1<<2;//使能SLEEPDEEP位 (SYS->CTRL) |
27 | PWR->CR |= 1<<0;//LPDS置位 |
28 | PWR->CR |= 1<<1;//PDDS置位 |
32 | case2:{//PDDS+SLEEPDEEP+WFI進(jìn)入待機(jī)模式 |
34 | SCB->SCR |= 1<<2;//使能SLEEPDEEP位 (SYS->CTRL) |
40 | PWR->CR |= 1<<2;//清除Wake-up 標(biāo)志 |
41 | PWR->CSR |= 1<<8;//允許寫入RTC和BKP寄存器 |
42 | WFI_SET();//執(zhí)行WFI指令 |
48 | voidSys_Soft_Reset(void) |
50 | SCB->AIRCR =0X05FA0000|(u32)0x04; |
代碼如下:(system.h 和stm32f10x_it.h等相關(guān)代碼參照stm32 直接操作寄存器開發(fā)環(huán)境配置)
User/main.c
09 | #define PWR_MODE_Sleep 0 //開啟睡眠模式 |
11 | #define PWR_MODE_STOP 1 //開啟停機(jī)模式 |
13 | #define PWR_MODE_STANDBY 0 //開啟待機(jī)模式 |
22 | Rcc_Init(9);//系統(tǒng)時鐘設(shè)置 |
24 | Exti_Init(GPIO_A,0,FTIR);//設(shè)置PA1為下降沿觸發(fā),參數(shù)GPIO_x 和 FTIR 在system.h中有定義 |
26 | Nvic_Init(0,0,EXTI0_IRQChannel,0);//設(shè)置外部中斷 |
38 | #if PWR_MODE_Sleep //睡眠模式,外部中斷喚醒后會復(fù)位 |
42 | #elif PWR_MODE_STOP //停機(jī)模式,外部中斷喚醒,喚醒后復(fù)位 |
46 | #elif PWR_MODE_STANDBY //待機(jī)模式,由獨立看門狗喚醒,喚醒后會初始化,LED閃爍5次后,暗一段時間 |
48 | Iwdg_Init(3,2000);//設(shè)置為1.6s內(nèi)不喂狗復(fù)位,使用獨立看門狗喚醒,喚醒后復(fù)位 |
55 | while(j--){//這段程序用于檢驗喚醒后是否會繼續(xù)運(yùn)行后面的程序,還是會導(dǎo)致復(fù)位 |
67 | RCC->APB2ENR|=1<<2;//使能PORTA時鐘 |
69 | GPIOA->CRL&=0x0000FFFF;// PA0~3設(shè)置為浮空輸入,PA4~7設(shè)置為推挽輸出 |
70 | GPIOA->CRL|=0x33334444; |
User/stm32f10x_it.c
01 | #include "stm32f10x_it.h" |
10 | voidEXTI0_IRQHandler(void) |
13 | EXTI->PR = 1<<0;//清除中斷標(biāo)志位 |
待機(jī)相關(guān)代碼參見 system.c文件中
技術(shù)專區(qū)
評論