新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > stm32 低功耗设计[操作寄存器+库函数]

stm32 低功耗设计[操作寄存器+库函数]

作者: 时间:2016-11-25 来源:网络 收藏
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:在停机模式下电压调压器处于低功耗模式

本文引用地址:https://www.eepw.com.cn/article/201611/321195.htm
电源控制寄存器(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{
05WFI;
06}
07
08
09//进入待机模式
10//参数说明:
11// var = 0 ,设定为睡眠模式
12// var = 1 ,设定为停机模式,电流消耗在20uA左右
13// var = 2 ,设定为待机模式,电流消耗在2uA左右
14
15voidSys_Standby(u8 var)
16{
17
18RCC->APB1ENR |= 1<<28;//使能电源时钟
19
20switch(var)
21{
22case0:{break; }//WFI进入睡眠模式
23
24case1:{//PDDS+LPDS+SLEEPDEEP+WFI进入停机模式
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进入待机模式
33
34SCB->SCR |= 1<<2;//使能SLEEPDEEP位 (SYS->CTRL)
35PWR->CR|=1<<1;//PDDS置位
36break;
37}
38}
39
40PWR->CR |= 1<<2;//清除Wake-up 标志
41PWR->CSR |= 1<<8;//允许写入RTC和BKP寄存器
42WFI_SET();//执行WFI指令
43}
44
45
46//系统软复位
47
48voidSys_Soft_Reset(void)
49{
50SCB->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
16voidGpio_Init(void);
17
18intmain(void)
19{
20u32 i= 10,j=10;
21
22Rcc_Init(9);//系统时钟设置
23
24Exti_Init(GPIO_A,0,FTIR);//设置PA1为下降沿触发,参数GPIO_x 和 FTIR 在system.h中有定义
25
26Nvic_Init(0,0,EXTI0_IRQChannel,0);//设置外部中断
27
28Gpio_Init();
29
30while(i--){
31
32LED1 = !LED1;
33
34delay(30000);//延时30ms
35
36}
37
38#if PWR_MODE_Sleep //睡眠模式,外部中断唤醒后会复位
39
40Sys_Standby(0);
41
42#elif PWR_MODE_STOP //停机模式,外部中断唤醒,唤醒后复位
43
44Sys_Standby(1);
45
46#elif PWR_MODE_STANDBY //待机模式,由独立看门狗唤醒,唤醒后会初始化,LED闪烁5次后,暗一段时间
47
48Iwdg_Init(3,2000);//设置为1.6s内不喂狗复位,使用独立看门狗唤醒,唤醒后复位
49
50Sys_Standby(2);
51
52#endif
53
54
55while(j--){//这段程序用于检验唤醒后是否会继续运行后面的程序,还是会导致复位
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设置为浮空输入,PA4~7设置为推挽输出
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;//清除中断标志位
14}

待机相关代码参见 system.c文件中


上一页 1 2 下一页

评论


技术专区

关闭