STM32RTC

tomlinson   2009-4-22 14:21 楼主
void RTC_Configuration(void)
{
  u32 delay; 
   /* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  /* Allow access to BKP Domain */
  PWR_BackupAccessCmd(ENABLE);

  /* Reset Backup Domain */
  BKP_DeInit();

 do 
  { 
       //delay about 0.1ms  
      for(delay = 0;delay < 5000;delay++); 
       // Enable HSE 
     RCC_LSEConfig(RCC_LSE_ON); 
  }
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);  
  // Select HSE as RTC Clock Source
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);  

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

#ifdef RTCClockOutput_Enable  
  /* Disable the Tamper Pin */
  BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper
                               functionality must be disabled */
                               
  /* Enable RTC Clock Output on Tamper Pin */
  BKP_RTCCalibrationClockOutputCmd(ENABLE);
#endif 

  /* Wait for RTC registers synchronization */
  RTC_WaitForSynchro();

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  
  /* Enable the RTC Second */  
  RTC_ITConfig(RTC_IT_SEC, ENABLE);

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  
  /* Set RTC prescaler: set RTC period to 1sec */
  RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
  //RTC_SetPrescaler(62499); /* RTC period = RTCCLK/RTC_PR = (8M/128=62.5kHz)/(62499+1) */
    
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  
  /* To output second signal on Tamper pin, the tamper functionality
       must be disabled (by default this functionality is disabled) */
  BKP_TamperPinCmd(DISABLE);

  /* Enable the RTC Second Output on Tamper Pin */
  BKP_RTCOutputConfig(BKP_RTCOutputSource_Second);
  
}

仅仅修改使用外部低速晶振后,CPU状态指示灯的关启周期由2秒变为8.4秒,请问为什么?

回复评论 (7)

修改后

/********************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
********************************************************************/
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if (HSEStartUpStatus == SUCCESS) {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while (RCC_GetSYSCLKSource() != 0x08)
    {}
  }
}
/********************************************************************
* Function Name  : RTC_Configuration
* Description    : Configures the RTC.
* Input          : None
* Output         : None
* Return         : None
********************************************************************/
void RTC_Configuration(void)
{
    u32 delay; 
    /* Enable PWR and BKP clocks */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    /* Allow access to BKP Domain */
    PWR_BackupAccessCmd(ENABLE);

    /* Reset Backup Domain */
    BKP_DeInit();

    // Select HSE/128 as RTC Clock Source
    RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);  

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


    /* Wait for RTC registers synchronization */
    RTC_WaitForSynchro();

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
  
    /* Enable the RTC Second */  
    RTC_ITConfig(RTC_IT_SEC, ENABLE);

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
  
    /* Set RTC prescaler: set RTC period to 1sec */
    RTC_SetPrescaler(62499); /* RTC period = RTCCLK/RTC_PR = (8M/128=62.5kHz)/(62499+1) */
    
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
  
    /* To output second signal on Tamper pin, the tamper functionality
        must be disabled (by default this functionality is disabled) */
    BKP_TamperPinCmd(DISABLE);

    /* Enable the RTC Second Output on Tamper Pin */
    BKP_RTCOutputConfig(BKP_RTCOutputSource_Second);

#ifdef RTCClockOutput_Enable  
    /* Disable the Tamper Pin */
    BKP_TamperPinCmd(DISABLE);    /* To output RTCCLK/64 on Tamper pin, the tamper
                                functionality must be disabled */
    /* Enable RTC Clock Output on Tamper Pin */
    BKP_RTCCalibrationClockOutputCmd(ENABLE);
#endif 
}

点赞  2009-4-22 14:42

哪家公司的6pF晶振?

                                 .
点赞  2009-4-22 14:48

3楼的

                                 本帖是为大客户专门贴出的,为他们修改代码,与晶振无关,客户的系统运行已经正常,只是时钟源设置不正确。
点赞  2009-4-22 14:57

这是我使用RTC产生1s中断的例程

时钟源使用的是:HSE/128。
相关链接:https://bbs.eeworld.com.cn/upfiles/img/20094/2009422152718171.zip
点赞  2009-4-22 15:30

你的外部晶振频率是多少?

                                 转用外部低速晶振之前,RTC的时钟是什么?频率多少?
点赞  2009-4-22 17:09

楼主不见了?

按照你提供的电话打过去,但没有人接。

出差了???
点赞  2009-4-23 17:56

我所附的代码就是他们想要的

                                 问题已经解决。
点赞  2009-4-23 20:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复