(制作不易,希望大佬能给个赞支持下小丁)
目录
一、电源管理简介
1、上电复位(POR)/掉电复位(PDR)
2、欠压复位(BOR)
3、可编程电压监控器(PVD)
2、STM32电源简介
1、电池备份域
2、调压器电路
3、独立A/D转换器电源以及参考电压。
3、电源监控(PVD)实验
4、实验代码
1、main.c
2、PVD.c
3、PVD.h
5、实验结果
6、结束语
为什么要进行电源管理?
①、保持电路的正常运行,像51单片机是没有电源管理的,32单片机是具备的,有电源管理的好处为,当遇到突然断电时,像51单片机并不知道程序运行到了那里,如果有电源管理,可以在断电前将数据进行保存,保证在通电后重要数据不受干扰。
②、在特定时间实现低功耗模式。像现在的手表等等的,都要求低功耗,保证续航更久等等。
①、由上图可得,当VDD/DDA的电压低于阈值VPDR/VPOR时,器件会保持复位状态。
②、VDD:0~~VPOR(典型值1.72V):为上电复位。
③、VDD持续上升时间:VPOR~~正常运行电压(水平电压)
④、正常运行状态:正常运行电压(水平电压)
⑤、下降至VPDR(典型值1.68V):掉电复位
①、上电期间,欠压复位 (BOR) 将使器件保持复位状态,直到电源电压达到指定的 VBOR 阈值,电路器件才正常工作。
②、VBOR 通过器件选项字节进行配置。BOR 默认为关闭。可以选择 4 个 VBOR 阈值。
BOR 关闭 (VBOR0):1.80 V 到 2.10 V 电压范围的复位阈值级别
BOR 级别 1 (VBOR1):2.10 V 到 2.40 V 电压范围的复位阈值级别
BOR 级别 2 (VBOR2):2.40 V 到 2.70 V 电压范围的复位阈值级别
BOR 级别 3 (VBOR3):2.70 V 到 3.60 V 电压范围的复位阈值级别
③、当电源电压 (VDD) 降至所选 VBOR 阈值以下时,将使器件复位。
④、通过对器件选项字节进行编程可以禁止 BOR。要禁止 BOR 功能,VDD 必须高于 VBOR0,以 启动器件选项字节编程序列。那么就只能由 PDR 监测掉电过程。
⑤、BOR 阈值滞回电压约为 100 mV(电源电压的上升沿与下降沿之间)。
①、使能了PVD(PWR_CR寄存器PVDE位)之后,可以使用PVD监视电源,并将其与PWR_CR寄存器中的PLS[2:0]位所选的阈值进行比较。PWR_CSR寄存器中提供了PVDO标志,用于指示VDD是大于还是小于阈值。该事件内部连接到EXTI线16,如果通过EXTI寄存器使能,则可以产生中断。当VDD降至PVD阈值以下或者升至阈值以上,可以产生PVD中断,具体取决EXTI线16上升沿/下降沿配置。该功能用处之一就是在中断服务程序中执行紧急关闭系统的任务。
也就是当电压低到设置值时,会触发中断,在中断中可以将重要数据进行保存,保证重要数据不受到伤害。
②、电源控制寄存器PWR_CR
③、HAL库操作函数(stm32fXxx_hal_pwr.c中):
void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); //配置PVD参数:阈值级别和中断触发方式
void HAL_PWR_EnablePVD(void);//使能PVD
void HAL_PWR_DisablePVD(void);//失能PVD
void HAL_PWR_PVD_IRQHandler(void);
void HAL_PWR_PVDCallback(void);
STM32电源可以分为三个部分:电池备份域、调压器电路、独立A/D转换器电源以及参考电压。
VBAT引脚一般连接一个纽扣电池。 在VDD关闭后可以为RTC,备份寄存器,备份RAM,LSE等供电。
后备电源经常是3V,当VDD电源大于3V时,单片机使用VDD供电,当电源低于3V时,单片机使用VBAT后备电源供电。
调压器为备份域及待机电路以外的所有数字电路供电。调压器输出电压为1.2V(M4/M7)或者1.8V(M3)。
重要的作用就是实现低功耗。
调压器是那种工作模式:
①运行模式:1.2/1.8V域全功率运行;
②停止模式:1.2/1.8V域低功率运行,1.2V区域所有时钟关闭,相应外设停止工作,保留内核寄存器以及SRAM内容;
③待机模式:1.2/1.8V域断电,内核寄存器以及SRAM内容均丢失,备份区域的寄存器以及SRAM不受影响。
为了提高转换精度,ADC配有独立电源,可以单独滤波并屏蔽PCB上的噪音。
①ADC电源电压从单独的VDDA引脚输入。
②VSSA引脚提供独立的电源接地链接。
为了确保测量电压时具有更高的精度,用户在VREF上链接单独的ADC外部参考电压输入。VREF介于1.8V和VDDA之间。
通过改变电源电压的大小,使电源监控PVD工作发生中断,中断事件为向串口发送一句 “没电了”。
触发中断的方式是供电电压低于2.9V。
因为没有可调节电源,于是使用开关,也就是直接给电路断电,断电的过程电路电压也是逐渐降低的,于是是可以出发中断的。
/**************************************************************************
**作者: 小丁工程
**时间: 2021.01.17
***************************************************************************/
#include "sys.h"
//---------------------主函数-------------------------------------------------
int main(void)
{
HAL_Init();//========================初始化HAL库
Stm32_Clock_Init(360,25,2,8);//======设置时钟,180Mhz
delay_init(180);//===================初始化延时函数
uart_init(115200);//=================初始化串口函数
PVD_Config();//======================初始化电源控制函数
while(1)
{
//delay_ms(1000);
}
}
//---------------------end-----------------------------------------------------
#include "PVD.h"
PWR_PVDTypeDef pvd_config;//定义句柄
void PVD_Config(void)初始化
{
__HAL_RCC_PWR_CLK_ENABLE(); //初始化时钟
pvd_config.PVDLevel=PWR_PVDLEVEL_7;
pvd_config.Mode=PWR_PVD_MODE_IT_RISING_FALLING;
HAL_PWR_ConfigPVD(&pvd_config);
HAL_PWR_EnablePVD(); //使能
HAL_NVIC_EnableIRQ(PVD_IRQn); //使能pvd中断通道
HAL_NVIC_SetPriority(PVD_IRQn,0,0); //抢占优先级0,子优先级0
}
void PVD_IRQHandler (void)//中断函数
{
HAL_PWR_PVD_IRQHandler();
}
void HAL_PWR_PVDCallback(void)//中断回调函数
{
printf("没电了");
}
#ifndef _PVD_H
#define _PVD_H
#include "sys.h"
void PVD_Config(void);
void PVD_IRQHandler (void);
void HAL_PWR_PVDCallback(void);
#endif
在给电路板断电时,向串口成功发送了 “没电了”。
对于一些重要数据,断电前进行保存还是非常重要的,希望能帮助到你。
(例程及相关资料参考于-->原子光盘,侵删)