stm32之电源管理(实现低功耗)

2019-08-20来源: eefocus关键字:stm32  电源管理  低功耗

前言:STM32F10xxx系列产品都有电源管理模块,芯片功耗会影响到一个产品的续航能力;比如在一些终端传感器场合里,为了减轻后期的维护投入,要求长期工作时间较长,更需要合理的芯片功耗管理。芯片自带几种运行模式,包括正常模式、睡眠模式、停止模式、待机模式。越往后,芯片的功耗越低,但能执行功能就越少。低功耗的电源管理策略就是在芯片不需要对外界响应的时候进入低功耗模式,而当外界条件满足的时候,退出低功耗模式(唤醒),正常执行处理工作。下面对其模式之间的转换和各个模式下的芯片内部的运转情况等一探究竟。


写代码前要先了解芯片的特性及工作原理,难免会先阅读一些长长的文档。下面核心讲解一些要点。


1.硬件原理

下图是芯片的电源框架:


图左边7个电压点对应芯片的7个引脚,在芯片电路原理图能找到对应的引脚。


 、:是ADC转换器的参考电压,有些芯片没有这连个引脚,内部已经把他们接到、了。


、:是ADC转换器的供电电源,独立电源供电是为了过滤和屏蔽来自印刷电路板上的毛刺干扰,提高转换的精确度。(也可以直接连到、)。


、:STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源。


:使用电池或其他电源连接到VBAT脚上,当VDD断电时,可以保存备份寄存器的内容和维持RTC的


功能。(如果没有外部电池,好像不接也可以,但是数据手册说必须接到)。


电池备份区域:


当备份区域由VDD(内部模拟开关连到VDD)供电时,下述功能可用:


    ● PC14和PC15可以用于GPIO或LSE(低速外部时钟)引脚


    ● PC13可以作为通用I/O口、TAMPER引脚、RTC校准时钟、RTC闹钟或秒输出


当后备区域由VBAT供电时(VDD消失后模拟开关连到VBAT),可以使用下述功能:


    ● PC14和PC15只能用于LSE(低速外部时钟)引脚


    ● PC13可以作为TAMPER引脚、RTC闹钟或秒输出


电压调节器:


复位后调节器总是使能的。根据应用方式它以3种不同的模式工作。


     ● 运转模式:调节器以正常功耗模式提供1.8V电源(内核,内存和外设)。


     ● 停止模式:调节器以低功耗模式提供1.8V电源,以保存寄存器和SRAM的内容。


     ● 待机模式:调节器停止供电。除了备用电路和备份域外,寄存器和SRAM的内容全部丢失。


2.低功耗模式

STM32F10xxx有三种低功耗模式:


     ● 睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)


     ● 停止模式(所有的时钟都已停止)


     ● 待机模式(1.8V电源关闭)


此外,在运行模式下,可以通过以下方式中的一种降低功耗:


● 降低系统时钟


● 关闭APB和AHB总线上未被使用的外设时钟。


注意:在睡眠模式、停止模式及待机模式中,若备份区域电源正常供电,备份区域的RTC都可以正常运行、备份区域内的寄存器及备份区域内的SRAM数据会被保存,不受功耗模式影响。


3.睡眠模式实验

下面代码利用编译器内置函数__WFI()进入睡眠,任何中断将退出睡眠(实验使用串口中断和外部中断)。利用串口将芯片状态信息发送出来。可以先把代码复制到工程编译下载,实验现象通过串口上位机观察,如果有可调电源的话,可以对比正常工作和睡眠模式下的电流大小,正常来说睡眠模式下功率低,那么电流会比正常工作下低。下面程序并不复杂,程序进入while循环延时一段时间就会进入睡眠状态,利用上位机向串口发送数据或者将PA.0引脚接电源都可产生中断,从而退出睡眠模式。


#include "stm32f10x.h"

#include "stdio.h"

 

static void EXTI_Key_Config(void);

static void NVIC_Configuration(void);

