硬汉嵌入式论坛

 找回密码
 立即注册
查看: 982|回复: 8
收起左侧

[TIMER] 外部秒脉冲触发定时器计数

[复制链接]

19

主题

62

回帖

119

积分

初级会员

积分
119
发表于 2022-2-24 10:02:16 | 显示全部楼层 |阅读模式
    请教一个定时器的用法,看看是否可行:

背景及需求:
    外部提供秒脉冲到H750的gpio上,需要利用这个秒脉冲获得准确的时间,要精确到ms,希望不要用中断来处理

想法:
   1.通过内部rtc来记录时间
   2.外部秒脉冲到来的时候触发定时器计时,以此来获得准确的毫秒计数
   3.应用层需要时间时读取内部rtc的时间+定时器的毫秒计数获得精确的时间
   4. h750内部也有毫秒计数,如果内部的毫秒计数和定时器的毫秒计数误差超过一定值时,进行修正,这样可以时间对齐后,长时间保持和外部标准源的准确性

问题:
   主要时想法2中的这个操作用定时器的哪部分功能来实现?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2022-2-24 10:37:05 | 显示全部楼层
捕获秒脉冲整个过程大概时间多长,可以考虑用DWT时钟周期计数器,比如你400MHz那么,那么DWT技术一次就是2.5ns。
回复

使用道具 举报

19

主题

62

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2022-2-24 11:19:56 | 显示全部楼层
我其实是希望秒脉冲能触发定时器开始定时,这样我就有一个基于秒脉冲的毫秒计数
回复

使用道具 举报

210

主题

1043

回帖

1683

积分

至尊会员

More we do, more we can do.

积分
1683
发表于 2022-2-24 12:33:31 | 显示全部楼层
看了下手册,可以通过两种方式实现:
1. 参考时钟输入,自动校准
2. 写平移寄存器,软件校准
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2022-2-24 14:27:43 | 显示全部楼层
提供一点参考意见:
      可以使用定时器的外部捕获级联DMA功能,捕获秒脉冲并且将定时器值通过DMA搬运到内存(2个32bit,循环模式),通过记录的两次定时器值得差值可以得到1s间隔对应的计数器值。
      比如:CPU 120MHz 32位定时器Tx,不分频,理论上1秒间隔定时器差值应该是120 * 10^6,实际上CPU晶振会漂移,改差值可能是(120 * 10^6 + 2000);
      那么1个计数器值对应的时间(放大100倍) u32_time_per_tick = 1 /(120 * 10^6 + 2000) = 833 (实际是8.33333ns);
      在其他任务重,可以用Tx计数器作为时间,多少个计数器差值 * u32_time_per_tick  / 100 即可得到较精确的时间;

特别说明:个人看法,仅提供参考,如有错误请指正,共同进步。
回复

使用道具 举报

19

主题

62

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2022-2-24 19:06:37 | 显示全部楼层
好像我描述的不太清楚,我重新描述一下:
    H750外接了一个8025的IIC接口的高精度RTC,不过这个RTC有个严重的问题,通过IIC访问只能获得年月日时分秒(如 2022-2-24 10:59:30),没有毫秒信息,但是我既然上了这样高精度的RTC,肯定是需要时间精确到毫秒,只能精确到秒显然是不够的.8025实际上能输出一个秒脉冲信号.现在是希望通过达到:   IIC通道获取的时间 + 秒脉冲  ---->  带毫秒的精确时间值,如: 2022-2-24 10:59:30:590ms

   我这边的想法是,是否能让定时器在收到秒脉冲的时候就重新计数 ,然后任意时间我只要直接读取定时器的值,就知道距离上次秒脉冲到来相差了多少毫秒,然后在去通过IIC获得具体的时间信息,拼接一下就是完整的带毫秒的时间了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2022-2-25 11:09:59 | 显示全部楼层
mojinpan 发表于 2022-2-24 19:06
好像我描述的不太清楚,我重新描述一下:
    H750外接了一个8025的IIC接口的高精度RTC,不过这个RTC有个严重 ...

这种情况使用中断很方便,外部中断也好,定时器捕获也有,进入中断获取当前系统时钟,比如使用DWT。

从捕获到进入中断,基本是12个时钟周期左右,基本可以忽略。

然后你IIC读取时间叠加DWT时钟周期计数器当前的差值。
回复

使用道具 举报

19

主题

62

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2022-2-25 11:18:26 | 显示全部楼层
eric2013 发表于 2022-2-25 11:09
这种情况使用中断很方便,外部中断也好,定时器捕获也有,进入中断获取当前系统时钟,比如使用DWT。

...

我是希望每次过来输入捕获能触发定时器重新装载值,这样我任意时刻读取定时器的值就知道具体的毫秒值,连中断都不用处理
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2022-2-25 11:21:15 | 显示全部楼层
mojinpan 发表于 2022-2-25 11:18
我是希望每次过来输入捕获能触发定时器重新装载值,这样我任意时刻读取定时器的值就知道具体的毫秒值,连中 ...

用DMA,触发后直接记录相触发对应的时刻。不需要进中断了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 00:09 , Processed in 0.270568 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表