打印
[应用相关]

RTC和毫秒问题

[复制链接]
6780|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芯片吗?

使用特权

评论回复
5
香水城| | 2009-8-11 10:13 | 只看该作者
回4楼,你所谓的专用RTC芯片都有哪些功能?

使用特权

评论回复
6
starrysky0228| | 2009-8-11 10:26 | 只看该作者
5# 香水城
像一般的时钟芯片4543(外加)、DS12887。他们有独立的电源,有片内掉电保护,能按年,月,日,润年格式输出。年内误差小于10S。请问STM32的RTC能否代替专用的RTC芯片?谢谢。。。。想省20多块的成本。

使用特权

评论回复
7
jinjing999|  楼主 | 2009-8-12 13:48 | 只看该作者
可以替代普通的时钟芯片。

时钟的精度,取决于外部的晶振的精度。
比如你用32.768K晶振
它是用一个分频器记录外部晶振的振动次数,然后达到32768后,还有一个计数器加一(相当于秒)。
32768数值可以任意设置。

使用特权

评论回复
8
seawwh| | 2009-8-24 18:20 | 只看该作者
请问搂主如何解决STM32 RTC 与外部的秒脉冲精密同步问题的?
谢谢!

是不是在秒脉冲来临的时候重写RTC_PRLH / RTC_PRLL,来导致RTC_DIVH / RTC_DIVL重新加载?
我碰到的类似的问题,需要用GPS的1PPS信号同步,STM32

使用特权

评论回复
9
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)

呵呵还需要验证啊,我初步测试了,好像没有问题。我现在把对时所有的代码做完,在重新测试。
不知道楼上有什么好的方法,不妨提供参考。如果你是按照这个方法,你测试后,不妨告诉我这个方法可行不?

使用特权

评论回复
10
fqingy2003| | 2009-8-25 15:09 | 只看该作者
你不可能用RTC作毫秒,除非你先复位RTC,否则DIV的数据无法清除,也就是说如果RTC的DIV刚刚重载,你写入的PRL值是不起作用的,如果按照你的方法,在秒脉冲撤销后,你会发现你的时钟跑的欢快,再说了,PRL的值是不需要更改的,秒脉冲到时产生中断,中断响应后重新初始化RTC才能真正的完成秒对时

使用特权

评论回复
11
jinjing999|  楼主 | 2009-8-27 11:48 | 只看该作者
我也发现问题,以上的做法不对?可在中断里复位RTC会有问题。我看过RTC复位程序有延时啊

使用特权

评论回复
12
jinjing999|  楼主 | 2009-8-27 11:57 | 只看该作者
在中断里用哪个含数,重新启动时钟,让时钟和毫秒对起来?

使用特权

评论回复
13
fqingy2003| | 2009-8-27 13:12 | 只看该作者
延时那是肯定的,需要简练,不要过多的访问RTC,复位后直接写数据,1ms要执行很多语句的了,但对于写RTC,时间就长了,但是毫秒精度是没有问题的

使用特权

评论回复
14
ddb_21ic| | 2009-8-27 14:03 | 只看该作者
好像没意义
就算你现在RTC时间误差消除了,对10ppm的晶振,1000s就会有10ms的误差了
要绝对精度高,我觉得直接读GPS好一点,这样误差能够准确的计算出来
不然,RTC和你的秒脉冲同步之后运行一段时间,累积误差是个不可控的结果
难道说过几个小时就要接上再同步一次?

使用特权

评论回复
15
jinjing999|  楼主 | 2009-8-27 17:03 | 只看该作者
理论上一秒都会对时一下,有专门的对时装置,它会再秒到来时候,给一个脉冲信号,随后串口传送年月日,时间信息。

使用特权

评论回复
16
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怎么复位啊?

使用特权

评论回复
17
ddb_21ic| | 2009-8-28 00:33 | 只看该作者
像你15楼说的那样,何必还要RTC呢?
直接用你的秒脉冲计数,这样就没有误差累积。
也不需要再对RTC的计数器进行操作了。

使用特权

评论回复
18
ddb_21ic| | 2009-8-28 00:35 | 只看该作者
还可以用秒脉冲触发一个定时器,这样相对精度到us都没问题
就只与秒脉冲的精度有关了,LSE都不需要了

使用特权

评论回复
19
jinjing999|  楼主 | 2009-8-28 11:08 | 只看该作者
看来,用时钟和外部脉冲秒时间对齐,这个方法是不可行的
只有采用楼上大哥的方法了

使用特权

评论回复
20
150123lijing| | 2017-6-14 15:07 | 只看该作者
请问最后是如何解决的

使用特权

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

本版积分规则

73

主题

363

帖子

1

粉丝