static void USART1_Config(void);

static void Delay(__IO u32 nCount);

 

int main(void)

{

        USART1_Config();

EXTI_Key_Config();

//配置中断控制器NVIC

        NVIC_Configuration();

while(1)

{

printf("STM32正常运行.rn");

Delay(0xfffff);

//NVIC_SystemLPConfig(NVIC_LP_SLEEPONEXIT,DISABLE);//调用__WFI时立即进入睡眠

NVIC_SystemLPConfig(NVIC_LP_SLEEPONEXIT,ENABLE);//调用__WFI时,等待系统从最低优先级的中断处理程序中退出后进入睡眠

printf("STM32进入睡眠.rn");

__WFI();//WFI指令进入睡眠

//开始等待中断唤醒

Delay(0xfffff);

printf("已退出睡眠模式.rn");

        }

}

 

static void EXTI_Key_Config(void)

{

        GPIO_InitTypeDef GPIO_InitStructure;

    EXTI_InitTypeDef EXTI_InitStructure;

//开启外设时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

        //初始化 GPIOA.0 设置为下拉输入

  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 

  GPIO_Init(GPIOA, &GPIO_InitStructure);

//GPIOA.0 中断线配置

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

        //GPIOA.0 中断初始化配置

  EXTI_InitStructure.EXTI_Line=EXTI_Line0;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿时进入中断

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

//初始化外设EXTI寄存器

  EXTI_Init(&EXTI_InitStructure);

}

 

void USART1_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

//配置串口1(USART1)时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

       //配置串口1(USART1 Tx (PA.09))

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

  

//配置串口1 USART1 Rx (PA.10)

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

//串口1模式(USART1 mode)配置 

USART_InitStructure.USART_BaudRate = 9600;//一般设置为9600;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No ;

USART_InitStructure.USART_HardwareFlowControl =         USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断

USART_Cmd(USART1, ENABLE); //使能串口 

}

 

int fputc(int ch, FILE *f)//重写标准库的fputc函数

{

//将Printf内容发往串口

USART_SendData(USART1, (unsigned char) ch);

while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);

return (ch);

}

 

static void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);//使能外部中断 PA.0

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  

NVIC_Init(&NVIC_InitStructure);//使能串口1中断

}

 

void Delay(__IO u32 nCount) //简单的延时函数

