嗨,对话,
我需要一个高分辨率计时器来记录两个GPIO事件之间经过的时间。错误<100微秒是必需的。
我迄今为止的探索:
1) 计时器1精度(31.25微秒)应正常。但是使用'OS_GET_TICK_COUNT()'我只能得到2毫秒的间隔。
2)Timer1-> Captim_Timer_Val_Reg将使来自0到65535的值环,或约2ms间隔。所以我不能直接使用它来测量大于2ms的时间差。
3) “hw\u timer1.h”中的一些函数,例如“hw\u timer1\u get\u count”,“hw\u timer1\u get\u value”似乎只是返回“timer1->CAPTIM\u TIMER\u VAL\u REG”
4)我还看到了“HW_TIMER1_GET_EVENT1_TRIGGER`HW_TIMER1_GET_EVENT1_GPIO”等功能。我不确定如何使用它们。
你能告诉我最好的方法吗?使用计时器1或其他计时器?任何文档或代码示例都将非常有用。谢谢
设备:
你好,herrkaefer,
您可以使用timer1来捕获2个gpio事件,但不能实现超过2ms的间隔。请注意,定时器1用于FreeRTOS systick,如果系统中断,系统将不稳定或停止工作。当DA1468x处于睡眠模式且在睡眠时钟下工作时,计时器1是唯一保持活动状态的计时器。对于捕获两个GPIO事件,您可以只使用计时器1,但时间段最多为2毫秒。
谢谢,下午好
谢谢你的回复!
对于“周期最长为2毫秒”,您的意思是两个GPIO事件之间的时间差不应大于2毫秒吗?或者单次测量的误差为2ms?
我们的两个事件可能相差9毫秒,所以2毫秒的间隔是不够的:-(我想我需要一个更通用的计时器。
我的应用程序从不进入睡眠模式,所以我可以使用其他高频定时器(如果可用)。
好消息是我可以一直看计时器,这样如果它溢出,我就可以被注意到。请您对我的微秒时间函数的以下两个版本发表意见好吗(他们不适合我,所以他们应该有问题。)
-第1版:
静态内联uint32\u t get\u time\u us(){
静态uint32时间=0;
静态uint16上次计数=0,当前计数;
当前计数=定时器1->CAPTIM\u TIMER\u VAL\u REG;
如果(当前计数>=上次计数)
时间=(当前计数-上次计数)*30;
其他的
时间_us+=((UINT16 _MAX-上次_计数)+当前_计数)*30;
上次计数=当前计数;
返回时间;
}
-版本2:Timer1有一个CAPTIM\u TIMER\u HVAL\u REG寄存器,hw\u Timer1\u get\u value()使用它。
静态内联uint32\u t get\u time\u us(){
静态uint32时间=0;
uint32_t count=hw_timer1_get_value();
时间=计数*30;
返回时间;
}
有没有类似于我的工作演示可以作为参考?谢谢
你好,herrkaefer,
让我检查一下,我会尽快给你回复。
谢谢,下午好
非常感谢!
实际上,我需要精确地测量一个GPIO引脚上的波形持续时间(几毫秒)。我尝试使用Timer1的GPIO触发器和中断来捕获两个触发器,一个用于HW_Timer1_触发器上升,一个用于HW_Timer1_触发器下降。为此,我必须定义'dg_configUSE_HW_timer11'和'dg_configUSER_CAN_USE_timer11'。但是,“sys\u power\u mgr.c”的编译错误。似乎sys\u power\u mgr.c中的函数要求“dg\u configUSER\u CAN\u USE\u TIMER1”为零。
你能告诉我原因吗,或者一个可以使用timer1的GPIO事件捕获功能的工作演示?谢谢
你好,herrkaefer,
让我们为捕获过程提供更多的输入。您无法使用软件Timer0的使用捕获2(外部)事件,因为此计时器没有适当的硬件功能。您无法使用先前票证中所讨论的软件Timer2。唯一具有捕获功能的硬件的软件计时器是Timer1,但它是从RTOS使用的。为此,我会更正先前的语句,无法使用它来捕获功能。捕获两个事件的唯一方法是配置唤醒控制器并使用时间戳。因此,您可以将WKUP控制器配置为获取2个事件(EVT1,EVT2)触发,您可以使用以下方式使用时间戳:
谢谢,下午好