samtu 发表于 2017-6-12 20:34:45

STM32F030 RTC 是不是不能中断循环?

STM32F030 的RTC 定时3秒,进入中断后,清除所有标志位,再重设定时时间3秒,后开闹钟,竟然不能再进中断?这个是为什么

if(RTC_GetITStatus(RTC_IT_ALRA)!=0)//RTC_IT_ALRA
        {

        }
        RCC_LSICmd(DISABLE);//OPEN LSI
        RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//ÄÖÖÓʹÄÜ
        RTC_ITConfig(RTC_IT_ALRA, DISABLE);//ÖжÏÅäÖÃ
       
                       RTC_ClearFlag(RTC_FLAG_ALRAF);//alarm flag
              RTC_ClearFlag(RTC_FLAG_WUTF);//WakeUp Timer flag       
                          RTC_ClearFlag(RTC_FLAG_TAMP2F);
                                RTC_ClearFlag(RTC_FLAG_TAMP1F);
                                RTC_ClearFlag(RTC_FLAG_TSOVF);
                                RTC_ClearFlag(RTC_FLAG_TSF);
                                RTC_ClearFlag(RTC_FLAG_RSF);                       
                       
      RTC_ClearITPendingBit(RTC_IT_TS);
              RTC_ClearITPendingBit(RTC_IT_WUT);
      RTC_ClearITPendingBit(RTC_IT_ALRA);
              RTC_ClearITPendingBit(RTC_IT_TAMP1);
      RTC_ClearITPendingBit(RTC_IT_TAMP2);       
       
       
       
       
           sleeptemp1=11;
       
        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//DOGдʹÄÜ 0X5555
        IWDG_SetPrescaler(0X7);//Ô¤·ÖƵ
        IWDG_SetReload(0XAAAA);//×°ÔØÖµ
        IWDG_ReloadCounter();//0XAAAA
        IWDG_Enable();//¿ªÆôDOG
       
        EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line2 | EXTI_Line4 | EXTI_Line1 | EXTI_Line17);   // ?? EXIT ????


                  RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//RTC-CR-ALARM ¹ØµôÄÖÖÓ
    RTC_TIMESET.RTC_H12   = RTC_H12_AM;
    RTC_TIMESET.RTC_Hours   = 0x02;
    RTC_TIMESET.RTC_Minutes = 0x00;
    RTC_TIMESET.RTC_Seconds = 0x02;
    RTC_SetTime(RTC_Format_BIN, &RTC_TIMESET);
                       
                       RTC_SLEEP();
                       sleeptemp1=1;
                       RTC_ITConfig(RTC_IT_ALRA, ENABLE);//ÖжÏÅäÖÃ

}

void RTC_CONFIG(void)
{
RTC_InitTypeDef RTC_InitStruct;
RTC_TimeTypeDef RTC_TIMESET;
       
       

        int LSIFreq=40000;
        RTC_INT();
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//open the clock
        PWR_BackupAccessCmd(ENABLE);//POWER OPEN
        PWR_ClearFlag(PWR_FLAG_WU);
        RCC_LSICmd(ENABLE);//OPEN LSI
       
          /* Wait till LSI is ready */
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
{}

/* Check if the StandBy flag is set */
if (PWR_GetFlagStatus(PWR_FLAG_SB) != RESET)
{               
    /* Clear StandBy flag */
    PWR_ClearFlag(PWR_FLAG_SB);

    /* Check if the StandBy flag is cleared */
    if (PWR_GetFlagStatus(PWR_FLAG_SB) != RESET)
    {
      while(1);
    }
                              IWDG_ReloadCounter();//FEED WACHDOG
    RTC_WaitForSynchro();

    /* No need to configure the RTC as the RTC config(clock source, enable,
    prescaler,...) are kept after wake-up from STANDBY */
}
else
{      
    /* RTC Configuration ******************************************************/
    /* Reset Backup Domain */
    RCC_BackupResetCmd(ENABLE);
    RCC_BackupResetCmd(DISABLE);

    /* Select the RTC Clock Source */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//4000

    /* Enable the RTC Clock */
    RCC_RTCCLKCmd(ENABLE);

    /* Wait for RTC APB registers synchronisation */
    RTC_WaitForSynchro();
                        IWDG_ReloadCounter();//FEED WACHDOG
    /* Get the LSI frequency:TIM14 is used to measure the LSI frequency */   
    //LSIFreq = GetLSIFrequency();

    RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
    RTC_InitStruct.RTC_AsynchPrediv = 127;
//   RTC_InitStruct.RTC_SynchPrediv =(LSIFreq/100) - 1;
   RTC_InitStruct.RTC_SynchPrediv =255;
    RTC_Init(&RTC_InitStruct);

    /* Set the time to 01h 00mn 00s AM */
    RTC_TIMESET.RTC_H12   = RTC_H12_AM;
    RTC_TIMESET.RTC_Hours   = 0x02;
    RTC_TIMESET.RTC_Minutes = 0x00;
    RTC_TIMESET.RTC_Seconds = 0x00;
               
               
                        IWDG_ReloadCounter();//FEED WACHDOG
    RTC_SetTime(RTC_Format_BIN, &RTC_TIMESET);
}   
//RTC_DeInit();//³õʼ»¯RTC¸÷¼Ä´æÆ÷Ϊ³õÖµ
//       
//        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//4000 RCC_RTCCLKSource_LSILSI_VALUERCC_RTCCLKSource_LSI
//        RCC_RTCCLKCmd(ENABLE);//ENABLE rtc CLOCK
}
void RTC_INT(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;IWDG_ReloadCounter();//FEED WACHDOG
      /* Configure EXTI Line17(RTC Alarm) to generate an interrupt on rising edge */
      EXTI_ClearITPendingBit(EXTI_Line17);//¡¢¡¢RTC_IRQn
      EXTI_InitStructure.EXTI_Line = EXTI_Line17;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI_Mode_EventEXTI_Mode_Interrupt
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);
IWDG_ReloadCounter();//FEED WACHDOG
      /* Enable the RTC Interrupt */
      NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;//TIM17_IRQn
      NVIC_InitStructure.NVIC_IRQChannelPriority = 1;//NVIC_IRQChannelPriority
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
             
      NVIC_Init(&NVIC_InitStructure);       
        //EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line2 | EXTI_Line4 | EXTI_Line1 | EXTI_Line17);   // ?? EXIT ????
