13、低功耗模式

1、低功耗模式

在系统或电源复位以后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。

2、STM32F10xxx有三种低功耗模式:
●  睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)
●  停止模式(所有的时钟都已停止)
●  待机模式(1.8V电源关闭)
此外,在运行模式下,可以通过以下方式中的一种降低功耗:
●  降低系统时钟
●  关闭APB和AHB总线上未被使用的外设时钟。

3、外部时钟的控制

在运行模式下,任何时候都可以通过停止为外设和内存提供时钟(HCLK和PCLKx)来减少功耗。为了在睡眠模式下更多地减少功耗,可在执行WFI或WFE指令前关闭所有外设的时钟。
 通过设置AHB外设时钟使能寄存器(RCC_AHBENR)、APB2外设时钟使能寄存器(RCC_APB2ENR)和APB1外设时钟使能寄存器(RCC_APB1ENR)来开关各个外设模块的时钟。

4、待机模式

待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电

5、退出待机模式

当一个外部复位(NRST引脚)、IWDG复位、WKUP引脚上的上升沿或RTC闹钟事件的上升沿发生时,微控制器从待机模式退出。从待机唤醒后,除了 电源控制/状态寄存器(PWR_CSR),所有寄存器被复位。从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚、读取复位向量等)。电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。

待机模式下的输入/输出端口状态在待机模式下,所有的I/O引脚处于高阻态,除了以下的引脚: ●  复位引脚(始终有效) ●  当被设置为防侵入或校准输出时的TAMPER引脚 ●  被使能的唤醒引脚

