您的位置:首页 > 其它

stm8s电机库vtimer_SetTimer()函数的使用

2017-06-21 20:45 302 查看
作用就是在延时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就是你自己设置的延时时间),然后调用你设置好的要去调用的函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息