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); //退出前清中斷標志位
}
|