嗨对话框,
我需要一个高分辨率定时器来记录两个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事件,但您无法达到超过2ms的间隔。请注意,Timer1用于Freertos Systick,如果它被中断,系统将不稳定或停止工作。Timer1是当DA1468X处于睡眠模式时保持活力的唯一计时器,它在睡眠时钟运行。为了捕获两个GPIO事件,您只能使用Timer1,但该期限最多可达2毫秒。
谢谢,PM_DIALOG.
感谢您的回复!
对于“期间最多的2毫秒”,你是否意味着两个GPIO事件之间的时间差不应该大于2ms?或单个事件测量的错误是2ms?
我们的两个事件可以达到9毫秒差异,因此2磁形间隔是不够的:-(我认为我需要更普通的计时器。
我的应用程序永远不会进入睡眠模式,因此如果可用,我可以使用其他高价度计时器。
好消息是我可以继续看定时器,所以如果它溢出我会被注意到。您能否对我微秒时间函数的以下两个版本发表评论?(他们对我不适合,所以他们应该有问题。)
- 版本1:
静态内联uint32_t get_time_us(){
静态UINT32_T TIME_US = 0;
静态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()使用它。
静态内联uint32_t get_time_us(){
静态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.cr”的错误。它似乎在sys_power_mgr.c需要中的函数需要`dg_configuser_can_use_timer1`为零。
你能告诉我这个原因,还是可以使用Timer1的GPIO事件捕获功能的工作演示?谢谢!
嗨Herrkaefer,
让我们为捕获过程提供更多的输入。您无法使用软件Timer0的使用捕获2(外部)事件,因为此计时器没有适当的硬件功能。您无法使用先前票证中所讨论的软件Timer2。唯一具有捕获功能的硬件的软件计时器是Timer1,但它是从RTOS使用的。为此,我会更正先前的语句,无法使用它来捕获功能。捕获两个事件的唯一方法是配置唤醒控制器并使用时间戳。因此,您可以将WKUP控制器配置为获取2个事件(EVT1,EVT2)触发,您可以使用以下方式使用时间戳:
谢谢,PM_DIALOG.