打印

再谈STM32的实时时钟校正问题

[复制链接]
6422|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
everbright|  楼主 | 2008-4-24 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看了校正手册后,感觉stm32的实时时钟应用在批量项目中不大合适。它的校正需要以下三个参数:
1.64分频后,Anti_Temper引脚的输出频率;
2.所用石英晶振的频率温度系数;
3.实际工作环境温度;

因为以上这三个参数决定了不适合在批量产品中应用它的精准时钟。这是因为1.谁能保证购买的石英晶振的频率一致?
2.谁能保证石英晶振的频率温度系数一致?
3.实际工作环境温度更没法保证.
除非这样:
1.石英晶振的频率温度系数为0,与温度没关系。这可能吗?
2.频率一致

当然能校正点算点了,差5分钟总比差10分钟强吧,哈哈。
沙发
short_long| | 2008-4-24 18:22 | 只看该作者

值得深思

费解呀

使用特权

评论回复
板凳
香水城| | 2008-4-24 20:43 | 只看该作者

楼主的观点很新颖,这是一个很头疼的问题

您有什么比较具体的好建议可以应用在批量项目中?我们非常渴望听到客户的意见和改进的方向。

也许您在使用其他产品时有更好的方法?

使用特权

评论回复
地板
everbright|  楼主 | 2008-4-25 08:44 | 只看该作者

好的方案正在想,如果内部集成温度传感器可能好些

如果集成内部温度传感器,我们可以通过测温来自动改写校正值。还有我写了个校正程序,基本上不起什么作用,以下是配置源码,不知道那里有误
/*******************************************************************************
* Function Name  : RTC_Configuration
* Description    : Configures the RTC.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RTC_Configuration(void)
{
  /* 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();

  /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {
  }
  /* Select LSE 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) */
  /*这里设置成32765即预分频值为32766为了时钟校正的需要*/
  RTC_SetPrescaler(32765); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
  
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  /*根据实际环境测量来确定校正值,这里以每月297秒来校正*/
  BKP_SetRTCCalibrationValue(120);
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
}

使用特权

评论回复
5
everbright|  楼主 | 2008-5-2 22:01 | 只看该作者

经过多天测试,校正好像不起作用,只有采用下策

首选我的解决方法不好,不推荐。如果校正能解决的话,还是用校正的好。请帮忙说一下您的校正步骤。
我采用下面的方法
1.测试大约每天快多少秒或慢多少秒(采用每周平均值);
2.因为STM32的RTC可以是每秒中断一次,可以用RTC_GetCounter()得到对秒的计数值,用RTC_SetCounter()设置计数值。所以我每天当计算出的时间是23:59:59时,我就对计数值重新设置一下,即在当前值的基础上加减测试出来的秒数。
这样就把时间的精度控制在每天快慢多秒,每年也不会差一两个小时。但是就是23:59:xx~23:59:59这段时间重复,对于有的需要时间戳的数据记录有问题。

使用特权

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

本版积分规则

21

主题

107

帖子

3

粉丝