RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);//开电源管理时钟
PWR_EnterSTANDBYMode();
对于使用STM32F0系列MCU的朋友,在调试休眠唤醒的时候发现唤醒后一直是复位状态,查看复位寄存器,也没有发现任何异常,这个我在这里友情提醒一下,不是你的代码出现了问题,也不是硬件出现了问题,你仔细看一下STM32F0系列(RM0091)的参考手册,这个是ST最权威的资料之一,你认真详细了解一下就发现问题了。
我这边是采取RTC闹钟唤醒做试验,休眠前先设置一下RTC唤醒,STANDBY待机模式下唤醒设置可以忽略掉外部中断Line17,其他的休眠模式就不要忽略掉了;
void RTC_Alarm_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// EXTI_InitTypeDef EXTI_InitStructure;
RTC_TimeTypeDef RTC_TimeStructure;
RTC_AlarmTypeDef RTC_AlarmStructure;
/* EXTI configuration *******************************************************/
// EXTI_ClearITPendingBit(EXTI_Line17);
// EXTI_InitStructure.EXTI_Line = EXTI_Line17;
// EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
// EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
// EXTI_InitStructure.EXTI_LineCmd = ENABLE;
// EXTI_Init(&EXTI_InitStructure);
/* Enable the RTC Wakeup Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RTC_ITConfig( RTC_IT_ALRA, DISABLE );
RTC_AlarmCmd(RTC_Alarm_A,DISABLE);
RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
RTC_AlarmStructure.RTC_AlarmTime.RTC_H12=RTC_H12_AM;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours=RTC_TimeStructure.RTC_Hours;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes=RTC_TimeStructure.RTC_Minutes;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=RTC_TimeStructure.RTC_Seconds+5;
if(RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds >=60)
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds-=60;
RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31;
RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay | RTC_AlarmMask_Hours|RTC_AlarmMask_Minutes;
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
RTC_ClearITPendingBit(RTC_IT_ALRA);
RTC_ITConfig(RTC_IT_ALRA, ENABLE);
RTC_AlarmCmd(RTC_Alarm_A, ENABLE);/* Enable the alarm */
}
之后是进入STANDBY模式,但是这个模式唤醒后CPU采取的是复位重启机制,所以对有保护现场数据的项目不要用这个休眠模式,改为stop模式或者SLEEP模式更适合一些;
头发少的朋友看英文不爽,我特定下面给你准备了中文的,不谢拿走!
改stop休眠模式,RTC闹钟唤醒后即为休眠前的代码段继续运行
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);//开电源管理时钟
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);