STM32内部自带PVD功能,用于对MCU供电电压VDD进行监控。通过电源控制寄存器中的PLS[2:0]位可以用来设定监控电压的阀值,通过对外部电压进行比较来监控电源。当条件触发,需要系统进入特别保护状态,执行紧急关闭任务:对系统的一些数据保存起来,同时对外设进行相应的保护操作。
源码实现: void PVD_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//掉电时钟开启,必须开启
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
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_Trigger_Falling---表示电压从低上升到高于设定阀值时产生中断;
//EXTI_Trigger_Rising_Falling---表示电压上升或下降越过设定阀值时都产生中断。
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//电压低于阀值时产生中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线
EXTI_Init(&EXTI_InitStructure); //初始
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组,2及抢占,2级优先
NVIC_InitStructure.NVIC_IRQChannel=PVD_IRQn;//设置中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;//使能中断
NVIC_Init(&NVIC_InitStructure);
PWR_PVDLevelConfig(PWR_PVDLevel_2V9); //设定监控阀值:2.9V
PWR_PVDCmd(ENABLE); //使能PVD
}
void PVD_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line16)!=RESET)
{
printf("电压不足\n\r");
LED1(ON);
//用户添加紧急处理代码处
}
EXTI_ClearITPendingBit(EXTI_Line16); //退出前清中断标志位
}
|