我程序上设计是一个按键按下进入待机模式,另一个按键按下唤醒,现在的问题是第一次可以进入待机模式,但是第二次就不能进入,此时单片机工作电流还有大约1.1mA,以下是我的程序:
#include "debug.h"
/* Global define */
/* Global Variable */
/*********************************************************************
* @fn EXTI_INT_INIT
*
* @brief Initializes EXTI collection.
*
* @return none
*/
void EXTI0_INT_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
EXTI_InitTypeDef EXTI_InitStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* GPIOA ----> EXTI_Line3 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI7_0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*********************************************************************
* @fn main
*
* @brief Main program.
*
* @return none
*/
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
Delay_Ms(1000);
Delay_Ms(1000);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_WriteBit(GPIOC, GPIO_Pin_6, 1);
GPIO_WriteBit(GPIOC, GPIO_Pin_5, 1);
GPIO_WriteBit(GPIOC, GPIO_Pin_7, 0);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
EXTI0_INT_INIT();
// RCC_LSICmd(ENABLE);
// while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
Delay_Ms(100);
GPIO_WriteBit(GPIOC, GPIO_Pin_7, 1);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_2) == Bit_RESET)
{
GPIO_WriteBit(GPIOC, GPIO_Pin_6, 0);
GPIO_WriteBit(GPIOC, GPIO_Pin_5, 0);
PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFI);
}
}
}
void EXTI7_0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)
{
GPIO_WriteBit(GPIOC, GPIO_Pin_6, 1);
GPIO_WriteBit(GPIOC, GPIO_Pin_5, 1);
EXTI_ClearITPendingBit(EXTI_Line3); /* Clear Flag */
}
}