IWDG_ReloadCounter();//FEED WACHDOG

}
void RTC_SLEEP(void)
{
RTC_AlarmTypeDef RTC_AlarmStructure;
        RTC_TimeTypeDef RTC_TIMESET;
RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//RTC-CR-ALARM ¹ØµôÄÖÖÓ
        IWDG_ReloadCounter();//FEED WACHDOG
        RTC_GetTime(RTC_Format_BIN, &RTC_TIMESET);
       
       
        RTC_AlarmStructure.RTC_AlarmTime.RTC_H12=RTC_H12_AM;//0
        RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours=0x02;
        RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes=0x00;
//        RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=( RTC_TIMESET.RTC_Seconds + 0x3b )%60;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=0x02;        //¶¨Ê±Ê±¼äÃë
       
       
        IWDG_ReloadCounter();//FEED WACHDOG
        RTC_AlarmStructure.RTC_AlarmDateWeekDay = 31;
RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay | RTC_AlarmMask_Hours | RTC_AlarmMask_Minutes;
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
       
          /* Clear RTC Alarm Flag */
RTC_ClearFlag(RTC_FLAG_ALRAF);
       
       
        RTC_ClearFlag(RTC_FLAG_ALRAF);//alarm flag
        RTC_ClearFlag(RTC_FLAG_WUTF);//WakeUp Timer flag       
        RTC_ClearITPendingBit(RTC_IT_TS);
        RTC_ClearITPendingBit(RTC_IT_ALRA);
        RTC_ClearITPendingBit(RTC_IT_TAMP1);
        RTC_ClearITPendingBit(RTC_IT_TAMP2);
        /* Enable RTC Alarm A Interrupt: this Interrupt will wake-up the system from
STANDBY mode (RTC Alarm IT not enabled in NVIC) */
RTC_ITConfig(RTC_IT_ALRA, ENABLE);

/* Enable the Alarm A */
RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
IWDG_ReloadCounter();//FEED WACHDOG
/* Clear RTC Alarm Flag */
//RTC_ClearFlag(RTC_FLAG_ALRAF);
//        EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line2 | EXTI_Line4 | EXTI_Line1 | EXTI_Line17);   // ?? EXIT ????
// PWR_EnterSTANDBYMode();

//   PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);//WFI=every interrputPWR_Regulator_LowPower PWR_Regulator_ON       
}

samtu 发表于 2017-6-12 20:36:37

我这里没进STOP模式,先测试RTC中断,就出现问题,只能进一次,不能再进。

别人说是标志位没清,所以我把所有的标志位都清了。也没有用

samtu 发表于 2017-6-12 20:40:27

我的目地很简单,就是想用RTC中断,在STOP模式后,称看门狗还没有把程序RESET,先在中断程序里面喂狗,再进入RTC计时后,进STOP模式如此循环?

samtu 发表于 2017-6-13 13:32:30

是不是我说得不太清楚,我再说一下我的目的:   
1,设置RTC闹钟定时2秒
2,进入STOP状态。
3,到达闹钟时间,进入中断函数,我再次在中断函数里面设置RTC闹钟定时2秒后
4进入STOP状态,…
……………一直循环

发表于 2017-6-13 14:03:12

两个问题:
1、alarm后,是否重新初始化了RTC,如果没有,下一个唤醒时间应该是用当前的RTC秒进行加。
2、可以设置为秒闹钟,其他的不要,如果不能唤醒,看一下下一分钟是否能发生中断,如果能说明RTC闹钟设置不对。

samtu 发表于 2017-6-13 14:44:09

安 发表于 2017-6-13 14:03
两个问题:
1、alarm后,是否重新初始化了RTC,如果没有,下一个唤醒时间应该是用当前的RTC秒进行加。
2、 ...

ALARM后,我把启动时的代码又重跑了一次,应当是初始化了吧,第一次是能进入中断的,但是进入一次后,再也不进了

发表于 2017-6-14 13:03:43

进入alarm之前,读一下RTC实际的时间是多少。

samtu 发表于 2017-6-14 14:22:50

:lol我搞好了,都是那个中断函数里面太多东西了,只要一个清除标志,其它的都不要就OK了

s海文 发表于 2019-11-15 10:12:04

你参考下你的代码吗?我的中断无论设置闹钟是多久,都是1分钟才中断,很古怪!

s海文 发表于 2019-11-15 10:12:32

113831537@qq.com
页: [1]
查看完整版本: STM32F030 RTC 是不是不能中断循环?