-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvtimer.c
96 lines (86 loc) · 2.01 KB
/
vtimer.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "vtimer.h"
/*this array holds the virtual timers tick value, callback function */
static volatile Vtimer_t sVtimer[VTIMER_NUM];
__IO uint8_t counter100ms; /* systick counter */
// in stm32f4xx_it.c
// extern void _100ms_IRQHandler (void);
///* USER CODE BEGIN SysTick_IRQn 1 */
// _100ms_IRQHandler();
///* USER CODE END SysTick_IRQn 1 */
void _100ms_IRQHandler(void)
{
counter100ms++;
if ( counter100ms > 99 )
{
counter100ms = 0;
Timer_100ms_Callback();
}
}
void Timer_100ms_Callback(void)
{
uint8_t i;
for (i = 0; i < VTIMER_NUM; i++)
{
if (sVtimer[i].timebase > 0)/* if timer is active */
{
if (sVtimer[i].tick != 0)/* if not overflow yet */
{
sVtimer[i].tick--;
if (sVtimer[i].tick == 0)/* if timer overflow */
{
sVtimer[i].elapsed_flag = SET;
if (sVtimer[i].pCallback != 0)/* if any callback exists */
{
((PFN_Callback_t)sVtimer[i].pCallback)();
}
}
}
}
}
}
void vtimer_InitAllTimers(void)
{
uint8_t i;
for (i = 0; i < VTIMER_NUM; i++)
{
vtimer_DeInit((VtimerName_t)i);
}
}
void vtimer_Config(VtimerName_t vtim,timer_res_t msec,void ( *pCallback)(void))
{
sVtimer[vtim].timebase = msec;
sVtimer[vtim].elapsed_flag = RESET;
sVtimer[vtim].pCallback = pCallback;
}
void vtimer_Start(VtimerName_t vtim)
{
sVtimer[vtim].tick = sVtimer[vtim].timebase;
}
void vtimer_Reload(VtimerName_t vtim)
{
vtimer_Start(vtim);
}
void vtimer_Stop(VtimerName_t vtim)
{
sVtimer[vtim].tick = 0;
}
void vtimer_DeInit(VtimerName_t vtim)
{
sVtimer[vtim].timebase = 0;
sVtimer[vtim].tick = 0;
sVtimer[vtim].elapsed_flag = RESET;
sVtimer[vtim].pCallback = 0;
}
void vtimer_Clear_ElapsedFlag(VtimerName_t vtim)
{
if (sVtimer[vtim].elapsed_flag == SET)
{
sVtimer[vtim].elapsed_flag = RESET;
}
}
/* Check timer elapsed in polling mode */
FlagStatus vtimer_TimerElapsed(VtimerName_t vtim)
{
if (sVtimer[vtim].elapsed_flag == SET) return SET;
else return RESET;
}