6、代码例程:

  1 /*************************************************************************************************************************************
  2 *
  3 *  文件名称:main.c
  4 *  文件功能:主函数文件
  5 *
  6 ***************************************************************************************************************************************/
  7
  8 #include "pbdata.h"//调用自定义公共函数库
  9
 10
 11 /*********************************************************************************
 12 *
 13 * 初始化操作
 14 *
 15 *********************************************************************************/
 16 void RCC_Configuration(void);//系统时钟初始化函数声明
 17 void GPIO_Configuration(void);//GPIO初始化函数声明
 18 void NVIC_Configuration(void);//中断优先级配置函数声明
 19 void USART_Configuration(void);//串口配置函数声明
 20 void  Sys_Standby(void);//进入待机模式+9
 21
 22
 23
 24
 25 /********************************************************************************
 26 *
 27 *  函数名称:main(void)
 28 *  函数功能:主函数
 29 *  函数说明:不能用void定义主函数
 30 *
 31 ********************************************************************************/
 32 int main(void)//void不能void定义主函数
 33 {
 34
 35     RCC_Configuration();    //系统时钟初始化
 36
 37     GPIO_Configuration();//端口初始化
 38
 39     USART_Configuration();//串口配置
 40
 41     NVIC_Configuration();//中断优先级配置
 42
 43
 44
 45     while(1)
 46     {
 47         printf("liubo\n");
 48
 49         delay_ms(3000);
 50
 51         printf("last:5s\n");//先倒计时
 52     delay_ms(1000);
 53     printf("last:4s\n");
 54     delay_ms(1000);
 55     printf("last:3s\n");
 56     delay_ms(1000);
 57     printf("last:2s\n");
 58     delay_ms(1000);
 59     printf("last:1s\n");
 60     delay_ms(1000);
 61     printf("enter Standby state:\n");//进入待机状态
 62     Sys_Standby();
 63
 64     }
 65
 66 }
 67
 68
 69
 70
 71 /********************************************************************************
 72 *
 73 *  函数名称:RCC_Configuration(void)
 74 *  函数功能:系统时钟高初始化函数
 75 *
 76 ********************************************************************************/
 77     void RCC_Configuration(void)//系统时钟高初始化函数
 78   {
 79
 80     SystemInit();//系统初始化
 81     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//串口对应GPIO时钟使能
 82         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口时钟使能
 83         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//引脚复用
 84
 85     }
 86
 87
 88
 89 /*******************************************************************************
 90 *
 91 * 函数名称:GPIO_Configuration(void)
 92 * 函数功能:GPIO初始化函数
 93 *
 94 ********************************************************************************/
 95
 96     void GPIO_Configuration(void)//GPIO初始化函数
 97   {
 98
 99
100 /*串口引脚配置*/
101         GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量
102
103 /*输出引脚配置*/
104         /*结构体变量赋值*/
105       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;////引脚配置TX
106       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
107         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//发送要配置成复用推挽输出
108         /*对应的GPIO初始化*/
109       GPIO_Init(GPIOA,&GPIO_InitStructure);
110
111
112 /*输入引脚配置*/
113         /*结构体变量赋值*/
114       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;////引脚配置RX
115         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收引脚配置成浮空输入
116         /*对应的GPIO初始化*/
117       GPIO_Init(GPIOA,&GPIO_InitStructure);
118
119
120   }
121
122
123 /****************************************************************************
124 *
125 *  函数名称:NVIC_Configuration(void)
126 *  函数功能:配置中断优先级
127 *
128 ****************************************************************************/
129
130 void NVIC_Configuration(void)
131 {
132   NVIC_InitTypeDef NVIC_InitStructure; //定义一个优先级配置结构体变量
133
134   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//分组
135
136   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
137   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢断优先级
138   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
139   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
140
141   NVIC_Init(&NVIC_InitStructure);//初始化
142 }
143
144
145 /*********************************************************************************
146 *
147 *  函数名称:
148 *  函数功能:串口配置函数
149 *
150 *********************************************************************************/
151 void USART_Configuration(void)
152 {
153 /*定义串口配置结构体变量*/
154         USART_InitTypeDef USART_InitStructure;//定义一个串口配置结构体变量
155
156
157 /*结构体变量赋值*/
158     USART_InitStructure.USART_BaudRate = 9600;//波特率9600
159     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位宽,8位
160     USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1
161     USART_InitStructure.USART_Parity = USART_Parity_No;//不奇偶校验
162     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//流控禁止
163     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送使能
164
165
166 /*发送串口配置初始化*/
167     USART_Init(USART1, &USART_InitStructure);
168
169
170 /*打开串口接收中断*/
171       USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//当接收到数据时,会产生中断
172
173
174 /*打开串口*/
175     USART_Cmd(USART1,ENABLE);//串口使能,打开
176
177 /*清空中断标志位*/
178     USART_ClearFlag(USART1,USART_FLAG_TC);
179 }
180
181
182
183
184
185 /********************************************************************************
186 *
187 *  函数名称:Sys_Standby(void)
188 *  函数功能:进入待机模式函数
189 *
190 ********************************************************************************/
191
192 //待机模式
193 void  Sys_Standby(void)
194 {
195   NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,ENABLE);//选择待机模式
196
197   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR外设时钟
198
199   PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚
200
201   PWR_EnterSTANDBYMode();//进入待机模式
202
203 }
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232     

 1 /*pbdata.h*/
 2 /***************************************************************************************************
 3 *
 4 * 文件名称:pbdata.h
 5 * 文件功能:自定义的函数和全局变量的声明头文件
 6 *
 7 ***************************************************************************************************/
 8
 9 #ifndef _pbdata_H
