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     
View Code
 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
View Code
  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 }
View Code

 

7、工程下载:

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

 

posted @ 2015-06-01 19:22  如风轻逸  阅读(1354)  评论(0编辑  收藏  举报