关于STM3210x的RTC时钟校正问题

lmcmc   2008-4-21 08:53 楼主
大虾们好:我初次用STM3210x,现在想使用它内部的RTC,前两天测试了一下它的精度,每天差10秒左右,这样计算每年差1小时。
请问如果按照手册去校正RTC,它的精度能改善到什么程度?香帅帮忙。大虾们帮忙呀!!

回复评论 (24)

STM32内置的RTC精度决定于外置晶振,芯片不产生误差

                                 简单地说STM32的RTC只是一个简单的计数器,它的任务就是对输入的RTC时钟脉冲计数,因此只要外置晶振足够准确,经校正后即能达到要求的精度。
点赞  2008-4-21 09:45

ST网站上有相关文档

当外部晶振发生温漂或者随时间变化时,有相应进行调整来保持RTC精度的方法,详情可以参考ST网站上的文档

网址为
http://www.st.com/mcu/familiesdocs-110.html
文档名为
AN2604 STM32F101xx and STM32F103xx RTC calibration  
点赞  2008-4-21 11:12

请问香帅怎么来保证外部晶振的精确?有推荐的晶振吗?

                                  
点赞  2008-4-21 16:00

STM32的数据手册中有详细信息

关于保证外部晶振的精确,STM32的数据手册中有详细信息。

推荐的晶振?你可以咨询一下晶振的代理,他们一定愿意帮忙。
点赞  2008-4-21 16:35

再谈时钟校正

看了校正手册后,感觉stm32的实时时钟应用在批量项目中不大合适。它的校正需要以下三个参数:
1.64分频后,Anti_Temper引脚的输出频率;
2.所用石英晶振的频率温度系数;
3.实际工作环境温度;

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

当然能校正点算点了,差5分钟总比差10分钟强吧,哈哈。
点赞  2008-4-24 17:03

我也测试了,确实是快,大约5S/DAY

                                 万利的板子
点赞  2008-4-25 07:33

我的大约每天快10秒,用校正程序后不起作用,可能源码有误

/*******************************************************************************
* 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();
  /*根据实际环境测量来确定校正值,这里以每月300秒来校正*/
  BKP_SetRTCCalibrationValue(120);
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
}
点赞  2008-4-25 08:45

小窍门:试试改变晶振上的两个小电容的容值

                                 如果振荡器还能启振,你将发现时钟的速度会有变化。这说明电容的容值与你选用的晶振和振荡频率间有密切关系。
点赞  2008-4-25 23:04

香帅验证过STM32的时钟校正吗?怎么我按照手册写的基本不起

 /*根据实际环境测量来确定校正值,这里以每月297秒来校正*/
  BKP_SetRTCCalibrationValue(120);
把这个值设置成多少,都是每天快10秒左右。您说的改电容应该可以。但是既然手册上能减慢时钟,怎么会不起作用呢?
点赞  2008-4-28 08:49

请问在设定RTC的寄存器时是否设置了PWR_CR中的DBP位?

                                 STM32技术参考手册中第8.1节:After reset, access to Backup registers and RTC is disabled and the Backup domain is protected against possible parasitic write access. The DBP bit must be set in the Power Control Register (PWR_CR) to enable access to the Backup registers and RTC.
点赞  2008-4-28 23:09

已经设置了呀

  /* Allow access to BKP Domain */
  PWR_BackupAccessCmd(ENABLE);
*******************************************************
见上面贴出的代码。
  这里已经设置了PWR_CR中的DBP位,根据我对程序的理解。是不是还有别的地方需要设置呢?谢谢香版主热情回答
点赞  2008-4-30 08:35

如果校正解决不了问题,那么我只有这样做

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

我的问题是硬件的硬伤,不能解决。STM32的好多技术支持都不

                                 今天从这里路过,留个言。所以大家不要靠校正而起到好的效果。准确时钟还是不要用它内部的。
点赞  2008-6-1 12:45

楼上说得对,这是个硬伤,但你解决问题的方向不对

请看我刚刚在另一帖中的叙述:RTC的原理是对输入的脉冲进行计数,所以它的精度由振荡器决定
点赞  2008-6-1 14:54

看到“侃单片机”版面有一个讨论,楼主应该看看

怎么样才能用单片机做出一个精确的时钟
 
很有借鉴作用。 
点赞  2008-6-1 18:31

时钟的问题其实看应用场合

不知道我的理解对不对:

如果是计时到1/100S, 1/10S 的应用,用软件配置的方式来做肯定有问题。如果只需要知道seconds, hours,那么MCU counter做的时钟还是能凑合的啊。

另外,对精确定时要求高的场合,还是用专用的RTC比较有保障,像M41T83 可以做到出厂精度 1ppm, 两次reflow后仍保持在5ppm以内-->这样的精度基本上可以满足包括计量在内的全部应用了。当然现在的RTC除开基本的精确计时功能,还有很多与时间/事件/电路监控相关的功能,同时,具有最重要的一点:极低的功耗,基本上都在300~500nA水平(也就是如果用一个120mAh的电池供电,可以保持时间20年以上)。

-----------------ppm <=> 时间差对照表------------------------

ppm     对应月差(s)        对应年差
2    5        1 min
4    11        2 min 12s
6    16        3 min 12s
8    21        4 min 12s
10    26        5 min 12s
20    53        10 min 36s
30    78    1 min 18s    15 min 36s
40    102    1 min 42s    20 min 24s
50    129    2 min 09s    25 min 48s
100    259    4 min 19s    51 min 48s
150    388    6 min 28s    1h 17min 36s
点赞  2008-6-2 15:24

最新发现问题,在刚进的一批STM32F101CBT6中

                                 在刚进的一批STM32F101CBT6中,同样的程序发现RTC时钟必须经过配置后才能运行,以前用STM32101C8没有这问题呀。就是每次上电运行比较经过配置,重新设置计数值才行,不然不运行。原来只配置过一次就可以了。难道又是硬伤?
点赞  2008-6-15 13:28

“每次上电后....重新设置计数值才行”

是VDD重新上电,还是Vbat重新上电?如果不重新设置计数值,RTC中读出来的是什么内容?

以前用STM32101C8时的程序与现在用STM32F101CBT6完全一样吗?
点赞  2008-6-15 14:04

完全一样,STM32F101C8可以运行

现在我调试了一下。STM32F101CBT6上电运行后,是接着上次停电的时的时钟接着走。在单片机停止运行时发现时钟并没有走。不知道那里原因,也没从手册上找到相关信息。可能我买的这批货货源不正吧,还是STM32F101CBT6有什么特殊的地方。
备份电池一直在供着。量引脚电压为3.0V。
点赞  2008-6-15 16:06
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复