使用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条回答
lazebird
1楼-- · 2019-07-21 21:43
 精彩回答 2  元偷偷看……
hack906447
2楼-- · 2019-07-21 23:58
回复【3楼】wwjdwy:
---------------------------------
大神不知道你是否知道该如何再原子rtc实验中单纯的增加闹钟功能
IE时代
3楼-- · 2019-07-22 05:37
回复【8楼】hack906447:
---------------------------------
在rtc初始化函数中开启闹钟中断 然后在编写一个向南中寄存器写定时值的函数 每次用USMART调用这个函数设定闹铃时间即可,自己研究的 方法可能有些笨仅供参考
莫非。
4楼-- · 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
手册也有提到的,这是一个或门


ZTO13
5楼-- · 2019-07-22 13:27
 精彩回答 2  元偷偷看……
czr27
6楼-- · 2019-07-22 14:11
我遇到了相同的问题
同时采用alarm 和 wkup唤醒standby模式,有时alarm到了会醒不来
我又测休眠前保证PA0为低电平,这样PA0变为高电平直接唤醒,或者RTC时间到也唤醒就好像没问题
如果休眠前PA0高电平,可能会导致alarm唤不醒的情况

你们测下是不是这样

一周热门 更多>