精确到ms的实时时间怎样做最好?

独步狼   2010-12-20 15:16 楼主


如题,RTC数秒很容易,精确到ms就不太好弄了吧?
目前我想到两种方案,一种是systick设成ms中断,每次中断变量加一,查询时间就直接查变量;另一种是RTC秒中断,在RTC_IRQHandler里作SysTick_CounterCmd(SysTick_Counter_Clear);查询时间时再把systick计数器里的值换算成ms。前一种方案计算简单但是中断频繁,后一种方案计算麻烦但是中断少,这两种方案哪个好呢?有没有不用频繁中断就能达到目的的方法呢?

回复评论 (13)

                                 还可以考虑:用RTC加Timer,RTC用于数秒,Timer用于ms计时、且可以不用中断
点赞  2010-12-20 16:30
                                 哈哈,当然是用LZ的后一种方法了,计算是由程序完成,对于你来说麻烦只有一次,以后就一劳永逸了。如果使用前一种方法,则CPU就有麻烦了,因为会频繁被中断。
点赞  2010-12-20 18:01
                                 用后一种方法比较好
点赞  2010-12-20 21:02
                                 参考2楼,systick设成1s自动重装载来记ms。现在还有一个问题,我在秒中断清systick计数器,是为了保证systick和RTC同步,如何保证这两个计数器的计时起点一致呢?即保证systick正好记到1000ms时RTC计数器+1?
点赞  2010-12-21 15:46
                                 比较倾向于后一种方案
点赞  2010-12-21 18:14
                                 RTC秒中断比较好一点
点赞  2010-12-21 22:04
不用中断可以吗?让systick每秒自动重装载来记ms。只是不知道这样如何
保证systick和RTC同步,保证这两个计数器的计时起点一致?即保证systick正好记到1000ms时RTC计数器+1?
点赞  2010-12-22 09:19
                                 好像不用那么麻烦用到systick吧,RTC本身有个寄存器就是存储当前预分频计数值的。直接查询那个寄存器换算就好了。
点赞  2010-12-22 11:25
RTC_DIV确实是个好办法,并且已经实验成功了。
但是我现在还是比较倾向systick作ms中断了。
不过因为程序还需要ms定时,在一条操作指定若干ms之后做另一条操作。这个是应该用systick记ms比较好吧,所以我才考虑干脆让systick一直都中断算了。现在我想了解一下,如果让systick一直ms中断,对CPU是否有很大影响呢?或者我查时间的时候用RTC_DIV,需要计时时再让systick中断计时?
点赞  2010-12-24 11:19
                                 对CPU是否有很大影响?主要要看你在SYSTICK中断中做多少事情,你自己可以测算一下。
点赞  2010-12-24 11:52
                                 中断里只做变量++
点赞  2010-12-24 13:01
我最后还是用的ms中断
发现一个特别奇怪的事情:我用RTC时钟计时时,ms计时挺准确,但是一进到秒位时总感觉有几十ms的推迟,每次读时间应该在几秒零几十ms的时候总是只能读到几秒。不知哪的问题
点赞  2011-1-4 16:22
                                 你的sys_tick用错了
点赞  2011-1-15 15:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复