STM32利用PVD中断实现数据掉电保存(附配置代码)

掉电检测机制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); // 清除中断标志位
    }
}







作者:rembersr

物联沃分享整理
物联沃-IOTWORD物联网 » STM32利用PVD中断实现数据掉电保存(附配置代码)

发表评论