DA1468x高分辨率定时器

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
6个员额/ 0个新员额
最后发表
herrkaefer
离线
最后看到:1个月1个星期前
加入:2017-12-16 38
DA1468x高分辨率定时器

嗨,对话框中,

我需要一个高分辨率的计时器来记录两个GPIO事件之间经过的时间。错误<100微秒是必需的。

到目前为止我的探索:

1) TIMER1精度(31.25微秒)应该可以。但是使用' OS_GET_TICK_COUNT() '只能得到2ms的间隔。

2)Timer1-> Captim_Timer_Val_Reg将使来自0到65535的值环,或约2ms间隔。所以我不能直接使用它来测量大于2ms的时间差。

3)“hw_timer1.h”中的一些函数' hw_timer1_get_count ', ' hw_timer1_get_value '似乎简单地返回"TIMER1->CAPTIM_TIMER_VAL_REG"

4)我还看到了“HW_TIMER1_GET_EVENT1_TRIGGER`HW_TIMER1_GET_EVENT1_GPIO”等功能。我不确定如何使用它们。

你能告诉我做这件事最好的方法吗?与TIMER1或其他定时器?任何文档或代码示例都会非常有帮助。谢谢!

设备:
PM_Dialog
离线
最后看到:2天13小时前
工作人员
加入:2018-02-08 11:03
嗨herrkaefer,

嗨herrkaefer,

您可以使用timer1来捕获2个gpio事件,但是不能达到超过2毫秒的间隔。请注意,timer1用于FreeRTOS系统,如果系统中断,系统将会不稳定或停止工作。当DA1468x处于睡眠模式时,Timer1是唯一存活的计时器,它在睡眠时钟运行。对于捕获两个GPIO事件,您可以只使用Timer1,但是周期最多为2毫秒。

谢谢,PM_Dialog

herrkaefer
离线
最后看到:1个月1个星期前
加入:2017-12-16 38
谢谢您的回复!

谢谢您的回复!

对于“period will be up to 2msec”,你的意思是两个GPIO事件之间的时间差不应该大于2ms吗?或者单事件测量的误差是2ms?

我们的两个事件可以相差9毫秒,所以2毫秒的间隔是不够的:-(我想我需要一个更通用的计时器。

我的应用程序从不进入睡眠模式,所以我可以使用其他高频率定时器。

好消息是,我可以一直看计时器,这样当它溢出时,我就能被注意到。您能对我下面两个版本的微秒时间函数给出意见吗?(它们对我不起作用,所以应该有问题。)

版本1:

Static inline uint32_t get_time_us() {
Static uint32_t time_us = 0;
Static uint16_t last_count = 0, current_count;

current_count = TIMER1 - > CAPTIM_TIMER_VAL_REG;

If (current_count >= last_count) / /输出
Time_us += (current_count - last_count) * 30;
其他的
time_us += ((UINT16_MAX - last_count) + current_count) * 30;
last_count = current_count;

返回time_us;
}

版本2:Timer1有一个CAPTIM_TIMER_HVAL_REG寄存器,hw_timer1_get_value()使用它。

Static inline uint32_t get_time_us() {
Static uint32_t time_us = 0;
Uint32_t count = hw_timer1_get_value();
Time_us += count * 30;
返回time_us;
}

有任何工作演示类似于我的,我可以使用作为参考?谢谢!

PM_Dialog
离线
最后看到:2天13小时前
工作人员
加入:2018-02-08 11:03
嗨herrkaefer,

嗨herrkaefer,

让我查一下,我会尽快给你答复。

谢谢,PM_Dialog

herrkaefer
离线
最后看到:1个月1个星期前
加入:2017-12-16 38
非常感谢!

非常感谢!

实际上,我需要精确地测量一个GPIO管脚上的波形持续时间(几毫秒)。我尝试使用Timer1的GPIO触发器和中断来捕获两个触发器,一个用于HW_TIMER1_TRIGGER_RISING,另一个用于HW_TIMER1_TRIGGER_FALLING。为了做到这一点,我必须定义' dg_configUSE_HW_TIMER1 1 '和' dg_configUSER_CAN_USE_TIMER1 1 '。但是“sys_power_mgr.c”存在编译错误。似乎sys_power_mgr.c中的函数要求' dg_configUSER_CAN_USE_TIMER1 '为零。

你能告诉我原因吗,或者一个可以使用timer1的GPIO事件捕获函数的工作演示?谢谢!

PM_Dialog
离线
最后看到:2天13小时前
工作人员
加入:2018-02-08 11:03
嗨herrkaefer,

嗨herrkaefer,

让我们为捕获过程提供更多的输入。您无法使用软件Timer0的使用捕获2(外部)事件,因为此计时器没有适当的硬件功能。您无法使用先前票证中所讨论的软件Timer2。唯一具有捕获功能的硬件的软件计时器是Timer1,但它是从RTOS使用的。为此,我会更正先前的语句,无法使用它来捕获功能。捕获两个事件的唯一方法是配置唤醒控制器并使用时间戳。因此,您可以将WKUP控制器配置为获取2个事件(EVT1,EVT2)触发,您可以使用以下方式使用时间戳:

  1. 软件Timer0如您所附的代码,以捕获EVT1和EV2,并计算他们的差异。限制是系统应该始终处于ACTIVE模式,因为Timer0在休眠模式下关闭。配置是正确的,并且您没有错过任何时钟周期。

  1. OS_timer()可以在睡眠模式下使用,但限制为非常低的粒度(2msec)

  1. rtc_get()用于计算Low Power时钟的数量,并计算EVT1和EVT2之间的差值。当然,它也可以用于睡眠。

谢谢,PM_Dialog