当前位置: 首页 > article >正文

PWR电源控制详解教程文章 ~内置初始化驱动代码!!!

                                                                文章目录

前言

stm32 cpu默认频率基础知识详解

降低频率会影响指令执行速度

stm32 cpu芯片超频

PWR 基础知识详解

stm32内部电源供电基础知识详解

电压调节器模式

低功耗模式基础知识详解

低功耗模式不同频率耗电详解图


前言

        在使用锂电池作为系统电源供应的开发中,通常使用低功耗模式来使芯片降低自身功耗同事延长电池寿命跟延长设备的使用时间,或者通过降低CPU自身的频率来完成芯片的消耗电量消耗。

stm32 cpu默认频率基础知识详解

        SYSCLK(System Clock) 是为控制器内部的系统时钟频率,通常是芯片的主要时钟源,用来驱动CPU,外设和其他系统资源,对于stm32来讲,SYSCLK = CPU频率,也就是等于芯片处理器核心(CPU)运行的时钟频率。

        在大多数stm32的芯片中,SYSCLK通常是由PLL(Phase-Locked Loop)倍频产生的,PLL的输入时钟源通常来自外部的时钟源,在stmf1系列的芯片中,SYSCLK通常由外置8Mhz晶振输入通过PLL进行9倍增幅供给SYSCLK的时钟为72MHz。

        也就是说stm32f1系列的芯片CPU默认频率是72MHz,在库文件源码的预处理指令也有体现。

/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#ifdef SYSCLK_FREQ_HSE
  uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_24MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_36MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_48MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_56MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_72MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /*!< System Clock Frequency (Core Clock) */
#else /*!< HSI Selected as System Clock source */
  uint32_t SystemCoreClock         = HSI_VALUE;        /*!< System Clock Frequency (Core Clock) */
#endif

                                                        源文件代码   

        在源码中 SystemCoreClock 变量代表着就是当前芯片的系统时钟,需要知道的是在大多数微控制器中,功耗跟时钟频率成正比,而CPU的功耗主要来自以下几个因素:

                                                        Pdynamic​∝C⋅V2⋅f

                                                                 计算公式

        CPU动态功耗与时钟频率,处理指令数量,电源电压有关其中,C 是电容,V 是电压,f 是频率。降低频率 f 会直接降低动态功耗。

降低频率会影响指令执行速度

        如果将CPU的频率从72MHz降低到,36MHz那么每秒钟CPU的执行指令数量也将减少一半,最简单的体现是Delay延时函数,如果延时定义是在72MHz的时候,如果CPU降一半频率,延时的执行时间会增加一倍。

        因为延时函数定义的循环执行语句执行速度整体慢一倍。

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

stm32 cpu芯片超频

        超频(Overclocking)指的是将处理器的时候频率提高到超过其设计规范所允许的频率,从而让处理器在单位时间内处理更多的指令。

        stm32f1系列通常在72MHz运行,通过RCC时钟树改变时钟源和PLL锁相环的倍来增加时钟频率,使得CPU频率在72MHz,例如84MHz,96MHz。

        在对RCC时钟树进行配置完成超频之后,最直接的效果就是提升了CPU执行指令的速度,同时增加了CPU的功耗,处理器的功耗也会增加,会导致芯片发热增加,需要注意的是最大的问题是芯片稳定性问题,超频使用芯片,会导致系统不稳定,当CPU频率超出硬件设计范围,会导致数据出错,死机等问题需要谨慎使用CPU时钟超频

PWR 基础知识详解

        PWR (Power Control) 电源控制,PWR负责管理STM32内部的电源供电部分,可以实现可编程电压检测低功耗模式的功能,同时低功耗模式包括 睡眠模式(Sleep)停机模式(Stop) 待机模式(Standby),可以在系统空闲时,降低stm32的功耗,延长设备使用时间。

        可编程检测器 (PVD) 可以监控VDD电源电压,当VDD下降到PVD阈值以下或上升到PVD阈值之上PVD会触发中断,用于执行紧急关闭任务。

        对于遥控器,报警器,报警器这种使用电池供电的设备对于设备空闲时间功耗是有要求的,同时对于这种产品,在大多数情况下都是处于空闲状态,对于芯片来说上电之后一直在运行状态,为了延长产品的使用时间会使用低功耗模式。

        在烧录完成低功耗的代码之后,产品运行代码进入低功耗模式的时候,如果在此烧录代码是没有办法烧录代码的,如果需要烧录代码需要 按住复位键不放+点击烧录,这个时候才能烧录完成代码。

