嗨,对话框中,
我需要一个高分辨率的计时器来记录两个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或其他定时器?任何文档或代码示例都会非常有帮助。谢谢!
设备:
嗨herrkaefer,
您可以使用timer1来捕获2个gpio事件,但是不能达到超过2毫秒的间隔。请注意,timer1用于FreeRTOS系统,如果系统中断,系统将会不稳定或停止工作。当DA1468x处于睡眠模式时,Timer1是唯一存活的计时器,它在睡眠时钟运行。对于捕获两个GPIO事件,您可以只使用Timer1,但是周期最多为2毫秒。
谢谢,PM_Dialog
谢谢您的回复!
对于“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;
}
有任何工作演示类似于我的,我可以使用作为参考?谢谢!
嗨herrkaefer,
让我查一下,我会尽快给你答复。
谢谢,PM_Dialog
非常感谢!
实际上,我需要精确地测量一个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事件捕获函数的工作演示?谢谢!
嗨herrkaefer,
让我们为捕获过程提供更多的输入。您无法使用软件Timer0的使用捕获2(外部)事件,因为此计时器没有适当的硬件功能。您无法使用先前票证中所讨论的软件Timer2。唯一具有捕获功能的硬件的软件计时器是Timer1,但它是从RTOS使用的。为此,我会更正先前的语句,无法使用它来捕获功能。捕获两个事件的唯一方法是配置唤醒控制器并使用时间戳。因此,您可以将WKUP控制器配置为获取2个事件(EVT1,EVT2)触发,您可以使用以下方式使用时间戳:
谢谢,PM_Dialog