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