打印
[STM32F0]

STM32F030 STOP模式用RTC定时喂狗的几点注意。

[复制链接]
3878|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tuzhiquan|  楼主 | 2017-6-16 15:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1,RTC中断函数里面不要加太多的东西,就清一个标志位就OK了,
2,定时器时间的设置,如,定时2秒,如果你不在中断里面更改这个定时时间,那可能下一个时间要等59秒才到你设置的这个时间,有一个办法就是把预分频调整一下,让他的一秒比实际更快,如,你等59秒,经过你设置后,只要等3秒钟就OK了,这样就不需要在中断里面更那个时间了。
3,你同时开有IO的中断,如按键,有时按键之后,他会自己进入中断,这时一定要记住,出中断时,EXTI_DeInit();
沙发
tuzhiquan|  楼主 | 2017-6-16 15:16 | 只看该作者
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_AsynchPrediv = 88;
//   RTC_InitStruct.RTC_SynchPrediv =  (LSIFreq/100) - 1;
//    RTC_InitStruct.RTC_SynchPrediv =  255;
                     RTC_InitStruct.RTC_SynchPrediv =  25;//10=3S
    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 = 2;//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_GetTime(RTC_Format_BIN, &RTC_TIMESET);
        RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=( RTC_TIMESET.RTC_Seconds + 0x03 )%60;
//  RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=0x02;        //¶¨Ê±Ê±¼äÃë
        //RTC_AlarmSubSecondConfig(RTC_Alarm_A,RTC_AlarmSubSecondMask_None,0);//ÅäÖÃÄÖÖÓλ¼°ÑÇÃëÖµ RTC_AlarmSubSecondMask_None RTC_AlarmSubSecondMask_SS14_12  RTC_AlarmSubSecondMask_SS14_2
        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_AlarmMask_Seconds
  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       
}

使用特权

评论回复
板凳
tuzhiquan|  楼主 | 2017-6-16 15:18 | 只看该作者
RTC_SLEEP();
IWDG_ReloadCounter();//FEED WACHDOG
sleep_count1=228;
while(sleep_count1)
{
iwdg_init(0x06,0Xaaaa);

                if(exit01_stat|exit23_stat|exit415_stat)
                {
                                SystemInit();//ϵͳ³õʼ»¯£¬ÉèÖÃʱÖÓΪ48M
                                delay_init();//³õʼ»¯µÎ´ð¶¨Ê±Æ÷£¬É趨DELAYʱ¼ä       
                                TIM3_Int_Init(2400,1);//100US
                                 ADC1_Mode_Init();
                           IO_init();//
                          EXTI_DeInit();//Çå³ýEXTI£¬ÖжÏRESET£¬ÈÃÖжϲ»Îó´¥·¢¡£´Ë¾ä±Ø¼Ó

                        exit01_stat=0;
                        exit23_stat=0;
                        exit415_stat=0;
                       
                        LED100_OPEN();

                        break;
                       
                       
                }

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



}

使用特权

评论回复
地板
tuzhiquan|  楼主 | 2017-6-16 15:19 | 只看该作者
void RTC_IRQHandler(void)
{

        RTC_TimeTypeDef RTC_TIMESET;
        RTC_AlarmTypeDef RTC_AlarmStructure;
        RTC_InitTypeDef RTC_InitStruct;


        if(RTC_GetITStatus(RTC_IT_ALRA)!=0)//RTC_IT_ALRA
        {
              RTC_ClearFlag(RTC_FLAG_RSF);                       
                          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_ClearITPendingBit(RTC_IT_TS);
              RTC_ClearITPendingBit(RTC_IT_WUT);
        RTC_ClearITPendingBit(RTC_IT_ALRA);
              RTC_ClearITPendingBit(RTC_IT_TAMP1);
        RTC_ClearITPendingBit(RTC_IT_TAMP2);       
        }
}

使用特权

评论回复
5
tuzhiquan|  楼主 | 2017-6-16 15:21 | 只看该作者
本人新手,写出的代码不怎么好看,但是经过测试OK的

使用特权

评论回复
6
yingxg518| | 2020-6-3 19:10 | 只看该作者
为什么我的STM32f03 执行  PWR_EnterSTOPMode  ,MCU 就复位了重启了,是怎么回事?

使用特权

评论回复
7
hlj0755| | 2020-6-4 15:58 | 只看该作者
CKS32F051C8T6        LQFP48
CKS32F051K6U6        QFN32
CKS32F103VBT6        LQFP100
CKS32F103C8T6        LQFP48
CKS32F103CBT6        LQFP48
CKS32F103R8T6        LQFP64
CKS32F103RBT6        LQFP64
CKS32F030C6T6         LQFP48
CKS32F030R8T6        LQFP64
CKS32F030K6T6        LQFP32
CKS32F030F4P6        TSSOP20
CKS32F030C8T6        LQFP48
CKS32F031K6U6        QFN32
CKS32F031F4P6        TSSOP20
CKS32F031C6T6        LQFP48
直接替代ST   QQ286956661

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

63

帖子

1

粉丝