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); // 清除中断标志位
    }
}







  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值