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

作用就是在延时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就是你自己设置的延时时间),然后调用你设置好的要去调用的函数。

SetTimer 函数用于创建一个定时器,该定时器在指定的时间间隔后向消息队列发送一个定时器消息。其函数原型如下: ``` UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ); ``` 其中,参数含义如下: - hWnd:指定定时器消息要发送到的窗口的句柄; - nIDEvent:指定定时器的 ID,可以通过此 ID 在以后的操作中引用该定时器; - uElapse:指定定时器的时间间隔,单位为毫秒; - lpTimerFunc:指向计时器过程的指针,当定时器消息发送到窗口时,系统会调用此过程。 下面是一个使用 SetTimer 函数的简单示例: ```c++ #include <windows.h> #define TIMER_ID 1 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: SetTimer(hWnd, TIMER_ID, 1000, NULL); // 创建定时器,时间间隔为 1000ms break; case WM_TIMER: if (wParam == TIMER_ID) { MessageBox(NULL, TEXT("1 second has passed!"), TEXT("Timer"), MB_OK); } break; case WM_DESTROY: KillTimer(hWnd, TIMER_ID); // 销毁定时器 PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcex; HWND hWnd; MSG msg; ZeroMemory(&wcex, sizeof(wcex)); wcex.cbSize = sizeof(wcex); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.hInstance = hInstance; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.lpszClassName = TEXT("TimerSample"); RegisterClassEx(&wcex); hWnd = CreateWindow(TEXT("TimerSample"), TEXT("Timer Sample"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ``` 在这个示例中,我们创建一个定时器,在每隔 1 秒钟时弹出一个消息框。当窗口销毁时,我们通过 KillTimer 函数销毁定时器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值