中级会员
 
- 积分
- 294
- 金钱
- 294
- 注册时间
- 2018-5-3
- 在线时间
- 69 小时
|
2金钱
F030 c8t6进入STOP模式后,采用RTC唤醒一次后就直接死机了,后来就被看门狗复位了。进入stop模式后,在RTC中断中点亮LED,在主程序中熄灭,但是发现没有熄灭,等一会就直接复位了。这是为什么???
I2C_wakeup();
rtc_init();//RTC初始化
rtc_wakeup_system(1);//RTC中断设置
system_entry_sleep();//进入休眠
system_init();
void rtc_init() //正常运行时采用HSI
{
RTC_InitTypeDef RTC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_LSICmd(ENABLE);//LSI 开启
while (RCC_GetFlagStatus( RCC_FLAG_LSIRDY)==RESET)
{
}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//设选择 LSI 作为 RTC 时钟
RTC_InitStruct.RTC_HourFormat=RTC_HourFormat_24;
RTC_InitStruct.RTC_AsynchPrediv = (uint32_t)0x7F;
RTC_InitStruct.RTC_SynchPrediv = (uint32_t)0xFF;
RTC_Init(&RTC_InitStruct);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();//等待RTC寄存器同步
}
void rtc_wakeup_system(uint8_t seconds)
{
RTC_DateTypeDef RTC_DateStruct;
RTC_TimeTypeDef RTC_TimeStruct;
RTC_AlarmTypeDef RTC_AlarmStruct;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/*RTC_DateStruct.RTC_Date=0;
RTC_DateStruct.RTC_Year=0;
RTC_DateStruct.RTC_Month=0;
RTC_TimeStruct.RTC_Seconds=0;
RTC_TimeStruct.RTC_Minutes=0;
RTC_TimeStruct.RTC_Hours=0;
*/
RTC_AlarmStruct.RTC_AlarmDateWeekDay=4;
RTC_AlarmStruct.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_Date;
RTC_AlarmStruct.RTC_AlarmMask=RTC_AlarmMask_Hours|RTC_AlarmMask_Minutes|RTC_AlarmMask_DateWeekDay;
RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds=seconds;
RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct);
RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
RTC_AlarmCmd(RTC_Alarm_A,DISABLE);
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStruct);
RTC_AlarmCmd(RTC_Alarm_A,ENABLE);
RTC_ClearITPendingBit(RTC_IT_ALRA);
RTC_ITConfig(RTC_IT_ALRA,ENABLE);
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);
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void rtc_disable(void)
{
RTC_AlarmCmd(RTC_Alarm_A,DISABLE);
RTC_ITConfig(RTC_IT_ALRA,DISABLE);
}
void RTC_IRQHandler()
{
if(RTC_GetITStatus(RTC_IT_ALRA)!=RESET)
{
LED_Display(0,0,0,0);
rtc_disable();
RTC_ClearITPendingBit(RTC_IT_ALRA);
}
// rtc_disable();
RTC_ClearITPendingBit(RTC_IT_WUT);
//RTC_ClearITPendingBit(RTC_IT_ALRA );
EXTI_ClearITPendingBit(EXTI_Line17);
}
void system_entry_sleep(void)
{
//使能电源接口时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, DISABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
LED_Display(1,1,1,1);
// PWR_EnterSleepMode(PWR_SLEEPEntry_WFI);
}
|
|