10 #define _pbdata_H
11
12
13
14
15
16 /********************************************************************
17 *
18 *  调用的头文件放在这里
19 *
20 ********************************************************************/
21 #include "stm32f10x.h"
22
23
24 #include "stm32f10x_rcc.h"
25 #include "stm32f10x_gpio.h"
26 #include "misc.h"
27 #include "stm32f10x_adc.h"
28 #include "stm32f10x_bkp.h"
29 #include "stm32f10x_can.h"
30 #include "stm32f10x_cec.h"
31 #include "stm32f10x_dac.h"
32 #include "stm32f10x_dbgmcu.h"
33 #include "stm32f10x_dma.h"
34 #include "stm32f10x_exti.h"
35 #include "stm32f10x_flash.h"
36 #include "stm32f10x_fsmc.h"
37 #include "stm32f10x_i2c.h"
38 #include "stm32f10x_iwdg.h"
39 #include "stm32f10x_pwr.h"
40 #include "stm32f10x_rtc.h"
41 #include "stm32f10x_sdio.h"
42 #include "stm32f10x_spi.h"
43 #include "stm32f10x_tim.h"
44 #include "stm32f10x_usart.h"
45 #include "stm32f10x_wwdg.h"
46
47
48 #include "stdio.h"
49
50
51
52
53 /********************************************************************
54 *
55 *  自定义全局变量声明
56 *
57 ********************************************************************/
58 extern u8 dt;
59
60
61
62
63
64 /********************************************************************
65 *
66 *  自定义全函数声明
67 *
68 ********************************************************************/
69 void delay(u32 nCount);
70 void delay_us(u32 nus);
71 void delay_ms(u16 nms);
72 int fputc(int ch,FILE *F);
73
74
75
76 #endif

  1 /****************************************************************************************************************
  2 *
  3 * 文件名称:pbdata.c
  4 * 文件功能:自定义函数或者全局变量的初始化
  5 *
  6 ****************************************************************************************************************/
  7
  8 /*头文件声明*/
  9 #include "pbdata.h"
 10
 11
 12
 13
 14 /********************************************************************************************
 15 *
 16 * 自定义全局变量
 17 *
 18 ********************************************************************************************/
 19 u8 dt=0;
 20
 21
 22
 23
 24
 25 /******************************************************************************************
 26 *
 27 * 自定义函数
 28 *
 29 ******************************************************************************************/
 30
 31
 32
 33 /**************************************************
 34 *
 35 *  函数名称:delay_us(u32 nus)
 36 *  函数功能:微秒延时函数
 37 *  输入参数:输入值为延时us
 38 *
 39 ***************************************************/
 40 void delay_us(u32 nus)
 41 {
 42     u32 temp;
 43     SysTick->LOAD = 9*nus;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9次
 44     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
 45     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
 46
 47     do
 48     {
 49           temp=SysTick->CTRL;//标志位,等到一直减到0
 50          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
 51
 52     SysTick->CTRL=0x00; //关闭计数器
 53     SysTick->VAL =0X00; //清空计数器
 54 }
 55
 56
 57
 58
 59
 60
 61
 62 /***************************************************
 63 *
 64 * 函数名称:delay_ms(u16 nms)
 65 * 函数功能:毫秒级延时
 66 * 输入参数:输入值位延时ms
 67 *
 68 ****************************************************/
 69 void delay_ms(u16 nms)
 70 {
 71     u32 temp;
 72     SysTick->LOAD = 9000*nms;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9000次
 73     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
 74     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
 75
 76     do
 77     {
 78           temp=SysTick->CTRL;//标志位,等到一直减到0
 79          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
 80
 81     SysTick->CTRL=0x00; //关闭计数器
 82     SysTick->VAL =0X00; //清空计数器
 83 }
 84
 85
 86
 87 /****************************************************
 88 *
 89 * 重定义printf函数部分
 90 *
 91 ****************************************************/
 92 int fputc(int ch,FILE *F)
 93 {
 94
 95     USART_SendData(USART1,(u8)ch);
 96
 97     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成,判断标志位
 98
 99     return ch;
100 }

7、工程下载:

http://download.csdn.net/detail/a1181803348/8761503

时间: 2024-09-30 11:33:08

13、低功耗模式的相关文章

MSP430 G2553 低功耗模式LPMx

MSP430除了正常运行时的active模式外,还支持五种低功耗模式(Low-power mode),分别为LPM0.LPM1.LPM2.LPM3.LPM4,由状态寄存器中的CPUOFF.OSCOFF.SCG0.SCG1比特位设置. 六种模式对应的时钟状态为: 其中,LPM3.LPM4比较常用,对低功耗的贡献也最大.LPM3模式关闭了DCO.CPU,从而MCLK.SMCLK无法工作,ACLK(来源为LFXT1或VLO)可以正常工作并用于系统的定时唤醒.LPM4模式下所有内部时钟信号都关闭,系统只

1_CC2530 Zstack 2.5.1a 低功耗模式

最近在研究CC250的低功耗模式,从官方的文档Measuring Power Consumption of CC2530 With Z-Stack.PDF文档中大概了解下需要配置的内容,结合自己测试的经验,大概介绍下.使用Zstack的版本如下: ZigBee 2007 Release Version 2.5.1a April 25, 2012 CC530的功耗模式情况如下: (1)LITE Sleep,我们所说的PM2模式,功耗在ma级别,会被任务定时器或者外部中断唤醒(按键中断) (2)De

STM32低功耗模式与烟雾报警器触发信号电路设计

1.STM32的3种低功耗模式 STM32有3种低功耗模式,分别是睡眠模式.停机模式和待机模式. 2.STM32在不同模式下的电流消耗 a.工作模式  消耗电流在27mA至36mA之间. b.睡眠模式  消耗电流在5.5mA至14.4mA之间. c.停机模式和待机模式  停机模式消耗电流在15uA  待机模式在5uA 3.各种低功耗模式下的唤醒条件 从上面的图表1可以看到,在睡眠模式下和待机模式下可以利用外部中断唤醒,而停机模式下只能通过以下4种方式唤醒: a.WAKEUP引脚的上升沿 b.RT

STM32低功耗模式实践

STM32低功耗模式实践 STM32一共有三种低功耗模式,睡眠模式.停止模式以及待机模式. 其中,睡眠模式时内核停止运行,但外设仍在工作,所有外设的时钟不会被关闭. 停止模式,除了Cortex-M3内核停止外,所有外设时钟也被关闭,可以选择使能内部时钟,SRAM和寄存器内容被保留,IO口保持为进入睡眠前的状态. 待机模式时,所有1.8V电源部分全部断电,SRAM和寄存器内容被丢失,这最为省电的一种方式,但是唤醒后就丢失了记忆. 本文选择使用停止模式,要低功耗,又要唤醒后继续运行,那stm32低功

android wifi SWOL低功耗模式

1 睡眠模式RX代码流程 ar_wal_rx_patch.c::patch_rx_process_recv_status//调用rx_ctxt->data_ind_handler -> ar_wal_rx_common_patch.c::patch_rx_install_data_ind -> 2 低功耗模式代码流程 3 添加的代码patch

redis 4.0.13 -- 哨兵模式

1.前提 本文使用的是redis-4.0.13.tar.gz版本. redis各版本下载地址:http://download.redis.io/releases/ , 下载与安装单个redis查看我的另一篇<redis 4.0.13 -- 单个redis下载.安装.启动.验证>的“1.下载与初始化redis” 按照我之前的文章<redis 4.0.13 -- 主从模式>先在安装好主从. 但是主从模式有个缺点,如果主挂了,从没办法知道,所以需要哨兵.但是如果这个哨兵也挂了呢?所以需要

redis 4.0.13 -- 主从模式

1.前提 本文使用的是redis-4.0.13.tar.gz版本. redis各版本下载地址:http://download.redis.io/releases/, 下载与安装单个redis查看我的另一篇<redis 4.0.13 -- 单个redis下载.安装.启动.验证>的“1.下载与初始化redis” 按照我之前的文章<redis 4.0.13 -- 单个redis下载.安装.启动.验证>先在两个虚拟机上分别安装一个redis 2.修改redis.conf配置 修改其中一个你

设计模式13——访问者模式

访问者模式中,有一个数据体,添加了各个访问对象.这些访问对象在不同的状态时,会有不同的反应.这种模式中,对象与状态相分离,互不干扰. Visitor.h内容 1 #ifndef Visitor_H_H 2 #define Visitor_H_H 3 4 5 #include <iostream> 6 #include <vector> 7 using namespace std; 8 9 class State 10 { 11 public: 12 virtual void get

设计模式(13)-----建造者模式

建造者模式(builder) 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. UML图 成员介绍 抽象建造者(Builder)角色:给 出一个抽象接口,以规范产品对象的各个组成成分的建造.一般而言,此接口独立于应用程序的商业逻辑.模式中直接创建产品对象的是具体建造者 (ConcreteBuilder)角色.具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildPart1和 buildPart2),另一种是返还结构方法(retrieveResul