{

for(; nCount != 0; nCount--);

在stm32f10x_it.c文件加入:


#include "delay.h"

void EXTI0_IRQHandler(void)

{     

Delay(0xFFFFF);//防抖

        //检查指定的EXTI0线路触发请求发生与否

        if(EXTI_GetITStatus(EXTI_Line0) != RESET)   

{   

     printf("按键中断唤醒.rn");

}

//清除EXTI0线路挂起位

EXTI_ClearITPendingBit(EXTI_Line0);  

}

 

void USART1_IRQHandler(void)

{

unsigned char code;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

{

    code=USART_ReceiveData(USART1);

            printf("串口中断唤醒.rn");

        }

睡眠模式的各种特性

image.png

注意:在系统处于睡眠低功耗模式(包括后面介绍的停止模式、待机模式)时,不能用下载器进行程序下载,所以下载程序时要先把系统唤醒。或者使用如下方法:按着板子的复位键,点击电脑端的“下载”,然后松开复位键,就能正常给板子下载程序了。


4.停止模式实验

停止模式是在Cortex™-M3的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。此时在1.8V供电区域的的所有时钟都被停止,PLL、HSI和HSE RC振荡器的功能被禁止,SRAM和寄存器内容被保留下来。


停止模式的功耗比睡眠模式更低,代码操作上相对比睡眠模式复杂一点。跟睡眠模式的唤醒不同,只有EXTI线的中断才能退出停止模式,因为其他外设在停止模式时被关闭,并不能响应中断。将mani函数替换为下面代码,其他不变:


int main(void)

{

        USART1_Config();

EXTI_Key_Config();

        NVIC_Configuration();//配置中断控制器NVIC

 

RCC_APB1PeriphClockCmd(RCC_APB1Per

[1] [2]

关键字:stm32  电源管理  低功耗

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471798.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32之PVD可编程电压监测器(掉电保存数据)
下一篇:基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

秉火429笔记之一初识STM32

1. STM32概述STM32,ST为意法半导体,M是Microelectronics的缩写,32表示32位,简而言之,STM32即为ST公司开发的32位微控制器。2. STM32分类STM32包含多个系列,从内核分为Cortex-M0、M3、M4、M7,每个内核有大概分为主流、高性能和低功耗。3. STM32命名规则
发表于 2019-09-12
秉火429笔记之一初识STM32

基于STM32的简单电子书的实现

;,16,RED,WHITE,0);printf("res=%x",res);return 1;         }else{       fnShowString(10,120,"open ok",16,RED,WHITE,0);}        f_lseek(&f1,32*((H8-0xa0-1)*94+(L8-0xa0-1)));                 
发表于 2019-09-12

stm32 各头文件或C文件功能

stm32f10x_con.h配置文件:加载哪个外设、使能assert 对参数进行检查,如果使能了assert 需要在main文件中添加 _assert_faild 函数。 使能assert会增大编译出执行文件的大小,调试完后可以将assert 屏蔽。stm32f10x.h头文件中包含了stm32f10x_conf.h 。stm32f10x.h1、对所有的外设的地址进行映射,映射到存储区,即定义某外设结构体变量,因为结构体是连续存储的只要将外设的基地址强制转换为结构体类型的指针,那么该外设的寄存器就可以通过指针进行访问,以GPIO为例:定义外设的结构体,结构体变量都是volatile类型,告诉编译器不要进行优化,读取值从内存读取
发表于 2019-09-12

stm32通过spi连接esp8266的hspi 开发

刚刚做了stm32通过spi连接esp8266的开发,目前已经解决了遇到的大多数问题,基本可以交付使用了,写一篇文章留作记录,也可以给以后做这个的朋友做为参考。esp8266模块本身发布的时候默认里边烧写的是AT固件,虽然硬件上有spi的引脚,但是并不支持spi的通信,如果要支持spi的通信,自行修改编译esp8266的sdk,写自己需要的代码来实现。本身sdk中有相关的例程,根据例程的代码修改调试就可以实现相应的功能。使用spi的好处,第一 可以节省一个串口,因为stm的串口资源是比较有限的。另外spi的通讯速度要比串口快一些。这篇文章将包含如下的一些内容:1,stm32 spi的驱动如何开发?2,esp8266端的驱动如何开发
发表于 2019-09-12
stm32通过spi连接esp8266的hspi 开发

stm32的SPI设置步骤,SPI配置参数

用stm32的库进行深入SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。四根线MISO 主设备数据输入,从设备数据输出。MOSI 主设备数据输出,从设备数据输入。SCLK时钟信号,由主设备产生。CS从设备片选信号,由主设备控制。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节时钟极性CPOL对传输协议没有重大的影响,代表串行同步时钟的空闲状态下的电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升
发表于 2019-09-12

关于STM32f103 SPI时钟速度的问题

STM32f103 中APB1的最高频率是36MHz,APB2的最高频率是72MHz,而PCLK1和PCLK2一般也默认配置为其最高工作频率36M和72M。如下图(STM32F10xx_参考手册(第7版) 第46页)时钟树所示:SPI1时钟由APB2时钟分频而来,可以选择2、4、8、16、32、64、128、256这几个分频系数。而手册规定STM32的SPI时钟最快是18MHz。对于STM32F103的SPI1接口时钟,由72M的PCLK2分频得到,所以分配系数大于等于4(72M/4 = 18M)。对于STM32F103的SPI2/SPI3接口时钟,由36M的PCLK1分频得到,所以分配系数大于等于2(36M/2 = 18M
发表于 2019-09-12
关于STM32f103 SPI时钟速度的问题

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved