[英]ASF4 Microchip API timer driver reset function
我将 ASF4 API hal_timer 用于 ARM Cortex M4。 我正在使用计时器驱动程序来计时数据序列。 为什么没有复位 function 存在? 我在 TIMER_TASK_ONE_SHOT 模式下使用计时器,并希望在需要时重置它。
我以为一个简单的
timer_start(&TIMER_0);
timer_stop(&TIMER_0);
可以解决问题,但似乎不起作用。
每次计时事件是否需要重新初始化计时器?
我可能遗漏了一些明显的东西。 我是否错误地解决了这个问题,原因是为什么方法 timer_reset() 不存在?
我没有这个 API 的经验,但是查看文档很明显,单个计时器可以在不同的时间段执行多个任务,因此重置TIMER_0
几乎没有语义意义; 相反,您需要重置附加到计时器的单个计时器任务 - 其中可能有多个。
timer_task_instance.time_label = TIMER_0.time ;
其中timer_task_instance
是您要重置的struct timer_task
实例。 这会将开始时间设置为当前时间。
可能最好将其包装在 function 中:
// Restart current interval, return interval.
uint32_t timer_restart( struct timer_descriptor* desc, struct timer_task* tsk )
{
tsk->time_label = desc->time
return tsk->interval ;
}
然后:
timer_restart( &TIMER_0, &timer_task_instance ) ;
假设您使用的是 ASF4 参考手册中的(已编辑)示例:
/* TIMER_0 example */
static struct timer_task TIMER_0_task;
static void TIMER_0_task_cb(const struct timer_task *const timer_task)
{
// task you want to delay using non-existent reset function.
}
void TIMER_0_example(void)
{
TIMER_0_task.interval = 100;
TIMER_0_task.cb = TIMER_0_task_cb;
TIMER_0_task.mode = TIMER_TASK_ONE_SHOT;
timer_add_task(&TIMER_0, &TIMER_0_task);
timer_start(&TIMER_0);
}
除了 API 不支持的重置,您可以使用:
timer_remove_task(&TIMER_0, &TIMER_0_task);
timer_add_task(&TIMER_0, &TIMER_0_task);
这将有效地重新启动与TIMER_0_task
相关的延迟。
在底层,定时器任务被维护为一个有序列表,按照每个任务何时到期的顺序,并使用 API 提供的函数来维护列表顺序。
克利福德。 我看你对嵌入式系统很感兴趣,请问哪里可以私聊? 在什么网站可以找到你?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.