stm32 低功耗设计[操作寄存器+库函数]
时间: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:在停机模式下电压调压器处于低功耗模式
电源控制寄存器(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; |
stm32低功耗设计操作寄存器库函 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
