使用RTC的秒中断来作为实时时间,同时开启闹钟中断可以从待机模式来唤醒
遇到问题:机子运行时可以出现闹钟中断,待机之后闹钟并没唤醒机子。
void RTC_Alm_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
// 配置EXTI_Line17(RTC Alarm)上升沿触发
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
static void RTC_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级1位,从优先级3位
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //先占优先级0位,从优先级4位
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该通道中断
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}
进入待机的代码:
printf("
Now is %d年 %d月 %d日 %d点 %d分 %d秒 ,星期%d
",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec,calendar.week);
RTC_SetAlarm(RTC_GetCounter() + 10);
RTC_WaitForLastTask();
Sys_Enter_Standby();
中断处理
void RTCAlarm_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
{
// user code
printf("
RTCAlarm_IRQHandler
");
printf("
Now is %d年 %d月 %d日 %d点 %d分 %d秒 ,星期%d
",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec,calendar.week);
// 清EXTI_Line17挂起位
EXTI_ClearITPendingBit(EXTI_Line17);
// 检查唤醒标志是否设置
if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
{
// 清除唤醒标志
PWR_ClearFlag(PWR_FLAG_WU);
}
RTC_WaitForLastTask();
// 清RTC报警中断挂起
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
}
}
void RTC_IRQHandler(void)
{
//RTC时钟中断
//每秒触发一次
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒钟中断
{
RTC_Get();//更新时间
}
if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断
{
RTC_ClearITPendingBit(RTC_IT_ALR); //清闹钟中断
printf("
RTC Alarm
");
printf("
Now is %d年 %d月 %d日 %d点 %d分 %d秒 ,星期%d
",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec,calendar.week);
RTC_SetAlarm(RTC_GetCounter() + 8);
RTC_WaitForLastTask();
}
RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); //清闹钟中断
RTC_WaitForLastTask();
}
运行时进入的闹钟中断是第二个中断函数。有用过的朋友么
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
可以的,而且,待机模式唤醒不需要中断17,使能wakeup引脚就可以了
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RTC_SetAlarm(RTC_GetCounter() + 60); //待机60秒
RTC_WaitForLastTask();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_WakeUpPinCmd(ENABLE);
PWR_EnterSTANDBYMode();
这样就可以了而且不需要使能闹钟中断
手册也有提到的,这是一个或门
一周热门 更多>