嗨对话框,
我需要一个高分辨率定时器两个GPIO事件之间经过的记录时间。<100微秒是必需的错误。
我的探索,到目前为止:
1)TIMER1精密(31.25微秒)应该没问题。但随着`OS_GET_TICK_COUNT()`我只能拿到2毫秒的间隔。
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,
你可以为了使用定时器1来捕获2 GPIO事件,但你不能达到超过2ms的时间间隔。请注意,定时器1用于FreeRTOS的系统定时器,系统将变得不稳定,或者如果它被中断停止工作。该定时器1是唯一的计时器,保持活着当DA1468x处于睡眠模式,它是在睡眠时钟运行。为了捕获两个GPIO事件,你可以只使用定时器1,但周期将达到2毫秒。
谢谢,PM_DIALOG.
感谢您的回复!
对于“期间将达到2毫秒”,你的意思是两个GPIO事件之间的时间差应不超过2ms更大?或单事件测量误差为2ms?
我们两个事件可以高达9msec区别,所以2毫秒的间隔是不够的:-(我想我需要一个更一般的定时器。
我的应用程序从未进入休眠模式,所以我可以使用安装其他高requency计时器。
好消息是,我可以一直看着计时器,所以如果它溢出我可以让别人注意到。能否请您给于我的微秒时间功能的以下两个版本的评论?(他们不为我工作得很好,所以应该是坏了他们。)
- 版本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;
如果(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的计数= hw_timer1_get_value();
time_us + =计数* 30;
返回time_us;
}
有演示类似地雷的任何工作,我可以作为一个参考使用?谢谢!
嗨herrkaefer,
让我检查一下,我会尽快回复您。
谢谢,PM_DIALOG.
非常感谢!
其实我需要精确测量的一个GPIO引脚的波形持续时间(几个毫秒)。我试图用定时器1的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`为零。
你能告诉我原因,或工作演示,可以使用定时器1的GPIO事件捕捉功能?谢谢!
嗨herrkaefer,
让我们为捕获过程提供更多的输入。您无法使用软件Timer0的使用捕获2(外部)事件,因为此计时器没有适当的硬件功能。您无法使用先前票证中所讨论的软件Timer2。唯一具有捕获功能的硬件的软件计时器是Timer1,但它是从RTOS使用的。为此,我会更正先前的语句,无法使用它来捕获功能。捕获两个事件的唯一方法是配置唤醒控制器并使用时间戳。因此,您可以将WKUP控制器配置为获取2个事件(EVT1,EVT2)触发,您可以使用以下方式使用时间戳:
谢谢,PM_DIALOG.