您的位置 首页 FPGA

stm32 低功耗规划[操作寄存器+库函数]

stm32的低功耗模式有三种:睡眠模式(内核停止,外设运行)停机模式(所有时钟都停止)待机模式(18V内核电源也关闭)在这三种模式中,最

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部