stm32的低功耗形式有三种:
- 睡觉形式(内核中止,外设运转)
- 停机形式(一切时钟都中止)
- 待机形式(1.8V内核电源也封闭)
在这三种形式中,最低功耗的是待机形式,在此形式下,最低只需要2uA左右的电流。整个1.8V供电区被断电,PLL、HSI、HSE振荡器都被封闭。SRAM和寄存器内容丢掉。停机形式是次低功耗的的,其典型的电流损耗在20uA左右。最终便是睡觉形式。
stm32低功耗一览表

这三种低功耗形式,唤醒后程序都会初始化运转。在比如中做了一番证明,成果如此。
直接操作寄存器
进入待机形式的通用过程,其间涉及到2个寄存器,也便是电源操控寄存器(PWR_CR)和电源操控/状况寄存器(PWR_CSR)。
电源操控寄存器(PWR_CR),该寄存器的各位描绘如下:
这是一个低9位有用的寄存器。
- DBP[8]:撤销后备区域的写维护 位 8 在复位后,RTC和后备寄存器处于被维护状况以防意外写入。0:制止写入RTC和后备寄存器 1:答应写入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:敞开PVD
- CSBF[3]:铲除待机位,一直读出为0。 0:无成效 1:铲除SBF待机位(写)
- CWUF[2]:铲除唤醒位,一直读出为0。 0:无成效 1:2个体系时钟周期后铲除WUF唤醒位(写)
- PDDS[1]:掉电深睡觉,与LPDS位协同操作。 0:当CPU进入深睡觉时进入停机形式,调压器的状况由LPDS位操控。 1:CPU进入深睡觉时进入待机形式。
- LPDS[0]:深睡觉下的低功耗。PDDS=0时,与PDDS位协同操作 0:在停机形式下电压调压器敞开 1:在停机形式下电压调压器处于低功耗形式
电源操控寄存器(PWR_CR),该寄存器的各位描绘如下:
低9位有用的寄存器,只用了4位,其他位保存
- EWUP[8]:使能WKUP引脚 ,在体系复位时铲除这一位。
- PVDO[2]:PVD输出 ,当PVD被PVDE位使能后该位才有用。
- SBF[1]:待机标志。
- WUF[0]:唤醒标志。
待机函数完成:(拜见 system.c文件)
01 | //THUMB指令不支持汇编内联 |
02 | //选用如下办法完成履行汇编指令WFI |
03 | __asmvoidWFI_SET(void) |
04 | { |
05 | WFI; |
06 | } |
07 |
08 |
09 | //进入待机形式 |
10 | //参数阐明: |
11 | // var = 0 ,设定为睡觉形式 |
12 | // var = 1 ,设定为停机形式,电流耗费在20uA左右 |
13 | // var = 2 ,设定为待机形式,电流耗费在2uA左右 |
14 |
15 | voidSys_Standby(u8 var) |
16 | { |
17 |
18 | RCC->APB1ENR |= 1<<28;//使能电源时钟 |
19 |
20 | switch(var) |
21 | { |
22 | case0:{break; }//WFI进入睡觉形式 |
23 |
24 | case1:{//PDDS+LPDS+SLEEPDEEP+WFI进入停机形式 |
25 |
26 | SCB->SCR |= 1<<2;//使能SLEEPDEEP位 (SYS->CTRL) |
27 | PWR->CR |= 1<<0;//LPDS置位 |
28 | PWR->CR |= 1<<1;//PDDS置位 |
29 | break; |
30 | } |
31 |
32 | case2:{//PDDS+SLEEPDEEP+WFI进入待机形式 |
33 |
34 | SCB->SCR |= 1<<2;//使能SLEEPDEEP位 (SYS->CTRL) |
35 | PWR->CR|=1<<1;//PDDS置位 |
36 | break; |
37 | } |
38 | } |
39 |
40 | PWR->CR |= 1<<2;//铲除Wake-up 标志 |
41 | PWR->CSR |= 1<<8;//答应写入RTC和BKP寄存器 |
42 | WFI_SET();//履行WFI指令 |
43 | } |
44 |
45 |
46 | //体系软复位 |
47 |
48 | voidSys_Soft_Reset(void) |
49 | { |
50 | SCB->AIRCR =0X05FA0000|(u32)0x04; |
51 | } |
代码如下:(system.h 和stm32f10x_it.h等相关代码参照stm32 直接操作寄存器开发环境装备)
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 //敞开停机形式 |
12 |
13 | #define PWR_MODE_STANDBY 0 //敞开待机形式 |
14 |
15 |
16 | voidGpio_Init(void); |
17 |
18 | intmain(void) |
19 | { |
20 | u32 i= 10,j=10; |
21 |
22 | Rcc_Init(9);//体系时钟设置 |
23 |
24 | Exti_Init(GPIO_A,0,FTIR);//设置PA1为下降沿触发,参数GPIO_x 和 FTIR 在system.h中有界说 |
25 |
26 | Nvic_Init(0,0,EXTI0_IRQChannel,0);//设置外部中止 |
27 |
28 | Gpio_Init(); |
29 |
30 | while(i–){ |
31 |
32 | LED1 = !LED1; |
33 |
34 | delay(30000);//延时30ms |
35 |
36 | } |
37 |
38 | #if PWR_MODE_Sleep //睡觉形式,外部中止唤醒后会复位 |
39 |
40 | Sys_Standby(0); |
41 |
42 | #elif PWR_MODE_STOP //停机形式,外部中止唤醒,唤醒后复位 |
43 |
44 | Sys_Standby(1); |
45 |
46 | #elif PWR_MODE_STANDBY //待机形式,由独立看门狗唤醒,唤醒后会初始化,LED闪耀5次后,暗一段时间 |
47 |
48 | Iwdg_Init(3,2000);//设置为1.6s内不喂狗复位,运用独立看门狗唤醒,唤醒后复位 |
49 |
50 | Sys_Standby(2); |
51 |
52 | #endif |
53 |
54 |
55 | while(j–){//这段程序用于查验唤醒后是否会持续运转后边的程序,仍是会导致复位 |
56 |
57 | LED2 = !LED2; |
58 |
59 | delay(10000);//延时10ms |
60 |
61 | } |
62 | } |
63 |
64 |
65 | voidGpio_Init(void) |
66 | { |
67 | RCC->APB2ENR|=1<<2;//使能PORTA时钟 |
68 |
69 | GPIOA->CRL&=0x0000FFFF;// PA0~3设置为浮空输入,PA4~7设置为推挽输出 |
70 | GPIOA->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 |
10 | voidEXTI0_IRQHandler(void) |
11 | { |
12 | LED4 = !LED4; |
13 | EXTI->PR = 1<<0;//铲除中止标志位 |
14 | } |
待机相关代码拜见 system.c文件中
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/258972.html