掉电检测机制PVD
掉电检测机制PVD(ProgrammableVoltage Detecter),即可编程电压检测器。
有时在一些应用中,我们需要检测系统是否掉电了,或者要在掉电的瞬间需要做一些处理。STM32就有这样的通过PVD我们可以设定一个基准电压,当芯片的供电电压高于或低于该基准电压时便产生PVD中断,我们可以在PVD中断里做一些处理
在stm32中对PVD的描述是这样的
用户可以利用
PVD
对
V
DD
电压与电源控制寄存器
(PWR_CR)
中的
PLS[2:0]
位进行比较来监控电
源,这几位选择监控电压的阀值。
通过设置
PVDE
位来使能
PVD
。
电源控制
/
状态寄存器
(PWR_CSR)
中的
PVDO
标志用来表明
V
DD
是高于还是低于
PVD
的电压阀
值。该事件在内部连接到外部中断的第
16
线,如果该中断在外部中断寄存器中是使能的,该事
件就会产生中断。当
V
DD
下降到
PVD
阀值以下和
(
或
)
当
V
DD
上升到
PVD
阀值之上时,根据外部中
断第
16
线的上升
/
下降边沿触发设置,就会产生
PVD
中断。例如,这一特性可用于用于执行紧急
关闭任务。

我们可以通过stm32的手册中查看如何使用PVD
配置代码如下:
代码仅供参考具体还需要根据实际情况去配置PVD中断
//pvd.c掉电防丢失,以及掉电恢复后数据初始化模块
#include "stm32f10x.h" // 根据你的芯片型号选择合适的头文件
#include "stm32f10x_pwr.h" // 电源控制头文件
#include "stm32f10x_exti.h" // 外部中断头文件
#include "stm32f10x_rcc.h" // 时钟控制头文件
// PVD初始化函数,设置PVD阈值和中断模式
void PVD_Init(void)
{
// 使能PWR时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
// 设置PVD阈值为2.9V,可以根据你的电源电压选择其他值
PWR_PVDLevelConfig(PWR_PVDLevel_2V9);
// 使能PVD
PWR_PVDCmd(ENABLE);
// 使能PVD外部中断线
EXTI_ClearITPendingBit(EXTI_Line16); // 清除中断标志位
EXTI_InitTypeDef EXTI_InitStructure; // 定义外部中断结构体
EXTI_InitStructure.EXTI_Line = EXTI_Line16; // PVD连接到外部中断线16
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 设置为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 设置为上升沿触发,即电压低于阈值时触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能外部中断线
EXTI_Init(&EXTI_InitStructure); // 初始化外部中断
// 设置PVD中断优先级和使能
NVIC_InitTypeDef NVIC_InitStructure; // 定义中断控制器结构体
NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn; // PVD中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
NVIC_Init(&NVIC_InitStructure); // 初始化中断控制器
}
// PVD中断服务函数,用于掉电前的处理
void PVD_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line16) != RESET) // 判断是否是PVD中断
{
// 在这里添加你的掉电处理代码,例如保存数据到Flash或EEPROM等
// 注意不要执行太多的操作,因为电压可能很快就会降到无法工作的程度
EXTI_ClearITPendingBit(EXTI_Line16); // 清除中断标志位
}
}