sunshuguang 发表于 2017-4-27 17:21:57

关于STM32的RTC闹钟休眠唤醒

如题,本人在测试STOP模式下闹钟唤醒,发现唤醒间隙不一致,如图所示:
在非低功耗模式下,则可以获得等宽的脉冲,希望得到大神解惑。

file:///D:\Personal\Documents\Tencent Files\406178052\Image\C2C\C3967C544EC568420CF45759007E7027.jpg


zhao.zhao 发表于 2017-4-30 15:29:51

停止模式下,闹钟唤醒,要在中断唤醒后,再次初始化系统时钟的。

sunshuguang 发表于 2017-4-27 17:26:22

下面是代码:



int RTC_Init_User(void)
{   
      EXTI_InitTypeDef EXTI_InitStructure;
      NVIC_InitTypeDef NVIC_InitStructure;
   // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
      BKP_DeInit();
    //使能后备寄存器访问
    PWR_BackupAccessCmd(ENABLE);


    RCC_LSICmd(ENABLE);
      while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0) {};
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);   
    RCC_RTCCLKCmd(ENABLE);
    RTC_WaitForLastTask();
      RTC_WaitForSynchro();
    RTC_SetPrescaler(4000);
    RTC_WaitForLastTask();
      
    RTC_SetCounter(0);
    RTC_WaitForLastTask();
    RTC_SetAlarm(RTC_GetCounter()+2);//设置闹钟时间默认初始化为0.5秒钟后闹钟事件
    RTC_WaitForLastTask();
    RTC_ITConfig(RTC_IT_ALR, ENABLE);            
      RTC_WaitForLastTask();      
            
//      PWR_Cfg_User();   
            
            //闹钟中断接到第17线外部中断
    EXTI_ClearITPendingBit(EXTI_Line17);
    EXTI_InitStructure.EXTI_Line = EXTI_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 = RTCAlarm_IRQn;//闹钟唤醒
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
            
      return 0;   
}
int RTC_Cfg_User(uint8_t Alarm)
{   

      RTC_SetAlarm(RTC_GetCounter()+Alarm);//设置闹钟时间
    RTC_WaitForLastTask();
    return 0;
}


void RTCAlarm_IRQHandler()
{
    uint32_t iTemp=0;
      RTC_WaitForSynchro();
if (RTC_GetITStatus(RTC_IT_ALR) != RESET)
{

            EXTI_ClearITPendingBit(EXTI_Line17);
            RTC_WaitForLastTask();
            RTC_ClearITPendingBit(RTC_IT_ALR);
            RTC_WaitForLastTask();
            if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
            {
                PWR_ClearFlag(PWR_FLAG_WU); // 清除唤醒标志
                RTC_WaitForLastTask();
            }


            GPIO_ToggleBits(GPIO_Pin_13,GPIOC);
            RTC_SetCounter(0);
            RTC_WaitForLastTask();
            iTemp=RTC_GetCounter();
            RTC_SetAlarm((uint32_t)(iTemp+2));//设置闹钟时间默认初始化为0.5秒钟后闹钟事件
            RTC_WaitForLastTask();
            RTC_ClearITPendingBit(RTC_IT_ALR);
            RTC_WaitForLastTask();
}
}

无薪税绵 发表于 2017-5-18 08:16:10

3楼没错,没有重新初始化系统时钟。

wolfgang2015 发表于 2017-5-18 13:05:25

zhao.zhao 发表于 2017-4-30 15:29
停止模式下,闹钟唤醒,要在中断唤醒后,再次初始化系统时钟的。

正解,需要初始化始终。

长不大的小孩 发表于 2017-5-18 16:20:26

簽到簽到啦!!!!

火oooo 发表于 2017-5-18 17:17:52

长不大的小孩 发表于 2017-5-18 16:20
簽到簽到啦!!!!

这里不签到……请出门左转

cldym 发表于 2017-5-18 20:00:21

没有重新初始化系统时钟。
页: [1]
查看完整版本: 关于STM32的RTC闹钟休眠唤醒