首页 > 解决方案 > ASF4 Microchip API 定时器驱动复位功能

问题描述

我将 ASF4 API hal_timer 用于 ARM Cortex M4。我正在使用计时器驱动程序来计时数据序列。为什么不存在复位功能?我在 TIMER_TASK_ONE_SHOT 模式下使用计时器,并希望在需要时重置它。

我以为一个简单的

timer_start(&TIMER_0);
timer_stop(&TIMER_0);

可以解决问题,但似乎不起作用。

每次计时事件是否需要重新初始化计时器?

我可能遗漏了一些明显的东西。我是否错误地解决了这个问题,原因是为什么方法 timer_reset() 不存在?

标签: carmembeddedatmel

解决方案


假设您使用的是 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 提供的函数来维护列表顺序。


推荐阅读