stm32内部电源供电基础知识详解

        在stm32芯片的整体电源设计部分上,CPU核心,外设,存储器这些使用的是1.8V供电,而Vref+ Vref-这些adc参考电压使用的是Vdda Vssa进行供电,也就是和数字电路一样的3.3V和gnd进行供电。

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​  stm32内部电源框图

        而cpu等核心使用低电压运行的原因,就是为了降低功耗,需要注意的是电压调节器会将芯片3.3V供电降低压降为1.8V给芯片核心外设,同时低电压检测器当VDD电压小于Vbat电压的时候会选择Vbat电压对后备区域进行供电。

  当内部电压VDD或者VDDA电压过低或者上电的情况下,会产生一个RESET复位信号,不要乱操作,当电压在POR区间内产生复位,当电压超过POR电压上线或者低于POR电压下线的时候会停止产生复位信号

        其中RESET复位信号是低电平有效信号。

                                                       供电复位波形图

        下图PVD电压检测和上图RESET复位信号产生差不多原理,当VDD或者VDDA的电压在PVD阈值范围内的时候会产生PVD信号,只有电压超过PVD阈值或者比PVD阈值低的时候才不会产生PVD阈值信号。

                                                                PVD检测电压波形图

        但是PVD跟VDD掉电复位检测不同的地方在于PVD的检测电压范围是能够通过软件程序进行自我设定的。

                                                       PVD程序阈值

        同时当PVD触发过后芯片还能正常工作的,但是因为芯片电压过低需要提醒一下用户,当PVD电压检测到过低或者过高可以用来申请中断向外部中断。

电压调节器模式

                                                                 ​​​​​​​  stm32内部电源框图

        电压调节器有三种工作模式,分别对应三种不同的功耗模式

 运行模式:调节器以正常的功耗模式提供1.8V电源给CPU,内存,外设

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

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

低功耗模式基础知识详解

       低功耗模式的睡眠模式可以通过调用 WFI(Wait For Interput) WFE(Wait For Event)函数进入该模式,相应的通过芯片中断或者事件进行唤醒芯片,同时睡眠模式只关闭CPU的运行时钟。这个时候所有与时序和运算有关的都会停止,但是所有数据依然会保存。

        停机模式需要设置SleepDeep标志位为1,同时PDDS为0进入停机模式 PDDS为1进入待机模式,LPDS用来设置电压调节器,当为0的时候电压调节器开启,为1的时候电压调节器进入低功耗模式,通过外部中断来唤醒,关闭了内/外的高速时钟和CPU还有外设的时钟,但是依然保留芯片中的数据。

        待机模式需要设置SleepDeep标志位为1,PDDS为1进入待机模式,需要注意的是待机模式的电压调节器也是关闭的,同是唤醒调节只能是RTC IWDG NEST WKUP唤醒,因为关闭了电压调节器,就导致1.8V供电的内部核心外设供电停止,也就是CPU不仅停止运行,同时丢失所有的数据

                                                           低功耗模式数据手册        

                                        唤醒难度:待机>停机>睡眠

                                        省电程度:待机>停机>睡眠

                                                        模式配置流程图

        这些寄存器的额标志位已经在库函数中封装完成了,当执行WFI或WFE的时候芯片会通过判断关键标志位,来判断选择的是那种低功耗模式。

        需要注意的是在行WFI/WFE指令后,stm32进入睡眠模式,程序暂停运行,唤醒程序后从暂停的地方继续执行。同时在睡眠模式下,所有的IO引脚保持在运行模式的状态

        停止模式下程序暂停运行,唤醒后从程序暂停的地方继续运行,1.8V供电区域所有的时钟都被停止,PLL,HSI和HSE被禁止,SRAM和寄存器内容被保留下来,在停止模式下所有IO引脚保持在运行模式下的状态当中断或唤醒事件导致退出停止模式HSI被选为系统时钟当电压调节器处于低功耗模式下,系统从停止模式退出时,会有一段额外的延时启动

        待机模式下,唤醒后程序从头开始运行,1.8V供电区域全部被断电,PLL,HSI和HSE也被断电,SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电,在待机模式下,所有的IO引脚变为高阻态(浮空输入)

低功耗模式不同频率耗电详解图

                                                普通模式耗电图

                                                睡眠模式耗电图

                                                        停机模式待机模式电流图

        这里需要注意的是低功耗模式进入了停机模式或者待机模式,消耗的电流单位就是ua级别,在3.3V供电的情况下是24ua,如果是待机模式就成了3ua。同时在停机模式或者待机模式的情况下RTC时钟消耗的电量也是1点多ua。

                                欢迎指正,希望对你,有所帮助!!!


http://www.kler.cn/a/557987.html

相关文章:

  • 网络安全风险事件排名 网络安全事件划分
  • 网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施
  • 如何查询网站是否被百度蜘蛛收录?
  • CSS中块级格式化上下文(BFC)详解
  • windwos与linux环境下Iperf3带宽测试工具的安装、使用
  • 集合 数据结构 泛型
  • 【JavaScript】深入理解模块化
  • PHP 性能优化全攻略:提升 Web 应用速度的关键
  • SSH无密登录配置
  • Node.js Buffer 教程
  • Spring Boot (maven)分页4.0.2版本 专业版- 模板化最终版(测试)
  • Git常见面试题
  • 基于ffmpeg+openGL ES实现的视频编辑工具-添加转场(九)
  • /etc/docker/daemon.json这个跟/etc/yum.repos.d/docker-ce.repo这个文件的关系
  • WebXR教学 02 配置开发环境
  • Unity游戏制作中的C#基础(6)方法和类的知识点深度剖析
  • OpenFeign 实现远程调用
  • 新能源汽车核心元件揭秘:二极管、三极管结构与工作原理解析(2/2)
  • 【Deepseek+Dify】wsl2+docker+Deepseek+Dify部署本地大模型知识库问题总结
  • STM32的“Unique device ID“能否修改?