繁体   English   中英

ASF4 Microchip API 定时器驱动复位 function

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM