STM32內(nèi)部自帶PVD功能,用于對MCU供電電壓VDD進行監(jiān)控。通過電源控制寄存器中的PLS[2:0]位可以用來設定監(jiān)控電壓的閥值,通過對外部電壓進行比較來監(jiān)控電源。當條件觸發(fā),需要系統(tǒng)進入特別保護狀態(tài),執(zhí)行緊急關閉任務:對系統(tǒng)的一些數(shù)據(jù)保存起來,同時對外設進行相應的保護操作。
源碼實現(xiàn): 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---表示電壓從高下降到低于設定閥值時產(chǎn)生中斷;
//EXTI_Trigger_Falling---表示電壓從低上升到高于設定閥值時產(chǎn)生中斷;
//EXTI_Trigger_Rising_Falling---表示電壓上升或下降越過設定閥值時都產(chǎn)生中斷。
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//電壓低于閥值時產(chǎn)生中斷
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中斷線
EXTI_Init(&EXTI_InitStructure); //初始
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷優(yōu)先級分組,2及搶占,2級優(yōu)先
NVIC_InitStructure.NVIC_IRQChannel=PVD_IRQn;//設置中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占優(yōu)先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//子優(yōu)先級1
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;//使能中斷
NVIC_Init(&NVIC_InitStructure);
PWR_PVDLevelConfig(PWR_PVDLevel_2V9); //設定監(jiān)控閥值: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); //退出前清中斷標志位
}
|