中级会员
 
- 积分
- 215
- 金钱
- 215
- 注册时间
- 2016-5-19
- 在线时间
- 26 小时
|
20金钱
各位大佬门们好,小弟遇到了非常难的问题,希望各位大佬帮忙解决。
我使用的是 STM32F429 如果不进入待机模式的话,RTC闹钟能够 通过设定的时间闹钟,现在问题是,进入待机模式后 不能够闹钟唤醒 ,附上代码。。。。
NVIC_InitTypeDef NVIC_InitStructure;
//设置时间
ErrorStatus RTC_Set_Time(u8 hour,u8 min,u8 sec,u8 ampm)
{
RTC_TimeTypeDef RTC_TimeTypeInitStructure;
RTC_TimeTypeInitStructure.RTC_Hours=hour;
RTC_TimeTypeInitStructure.RTC_Minutes=min;
RTC_TimeTypeInitStructure.RTC_Seconds=sec;
RTC_TimeTypeInitStructure.RTC_H12=ampm;
return RTC_SetTime(RTC_Format_BIN,&RTC_TimeTypeInitStructure);
}
//设置日期
ErrorStatus RTC_Set_Date(u8 year,u8 month,u8 date,u8 week)
{
RTC_DateTypeDef RTC_DateTypeInitStructure;
RTC_DateTypeInitStructure.RTC_Date=date;
RTC_DateTypeInitStructure.RTC_Month=month;
RTC_DateTypeInitStructure.RTC_WeekDay=week;
RTC_DateTypeInitStructure.RTC_Year=year;
return RTC_SetDate(RTC_Format_BIN,&RTC_DateTypeInitStructure);
}
//初始化
void My_RTC_Init(void)
{
RTC_InitTypeDef RTC_InitStructure;
u16 retry=0X1FFF;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_BackupAccessCmd(ENABLE);
if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050)
{
RCC_LSEConfig(RCC_LSE_ON);//LSE
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{
retry++;
Delay_ms(10);
}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //
RCC_RTCCLKCmd(ENABLE); //
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
RTC_InitStructure.RTC_SynchPrediv = 0xFF;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
RTC_Init(&RTC_InitStructure);
RTC_Set_Time(23,58,10,RTC_H12_AM);
RTC_Set_Date(14,5,5,1);
RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050);
}
}
//闹钟设置
void RTC_Set_AlarmA(u8 hour,u8 min,u8 sec)
{
EXTI_InitTypeDef EXTI_InitStructure;
RTC_AlarmTypeDef RTC_AlarmTypeInitStructure;
RTC_TimeTypeDef RTC_TimeTypeInitStructure;
RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//
RTC_TimeTypeInitStructure.RTC_Hours=hour;//
RTC_TimeTypeInitStructure.RTC_Minutes=min;//
RTC_TimeTypeInitStructure.RTC_Seconds=sec;//
RTC_TimeTypeInitStructure.RTC_H12=RTC_H12_AM;
RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDay=1;//
RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_WeekDay;//
RTC_AlarmTypeInitStructure.RTC_AlarmMask=RTC_AlarmMask_DateWeekDay;//
RTC_AlarmTypeInitStructure.RTC_AlarmTime=RTC_TimeTypeInitStructure;
RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmTypeInitStructure);
RTC_ClearITPendingBit(RTC_IT_ALRA);//
EXTI_ClearITPendingBit(EXTI_Line17);//
RTC_ITConfig(RTC_IT_ALRA,ENABLE);//
RTC_AlarmCmd(RTC_Alarm_A,ENABLE);//
EXTI_InitStructure.EXTI_Line = EXTI_Line17;//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_Alarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//
NVIC_Init(&NVIC_InitStructure);//
}
//进入待机模式
void My_Sys_Enter_Standby(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
RCC_BackupResetCmd(ENABLE);//使能备份区域
PWR_BackupAccessCmd(ENABLE); //后备区域访问使能
PWR_ClearFlag(PWR_FLAG_SB);//清楚待机模式标志
RTC_WriteProtectionCmd(DISABLE);//关闭RTC写保护
RTC->TR &= 0xffffcfff; //关闭闹钟AB中断
// RTC_ITConfig(RTC_IT_WUT|RTC_IT_ALRA|RTC_IT_TS|RTC_IT_ALRB|RTC_IT_TAMP,DISABLE);//
RTC_ClearFlag(RTC_FLAG_ALRAF|RTC_FLAG_ALRBF|RTC_FLAG_WUTF|RTC_FLAG_TSF|RTC_FLAG_TAMP1F);//清楚相关标志位
PWR_ClearFlag(PWR_FLAG_WU);//清除唤醒标志
RTC_WriteProtectionCmd(ENABLE);//使能RTC写保护
RTC->TR |=0x00003000;//开启闹钟AB中断
// RTC_ITConfig(RTC_IT_WUT|RTC_IT_ALRA|RTC_IT_TS|RTC_IT_ALRB|RTC_IT_TAMP,ENABLE);//
PWR_EnterSTANDBYMode();//进入待机模式
}
//闹钟中断函数
void RTC_Alarm_IRQHandler(void)
{
if(RTC_GetFlagStatus(RTC_FLAG_ALRAF)==SET)//ALARM A
{
RTC_ClearFlag(RTC_FLAG_ALRAF);//
}
LED_9_ON;//灯亮
EXTI_ClearITPendingBit(EXTI_Line17); //
}
int main()
{
if(PWR_GetFlagStatus(PWR_FLAG_SB) ==SET)
{
PWR_ClearFlag(PWR_FLAG_SB);
}
LED_GPIO_Config();
My_RTC_Init();
RTC_Set_AlarmA(23,58,20);//设定的闹钟, RTC_Set_Time(23,58,10,RTC_H12_AM); 过10秒后闹钟
int i=1;
while(1)//
{
LED_9_Reverse;//led亮灭交换
Delay(0xffffff);//大约一秒
i++;
if(i % 6 == 0) //大约过了六秒进入待机模式
{
My_Sys_Enter_Standby();
}
}
}
问题:此后一直进入待机模式,跪求大佬问题出现哪里了。
|
最佳答案
查看完整内容[请看2#楼]
铁子们,调试出来,其中有几个错误,要修改下
//进入待机模式
void My_Sys_Enter_Standby(void) 函数 中 RTC->TR &= 0xffffcfff; //关闭闹钟AB中断 RTC->TR |=0x00003000;//开启闹钟AB中断 修改为 RTC->CR &= 0xffffcfff; //关闭闹钟AB中断 RTC->CR |=0x00003000;//开启闹钟AB中断
其中把 RCC_BackupResetCmd(ENABLE);//使能备份区域 其实为复位备份区域 在 My_Sys_Enter_Standby(void) 函数 中 ...
|