使用RTC闹钟,从待机模式唤醒的问题

2019-07-21 03:20发布

使用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();                     }

运行时进入的闹钟中断是第二个中断函数。有用过的朋友么
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
莫非。
2019-07-22 10:32
本帖最后由 莫非。 于 2017-6-14 14:59 编辑

可以的,而且,待机模式唤醒不需要中断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();
这样就可以了而且不需要使能闹钟中断
捕获.PNG
手册也有提到的,这是一个或门


一周热门 更多>