你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
安 发表于 2018-3-3 13:32 resetIO时钟以后,重新设置IO时钟,并且配置外部中断。我没有看到IO口状态的配置和外部中断的配置。 ...
安 发表于 2018-3-3 15:02 进入STOP模式之前,重新配置一下对应IO时钟、中断配置。
安 发表于 2018-3-3 15:26 配置放在 RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);后面。
void Sys_Enter_Standby(void)
{
while(WK_UP==0); //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机)
printf("停机");
delay_ms(50);
RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
PWR_BackupAccessCmd(ENABLE);//后备区域访问使能
RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。
RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_ClearITPendingBit(EXTI_Line13);
// PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志
//
// PWR_WakeUpPinCmd(ENABLE);//设置WKUP用于唤醒
// PWR_EnterSTANDBYMode(); //进入待机模式
PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);
SystemInit();
}
按键的配置:
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //KEY0 KEY1 KEY2对应引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //KEY0 KEY1 KEY2对应引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOE2,3,4
}
外部中断的配置
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource0);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void Sys_Enter_Standby(void)
{
SystemInit();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); /* 84MHZ*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_SYSCFG, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOA, ENABLE);
KEY_Init(); //这个是配置按键IO口的函数
EXTI_Configuration(); //这个是配置中断的函数
printf("停机,重新配置");
delay_ms(50);
RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
// PWR_BackupAccessCmd(ENABLE);//后备区域访问使能
RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。
RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_ClearITPendingBit(EXTI_Line13);
EXTI_ClearITPendingBit(EXTI_Line2);
// PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志
//
// PWR_WakeUpPinCmd(ENABLE);//设置WKUP用于唤醒
// PWR_EnterSTANDBYMode(); //进入待机模式
PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);
SystemInit();
}
还是不能唤醒。。
void Sys_Enter_Standby(void)
{
while(WK_UP==0); //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机)
printf("停机,重新配置");
delay_ms(50);
RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口
SystemInit();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); /* 84MHZ*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_SYSCFG, ENABLE);/* 168MHZ */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOA, ENABLE);
KEY_Init(); /* 按键配置 */
EXTI_Configuration(); /* 外部中断配置 */
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。
RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_ClearITPendingBit(EXTI_Line13);
EXTI_ClearITPendingBit(EXTI_Line2);
PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);
}
/* Configure PC13 pin as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Connect EXTI Line13 to PC13 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
/* EXTI configuration *********************************************************/
EXTI_ClearITPendingBit(EXTI_Line13);
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable the RTC Alarm Interrupt */
Std_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
EXTI_ClearITPendingBit(EXTI_Line13);