#include "bsp.h" #include "exti_io.h" void WakeUp_EXIT_Config( void ) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; //enable GPIOA Clock RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // config PA10 as input floating GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //very import GPIO_Init(GPIOA, &GPIO_InitStructure); //enable syscfg clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // connect EXTI0 line to PA0 pin SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); //config EXTI10 Line EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // enable and set EXTI0 interrupu to the lowest priority NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); PWR_WakeUpPinCmd(PWR_WakeUpPin_1,ENABLE); } //检测WKUP脚的信号 //返回值1:连续按下3s以上 // 0:错误的触发 u8 Check_WKUP(void) { u8 t=0; //记录按下的时间 while(1) { if(WKUP_KD) { t++; //已经按下了 delay_ms(30); if(t>=100) //按下超过3秒钟 { return 1; //按下3s以上了 } }else { return 0; //按下不足3秒 } } } void EXTI0_IRQHandler( void ) { EXTI_ClearITPendingBit(EXTI_Line10); //Clear the EXTI line 10 pending bit if(Check_WKUP()==0)//关机? { Wake_Up_Flag=0; PWR_EnterSTANDBYMode(); //进入待机(STANDBY)模式 }else { Wake_Up_Flag=1; } }