C ASF4微芯片API定时器驱动复位功能

C ASF4微芯片API定时器驱动复位功能,c,arm,embedded,atmel,C,Arm,Embedded,Atmel,我正在使用ASF4 API hal_定时器来实现ARM Cortex M4。我正在使用计时器驱动程序对数据序列进行计时。 为什么不存在复位功能?我正在定时器任务单拍模式下使用定时器,并希望在需要时重置它 我想到了一个简单的办法 timer_start(&TIMER_0); timer_stop(&TIMER_0); 会起作用,但似乎不起作用 是否有必要为每个计时事件重新初始化计时器 我可能错过了一些明显的东西。我是否错误地处理了这个问题,原因是timer_reset()方法不存

我正在使用ASF4 API hal_定时器来实现ARM Cortex M4。我正在使用计时器驱动程序对数据序列进行计时。 为什么不存在复位功能?我正在定时器任务单拍模式下使用定时器,并希望在需要时重置它

我想到了一个简单的办法

timer_start(&TIMER_0);
timer_stop(&TIMER_0);
会起作用,但似乎不起作用

是否有必要为每个计时事件重新初始化计时器


我可能错过了一些明显的东西。我是否错误地处理了这个问题,原因是timer_reset()方法不存在?

我没有这个API的经验,但是查看文档很明显,一个计时器可以在不同的时间段执行多个任务,因此重置
timer_0
在语义上没有什么意义;相反,您需要重置附加到计时器的单个计时器任务,其中可能有多个

从(较差且包含错误)和更可靠的:

timer_task_instance.time_label = TIMER_0.time ;
其中,
timer\u task\u实例
是要重置的
struct timer\u任务
实例。这将开始时间设置为当前时间

最好将其包装在函数中:

// 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 ;
}
然后:

假设您正在使用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);
这将有效地重新启动与
计时器0\u任务相关的延迟


在引擎盖下,计时器任务作为一个有序的列表进行维护,按照每个任务到期的时间顺序,并使用API提供的函数来维护列表顺序。

更准确地说,这是哪一部分?你如何/在哪里设置时钟?这是基于SYSTICK吗?您需要定义“计时器重置”所需的语义-例如“重新启动并继续运行”吗?“重置”可能意味着很多事情。@Lundin我想重置我正在使用的另一个外部中断处理程序中的计时器计数器。我有一个名为timer\u 0\u CLOCK\u BREAK变量的timer\u任务结构,其中间隔设置为timer\u 0\u CLOCK\u BREAK.interval=5000。一旦5秒结束,我想重置计时器重新启动,但我想在外部中断时刻触发它。滴答声来自实时时钟硬件计时器,由ASF4 API中的hal_timer.c驱动程序管理,该芯片是一个ARM cortex-m4,运行频率为32.77 kHz,计数器设置为32,因此上述间隔为5000滴答声=5秒。好的,首先,您是否验证了系统时钟配置正确?这些事情总是痛苦的。您运行的系统时钟是什么,您是否设置了等待状态等。对于SAM部件,如果5V电源iirc的运行速度超过20MHz,您需要设置等待状态。然后需要配置GCLK。我不知道这个ASF有多少功能,也不知道它有多笨重,我在第一天就把它扔掉了。最好了解硬件的实际工作方式,否则你将被ASF劫持。这里是参考手册的链接,这可能无关紧要,但如果有多个任务与计时器关联,则有一个任务列表,按照每个任务到期的时间顺序进行维护。更改
time\u标签将破坏排序。@菲尔:噢,这确实是对一个讨厌的API的讨厌的攻击。我的建议是使用RTOS进行调度。
timer_remove_task(&TIMER_0, &TIMER_0_task);
timer_add_task(&TIMER_0, &TIMER_0_task);