你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
samtu 提问时间:2017-6-12 20:34 /
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_LSI  LSI_VALUE  RCC_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_Event  EXTI_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 interrput  PWR_Regulator_LowPower PWR_Regulator_ON       
}

收藏 评论9 发布时间:2017-6-12 20:34

举报

9个回答
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
我搞好了,都是那个中断函数里面太多东西了,只要一个清除标志,其它的都不要就OK了
s海文 回答时间:2019-11-15 10:12:04
你参考下你的代码吗?我的中断无论设置闹钟是多久,都是1分钟才中断,很古怪!
s海文 回答时间:2019-11-15 10:12:32

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版