作用就是在延时msec的时间后,调用pCallback指向的函数。
注:这个延时并不是在原地等着延时完毕再去调用,和deley_ms()这样的延时是有区别的。
函数原型在MC_vtimer.c文件中
void vtimer_SetTimer(VtimerName_t name,timer_res_t msec,void* pCallback)
{
sVtimer[name].msec = msec;
sVtimer[name].pCallback = pCallback;
}
第一眼看到这个函数原型的时候还是一脸懵逼,这都是啥?
实际上电机库中还有一个定时器是专门与之相关的。dev_vtimerInit()初始化函数中将TIM6设置为定时器中断,中断函数如下:
@far @interrupt void TIM6_UPD_OVF_TRG_IRQHandler(void)
{
TIM6_ClearITPendingBit(TIM6_IT_UPDATE);
vtimer_UpdateHandler();
return;
}/*
在中断中会调用vtimer_UpdateHandler();这个函数,关键的地方来了,这个函数原型也在MC_vtimer.c文件中。函数原型如下:
void vtimer_UpdateHandler(void)
{
//Enter each DELTAT_MS ms
u8 i;
for (i = 0; i < VTIMER_NUM; i++)
{
if (sVtimer[i].msec != 0)
{
sVtimer[i].msec--;
if (sVtimer[i].pCallback != 0)
{
if (sVtimer[i].msec == 0)
{
((PFN_Callback_t)sVtimer[i].pCallback)();
}
}
}
}
}
这下弄明白了吧,定时器6实际上被当做一个心跳作用了(不知道这样形容对不对),每跳一次就进来做一下for循环,直到msec等于0,(PS:这个msec就是你自己设置的延时时间),然后调用你设置好的要去调用的函数。