本文主要是介绍PVD可编程电压监测器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
应用场景:检测系统电压下降或断电。
有时在一些应用中,我们需要检测系统是否掉电了,或者要在掉电的瞬间需要做一些处理,这时会用到PVD。
一、理论知识
手册中说到:
用户可以利用PVD对VDD电压与电源控制寄存器(PWR_CR)中的PLS[2:0]位进行比较来监控电源,这几位选择监控电压的阀值。通过设置PVDE位来使能PVD。电源控制/状态寄存器(PWR_CSR)中的PVDO标志用来表明VDD是高于还是低于PVD的电压阀值。该事件在内部连接到外部中断的第16线,如果该中断在外部中断寄存器中是使能的,该事件就会产生中断。当VDD下降到PVD阀值以下和(或)当VDD上升到PVD阀值之上时,根据外部中断第16线的上升/下降边沿触发设置,就会产生PVD中断。例如,这一特性可用于用于执行紧急关闭任务。也就是当电压低到设置值时,会触发中断,在中断中可以将重要数据进行保存,保证重要数据不受到伤害。
二、代码
void PVD_Config(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//开启PWR时钟 PWR_PVDLevelConfig(PWR_PVDLevel_2V9);//设定监控阈值PWR_PVDCmd(ENABLE);//使能PVD
}void EXTI_Configuration(void)
{EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line16; //该事件在内部连接到外部中断的第16线EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //EXTI_Trigger_Rising表示电压从高下降到低于设定阀值时产生中断。EXTI_Trigger_Falling表示电压从低上升到高于设定阀值时产生中断EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
}void PVD_IRQHandler (void)//中断函数
{EXTI_ClearITPendingBit(EXTI_Line16);if(PWR_GetFlagStatus(PWR_FLAG_PVDO))//返回1说明检测到PVD输出1说明电压低于阈值{GPIO_ResetBits(GPIOE,GPIO_Pin_5); //灯亮 }
}
EXTI_InitStructure.EXTI_Trigger的赋值可选项:
EXTI_Trigger_Rising—表示电压从高下降到低于设定阀值时产生中断;
EXTI_Trigger_Falling—表示电压从低上升到高于设定阀值时产生中断;
EXTI_Trigger_Rising_Falling—表示电压上升或下降越过设定阀值时都产生中断。
现象:断电前灯亮了一下
这篇关于PVD可编程电压监测器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!