使用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条回答
809659312
1楼-- · 2019-07-22 11:16
RTC设置闹钟的时候,并不需要void RTCAlarm_IRQHandler(void)相关的中断函数,只需要在开启秒中断的时候开启闹钟中断就行了,闹钟中断处理都在void RTC_IRQHandler(void) 里面去处理就行
wwjdwy
2楼-- · 2019-07-21 05:50
 精彩回答 2  元偷偷看……
wwjdwy
3楼-- · 2019-07-21 06:58
发现问题了,不能使用 // PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能

所以RTC闹钟唤醒时候不能使用WakeUpPin 唤醒,二者只能有一个使用。
不知道有人遇到过么,还是我设置的问题
正点原子
4楼-- · 2019-07-21 09:19
谢谢分享
wwjdwy
5楼-- · 2019-07-21 13:53
回复【4楼】正点原子:
---------------------------------
原子哥你也觉得二者只能用其中一个?我很不理解,ST不会这样设计吧
而且在官方文档中对此也没提到过。
正点原子
6楼-- · 2019-07-21 17:17
回复【5楼】wwjdwy:
---------------------------------
我没这么用过,所以目前为未知状态.

一周热门 更多>