[应用相关] RTC和毫秒问题

[复制链接]
7779|19
 楼主| jinjing999 发表于 2009-7-29 09:07 | 显示全部楼层 |阅读模式
我的项目中需要,而且对时精度是1 ms。
我是用系统内部的滴答(1 ms),来计算毫秒。可现在问题,如果对时的话,有可能上位机软件对时出现毫秒,比如300ms,怎么对时使秒信息和毫秒信数据对到一块?就是秒中断的时候,毫秒计数也到1000MS?
我发现RTC的晶振只精确到1秒,如果对时使300毫秒,我是不是先校验毫秒,然后等到滴答到1000毫秒后,修改RTC的时间?
 楼主| jinjing999 发表于 2009-8-8 16:29 | 显示全部楼层
没有人回答吗?
我看料RTC时钟了,发现与毫秒对时还真的有问题。

也许我表达不清晰。
对时时间到,比如一个秒脉冲线,我的怎样调整秒设置啊,把秒的开始时间定在开始时间。
 楼主| jinjing999 发表于 2009-8-10 15:04 | 显示全部楼层
没有人回答

我也知道怎么做了
starrysky0228 发表于 2009-8-11 10:03 | 显示全部楼层
3# jinjing999
STM32的RTC,可以替代专用的RTC芯片吗?
香水城 发表于 2009-8-11 10:13 | 显示全部楼层
回4楼,你所谓的专用RTC芯片都有哪些功能?
starrysky0228 发表于 2009-8-11 10:26 | 显示全部楼层
5# 香水城
像一般的时钟芯片4543(外加)、DS12887。他们有独立的电源,有片内掉电保护,能按年,月,日,润年格式输出。年内误差小于10S。请问STM32的RTC能否代替专用的RTC芯片?谢谢。。。。想省20多块的成本。
 楼主| jinjing999 发表于 2009-8-12 13:48 | 显示全部楼层
可以替代普通的时钟芯片。

时钟的精度,取决于外部的晶振的精度。
比如你用32.768K晶振
它是用一个分频器记录外部晶振的振动次数,然后达到32768后,还有一个计数器加一(相当于秒)。
32768数值可以任意设置。
seawwh 发表于 2009-8-24 18:20 | 显示全部楼层
请问搂主如何解决STM32 RTC 与外部的秒脉冲精密同步问题的?
谢谢!

是不是在秒脉冲来临的时候重写RTC_PRLH / RTC_PRLL,来导致RTC_DIVH / RTC_DIVL重新加载?
我碰到的类似的问题,需要用GPS的1PPS信号同步,STM32
 楼主| jinjing999 发表于 2009-8-25 09:46 | 显示全部楼层
呵呵

我正在测试,我现在就是秒脉冲来了直接用对时
RTC_WaitForLastTask();
  //Set RTC prescaler: set RTC period to 1sec
RTC_SetPrescaler(32767); // RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)

如果出现对时信息,需要对到毫秒的精度,可以用下边方法去做:

temp16值0~59999,也就是59秒,999毫秒。
s_DateStructVar.u8_sec  =  temp16/1000;
temp16 = temp16%1000;//得出毫秒
temp16 = temp16*32768/1000;
RTC_WaitForLastTask();
RTC_SetPrescaler(temp16); // RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)

呵呵还需要验证啊,我初步测试了,好像没有问题。我现在把对时所有的代码做完,在重新测试。
不知道楼上有什么好的方法,不妨提供参考。如果你是按照这个方法,你测试后,不妨告诉我这个方法可行不?
fqingy2003 发表于 2009-8-25 15:09 | 显示全部楼层
你不可能用RTC作毫秒,除非你先复位RTC,否则DIV的数据无法清除,也就是说如果RTC的DIV刚刚重载,你写入的PRL值是不起作用的,如果按照你的方法,在秒脉冲撤销后,你会发现你的时钟跑的欢快,再说了,PRL的值是不需要更改的,秒脉冲到时产生中断,中断响应后重新初始化RTC才能真正的完成秒对时
 楼主| jinjing999 发表于 2009-8-27 11:48 | 显示全部楼层
我也发现问题,以上的做法不对?可在中断里复位RTC会有问题。我看过RTC复位程序有延时啊
 楼主| jinjing999 发表于 2009-8-27 11:57 | 显示全部楼层
在中断里用哪个含数,重新启动时钟,让时钟和毫秒对起来?
fqingy2003 发表于 2009-8-27 13:12 | 显示全部楼层
延时那是肯定的,需要简练,不要过多的访问RTC,复位后直接写数据,1ms要执行很多语句的了,但对于写RTC,时间就长了,但是毫秒精度是没有问题的
ddb_21ic 发表于 2009-8-27 14:03 | 显示全部楼层
好像没意义
就算你现在RTC时间误差消除了,对10ppm的晶振,1000s就会有10ms的误差了
要绝对精度高,我觉得直接读GPS好一点,这样误差能够准确的计算出来
不然,RTC和你的秒脉冲同步之后运行一段时间,累积误差是个不可控的结果
难道说过几个小时就要接上再同步一次?
 楼主| jinjing999 发表于 2009-8-27 17:03 | 显示全部楼层
理论上一秒都会对时一下,有专门的对时装置,它会再秒到来时候,给一个脉冲信号,随后串口传送年月日,时间信息。
 楼主| jinjing999 发表于 2009-8-27 18:59 | 显示全部楼层
我看过手车,RTC的复位只能通过后备域复位,也就是用
RCC_BackupResetCmd(DISABLE);
可我观察寄存器,复位它RTC的DIV并没有变成零。
我用:
        BKP_DeInit();这个函数复位
实际上是:
void BKP_DeInit(void)
{
  RCC_BackupResetCmd(ENABLE);
  RCC_BackupResetCmd(DISABLE);
}
复位RTC怎么复位啊?
ddb_21ic 发表于 2009-8-28 00:33 | 显示全部楼层
像你15楼说的那样,何必还要RTC呢?
直接用你的秒脉冲计数,这样就没有误差累积。
也不需要再对RTC的计数器进行操作了。
ddb_21ic 发表于 2009-8-28 00:35 | 显示全部楼层
还可以用秒脉冲触发一个定时器,这样相对精度到us都没问题
就只与秒脉冲的精度有关了,LSE都不需要了
 楼主| jinjing999 发表于 2009-8-28 11:08 | 显示全部楼层
看来,用时钟和外部脉冲秒时间对齐,这个方法是不可行的
只有采用楼上大哥的方法了
150123lijing 发表于 2017-6-14 15:07 | 显示全部楼层
请问最后是如何解决的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

363

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部