STM32F407中PVD实现掉电检测

STM32F407实现掉电检测和保存参数

目录:
1、前言
2、PVD中断程序简介
3、主要程序

一、前言

在日常的嵌入式开发当中,会经常需要对少量的数据做掉电保存功能。
常用的方法摸过于当这些数据发生改变时,将其保存到Flash当中。但是这样会有个弊端,如果需要保存的数据是一些容易发生变化的值,就需要对Flash进行反复的擦写。这样的操作,对芯片的损害非常大,毕竟Flash的擦写次数有限。
为了解决这一个问题,就需要引出本篇文章的主角“PVD”,就是Programmable Votage Detector 可编程电压监测器。它可以实现电压监控,当电压高于或者低于设定值的时候,会触发PVD中断。
而我们只需要设定好触发的电压值,若发生掉电,当电压将到设定值的瞬间,进入中断执行 “保存参数”的操作。这样一来,既实现了掉点保存,还能有效保护芯片。

二、PVD中断程序简介

使用于 PVD相关的开发之前,需要加入 “stm32f4xx_pwr.h” 头文件。(因为我用的是库函数开发)。主要的是使用到配置阈值的 “ PWR_PVDLevelConfig(uint32_t PWR_PVDLevel)” 函数。可配置PWR_PVDLevel_0 到 PWR_PVDLevel_7 七个等级。(F103则是配置PWR_PVDLevel_2V9,可配置2.2 - 2.9V电压)。
其次,就是PVD外部中断,它是连接到外部中断线16上的,已经固定了。F103和F407都是一样。同时,需要选择出发边沿,有上升沿、下降沿和边沿三种。选择边沿的时候,需要注意一下,如果是掉电检测,那就选上升沿(EXTI_Trigger_Rising)触发,如果是上电检测,则选择下降沿触发(EXTI_Trigger_Falling)。因为电压值高于设定值时为 0,低于设定值时为1.
之后,就可以在中断中执行我们想要的操作了。

三、主要程序


/*
功能:掉电检测,存储测试过程的参数
参数:无
返回值:无
*/
void PVD_Init(void)
{
   EXTI_InitTypeDef EXTI_InitStructure;
   NVIC_InitTypeDef NVIC_InitStructure;

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //NVIC分组
   NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;    
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

   PWR_PVDLevelConfig(PWR_PVDLevel_2);	//可设置范围0~7
   PWR_PVDCmd(ENABLE);

   EXTI_DeInit();
   EXTI_StructInit(&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);
}

//掉电中断处理函数
void  PVD_IRQHandler(void)
{
   if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
   {
		u1_printf("POWER OFF\r\n");
 		/*
			参数保存,写到Flash中
		*/
   }
   EXTI_ClearITPendingBit(EXTI_Line16);
}

这里 参数保存的可以看我的另外一篇博文,这里就不展开讨论。STM32实现掉电保存多个数据(FLASH)

注意:
中断函数里面的数据处理内容不要放太多,不然会导致还没处理完,芯片就已经完全断电的情况。
其次,为了保证每一次操作都能成功,最后加一个 1000uF的电容,用来蓄电。

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值