當VDD下降到PVD閥值以下或當VDD上升到PVD閥值之上時,根據外部中斷第16線的上升/下降邊沿觸發設置,就會產生PVD中斷
void PVD_IRQHandler(void)
{
led_ctrl(LED1, ON);
if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
{
MSD0_WriteSingleBlock(1, buf);
}
EXTI_ClearITPendingBit(EXTI_Line16);
}
void PVD_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
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_2V9); //可設置范圍:2.2-2.9V
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);
}
當檢測到掉電以后,led會亮一下,然后進行掉電保存操作。
注意:
- 掉電時間有限,如果耗時較長的操作,可能會操作失敗;
- 時鍾頻率設置也會有影響。(SysTick_Config)
