#ifdef __cplusplus extern "C" { #endif #include "wdg_wkup.h" #include "delay.h" void PB_IWDG_Init(void) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //Enable access to write register IWDG_SetPrescaler(IWDG_Prescaler_64); //Frequency: 40K / 64 = 0.625K, and one cycle is 1.6ms IWDG_SetReload(800); //800*1.6ms = 1.28S IWDG_ReloadCounter(); //the program to feed dog, if not write 0xAAAA every while, WDG will reset IWDG_Enable(); //enable } void PB_IWDG_Feed(void) { IWDG_ReloadCounter(); } static void WWDG_NVIC_Init() { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG interrupt NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //PreemptionPriority NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //SubPriority NVIC_Init(&NVIC_InitStructure);//NVIC initialization } u8 WWDG_CNT=0x7f; void PB_WWDG_Init(u8 tr,u8 wr,u32 fprer) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // enable WWDG clock WWDG_SetPrescaler(fprer); //set IWDG Prescaler WWDG_SetWindowValue(wr); //set window value WWDG_Enable(tr); //enable WWDG, and set counter WWDG_ClearFlag(); WWDG_NVIC_Init(); //initialize WWDG NVIC WWDG_EnableIT(); //enable interrupt of WWDG } void PB_WWDG_Set_Counter(u8 cnt) { WWDG_Enable(cnt); } void PB_WWDG_IRQHandler(void) { WWDG_SetCounter(0x7F); //if annotate this words, WWDG will reset WWDG_ClearFlag(); //clear flag of advance wake up } static void Sys_Standby(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //ENABLE PWR clock PWR_WakeUpPinCmd(ENABLE); //enable the wake-up Pin PWR_EnterSTANDBYMode(); //enter standby mode } static void Sys_Enter_Standby(void) { RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //RESET all IO Sys_Standby(); } static u8 Check_WKUP(void) { u8 t=0; //recording the time when pressing // LED0=0; while(1) { if(WKUP_KD) { t++; //have pressed delay_ms(30); if(t>=100) //having been pressed over 3s { // LED0=0; //light DS0 return 1; //having been pressed over 3s } }else { // LED0=1; return 0; //having been pressed short 3s } } } void PB_WKUP_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; //PA.0 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//pull up input GPIO_Init(GPIOA, &GPIO_InitStructure); //Initialize IO //use external interrupt GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //connect Interrupt Line 0 with GPIOA EXTI_InitStructure.EXTI_Line = EXTI_Line0; //set all line of key EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //use external interrupt mode EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //response at posedge EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // initialize external interruption NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //enable external interrupt line of key NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //enable external interrupt channel NVIC_Init(&NVIC_InitStructure); if(Check_WKUP()==0) Sys_Standby(); //enter standby mode } #ifdef __cplusplus } #endif