新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > stm32 低功耗設(shè)計[操作寄存器+庫函數(shù)]

stm32 低功耗設(shè)計[操作寄存器+庫函數(shù)]

作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
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://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ù)實(shí)現(xiàn):(參見 system.c文件)

01//THUMB指令不支持匯編內(nèi)聯(lián)
02//采用如下方法實(shí)現(xiàn)執(zhí)行匯編指令WFI
03__asmvoidWFI_SET(void)
04{
05WFI;
06}
07
08
09//進(jìn)入待機(jī)模式
10//參數(shù)說明:
11// var = 0 ,設(shè)定為睡眠模式
12// var = 1 ,設(shè)定為停機(jī)模式,電流消耗在20uA左右
13// var = 2 ,設(shè)定為待機(jī)模式,電流消耗在2uA左右
14
15voidSys_Standby(u8 var)
16{
17
18RCC->APB1ENR |= 1<<28;//使能電源時鐘
19
20switch(var)
21{
22case0:{break; }//WFI進(jìn)入睡眠模式
23
24case1:{//PDDS+LPDS+SLEEPDEEP+WFI進(jìn)入停機(jī)模式
25
26SCB->SCR |= 1<<2;//使能SLEEPDEEP位 (SYS->CTRL)
27PWR->CR |= 1<<0;//LPDS置位
28PWR->CR |= 1<<1;//PDDS置位
29break;
30}
31
32case2:{//PDDS+SLEEPDEEP+WFI進(jìn)入待機(jī)模式
33
34SCB->SCR |= 1<<2;//使能SLEEPDEEP位 (SYS->CTRL)
35PWR->CR|=1<<1;//PDDS置位
36break;
37}
38}
39
40PWR->CR |= 1<<2;//清除Wake-up 標(biāo)志
41PWR->CSR |= 1<<8;//允許寫入RTC和BKP寄存器
42WFI_SET();//執(zhí)行WFI指令
43}
44
45
46//系統(tǒng)軟復(fù)位
47
48voidSys_Soft_Reset(void)
49{
50SCB->AIRCR =0X05FA0000|(u32)0x04;
51}
代碼如下:(system.h 和stm32f10x_it.h等相關(guān)代碼參照stm32 直接操作寄存器開發(fā)環(huán)境配置)
User/main.c
01#include
02#include "system.h"
03#include "wdg.h"
04#include "exti.h"
05
06#define LED1 PAout(4)
07#define LED2 PAout(5)
08
09#define PWR_MODE_Sleep 0 //開啟睡眠模式
10
11#define PWR_MODE_STOP 1 //開啟停機(jī)模式
12
13#define PWR_MODE_STANDBY 0 //開啟待機(jī)模式
14
15
16voidGpio_Init(void);
17
18intmain(void)
19{
20u32 i= 10,j=10;
21
22Rcc_Init(9);//系統(tǒng)時鐘設(shè)置
23
24Exti_Init(GPIO_A,0,FTIR);//設(shè)置PA1為下降沿觸發(fā),參數(shù)GPIO_x 和 FTIR 在system.h中有定義
25
26Nvic_Init(0,0,EXTI0_IRQChannel,0);//設(shè)置外部中斷
27
28Gpio_Init();
29
30while(i--){
31
32LED1 = !LED1;
33
34delay(30000);//延時30ms
35
36}
37
38#if PWR_MODE_Sleep //睡眠模式,外部中斷喚醒后會復(fù)位
39
40Sys_Standby(0);
41
42#elif PWR_MODE_STOP //停機(jī)模式,外部中斷喚醒,喚醒后復(fù)位
43
44Sys_Standby(1);
45
46#elif PWR_MODE_STANDBY //待機(jī)模式,由獨(dú)立看門狗喚醒,喚醒后會初始化,LED閃爍5次后,暗一段時間
47
48Iwdg_Init(3,2000);//設(shè)置為1.6s內(nèi)不喂狗復(fù)位,使用獨(dú)立看門狗喚醒,喚醒后復(fù)位
49
50Sys_Standby(2);
51
52#endif
53
54
55while(j--){//這段程序用于檢驗(yàn)喚醒后是否會繼續(xù)運(yùn)行后面的程序,還是會導(dǎo)致復(fù)位
56
57LED2 = !LED2;
58
59delay(10000);//延時10ms
60
61}
62}
63
64
65voidGpio_Init(void)
66{
67RCC->APB2ENR|=1<<2;//使能PORTA時鐘
68
69GPIOA->CRL&=0x0000FFFF;// PA0~3設(shè)置為浮空輸入,PA4~7設(shè)置為推挽輸出
70GPIOA->CRL|=0x33334444;
71
72}
User/stm32f10x_it.c
01#include "stm32f10x_it.h"
02#include "system.h"
03
04#define LED1 PAout(4)
05#define LED2 PAout(5)
06#define LED3 PAout(6)
07#define LED4 PAout(7)
08
09
10voidEXTI0_IRQHandler(void)
11{
12LED4 = !LED4;
13EXTI->PR = 1<<0;//清除中斷標(biāo)志位
14}

待機(jī)相關(guān)代碼參見 system.c文件中


上一頁 1 2 下一頁

評論


技術(shù)專區(qū)

關(guān)閉