2024-07-18 11:29:28 +08:00
|
|
|
#include "timer.h"
|
2024-07-20 10:44:59 +08:00
|
|
|
|
2024-07-18 11:29:28 +08:00
|
|
|
#include <math.h>
|
|
|
|
|
2024-07-20 10:44:59 +08:00
|
|
|
#include "tim.h"
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
INFINITE_LOOP_EVENT, // 无限循环事件
|
|
|
|
FINITE_LOOP_EVENT, // 有限循环事件
|
|
|
|
FINITE_LOOP_EVENT_WITH_PARAM,
|
|
|
|
DELAY_EVENT // 延迟事件
|
|
|
|
} EventType;
|
|
|
|
|
2024-07-18 11:29:28 +08:00
|
|
|
typedef struct Event
|
|
|
|
{
|
2024-07-20 10:44:59 +08:00
|
|
|
uint8_t id;
|
2024-07-18 11:29:28 +08:00
|
|
|
void (*func)(void);
|
2024-07-20 10:44:59 +08:00
|
|
|
void (*param_func)(uint16_t);
|
2024-07-18 11:29:28 +08:00
|
|
|
uint16_t time;
|
2024-07-20 10:44:59 +08:00
|
|
|
EventType type;
|
2024-07-18 11:29:28 +08:00
|
|
|
uint8_t enabled;
|
2024-07-20 10:44:59 +08:00
|
|
|
uint16_t loop_cnt;
|
|
|
|
uint32_t begin_time;
|
|
|
|
uint16_t param;
|
2024-07-18 11:29:28 +08:00
|
|
|
} Event;
|
|
|
|
|
|
|
|
static Event event[EVENT_MAX];
|
2024-07-20 10:44:59 +08:00
|
|
|
static int event_cnt;
|
|
|
|
static uint32_t current_time;
|
2024-07-18 11:29:28 +08:00
|
|
|
|
2024-07-20 10:44:59 +08:00
|
|
|
void TIMER_Count(TIM_HandleTypeDef *htim);
|
2024-07-18 11:29:28 +08:00
|
|
|
|
|
|
|
void TIMER_Init(void)
|
|
|
|
{
|
|
|
|
HAL_TIM_RegisterCallback(&htim4, HAL_TIM_PERIOD_ELAPSED_CB_ID, TIMER_Count);
|
|
|
|
HAL_TIM_Base_Start_IT(&htim4);
|
|
|
|
}
|
|
|
|
|
2024-07-20 10:44:59 +08:00
|
|
|
/// @brief 注册无限循环定时回调事件
|
2024-07-18 11:29:28 +08:00
|
|
|
/// @param func 回调函数 void func(void)
|
|
|
|
/// @param loop_time 定时时间,单位毫秒
|
2024-07-20 10:44:59 +08:00
|
|
|
int8_t TIMER_AddInfiniteLoopEvent(int8_t event_id, void (*func)(void), uint16_t loop_time)
|
2024-07-18 11:29:28 +08:00
|
|
|
{
|
2024-07-20 10:44:59 +08:00
|
|
|
if (event_id == -1) event_id = event_cnt++;
|
|
|
|
event[event_id].type = INFINITE_LOOP_EVENT;
|
|
|
|
event[event_id].id = event_id;
|
|
|
|
event[event_id].func = func;
|
|
|
|
event[event_id].time = loop_time;
|
|
|
|
event[event_id].begin_time = current_time;
|
|
|
|
event[event_id].enabled = 1;
|
|
|
|
return event_id;
|
2024-07-18 11:29:28 +08:00
|
|
|
}
|
|
|
|
|
2024-07-20 10:44:59 +08:00
|
|
|
/// @brief 注册有限循环定时回调事件
|
|
|
|
/// @param func 回调函数 void func(void)
|
|
|
|
/// @param loop_time 定时时间,单位毫秒
|
|
|
|
/// @param loop_cnt 循环次数
|
|
|
|
int8_t TIMER_AddFiniteLoopEventWithParam(int8_t event_id, void (*func)(uint16_t param), uint16_t loop_time, uint16_t loop_cnt, uint16_t param)
|
2024-07-18 11:29:28 +08:00
|
|
|
{
|
2024-07-20 10:44:59 +08:00
|
|
|
if (event_id == -1) event_id = event_cnt++;
|
|
|
|
event[event_id].type = FINITE_LOOP_EVENT_WITH_PARAM;
|
|
|
|
event[event_id].id = event_id;
|
|
|
|
event[event_id].param_func = func;
|
|
|
|
event[event_id].time = loop_time;
|
|
|
|
event[event_id].begin_time = current_time;
|
|
|
|
event[event_id].enabled = 1;
|
|
|
|
event[event_id].param = param;
|
|
|
|
event[event_id].loop_cnt = loop_cnt;
|
|
|
|
return event_id;
|
2024-07-18 11:29:28 +08:00
|
|
|
}
|
|
|
|
|
2024-07-20 10:44:59 +08:00
|
|
|
int8_t TIMER_AddFiniteLoopEvent(int8_t event_id, void (*func)(void), uint16_t loop_time, uint16_t loop_cnt)
|
2024-07-18 11:29:28 +08:00
|
|
|
{
|
2024-07-20 10:44:59 +08:00
|
|
|
if (event_id == -1) event_id = event_cnt++;
|
|
|
|
event[event_id].type = FINITE_LOOP_EVENT;
|
|
|
|
event[event_id].id = event_id;
|
|
|
|
event[event_id].func = func;
|
|
|
|
event[event_id].time = loop_time;
|
|
|
|
event[event_id].begin_time = current_time;
|
|
|
|
event[event_id].enabled = 1;
|
|
|
|
event[event_id].loop_cnt = loop_cnt;
|
|
|
|
return event_id;
|
2024-07-18 11:29:28 +08:00
|
|
|
}
|
|
|
|
|
2024-07-20 10:44:59 +08:00
|
|
|
/// @brief 注册延迟定时回调事件(单次)
|
|
|
|
/// @param func 回调函数 void func(void)
|
|
|
|
/// @param loop_time 定时时间,单位毫秒
|
|
|
|
int8_t TIMER_AddDelayEvent(int8_t event_id, void (*func)(void), uint16_t delay_time)
|
2024-07-18 11:29:28 +08:00
|
|
|
{
|
2024-07-20 10:44:59 +08:00
|
|
|
if (event_id == -1) event_id = event_cnt++;
|
|
|
|
event[event_id].type = DELAY_EVENT;
|
|
|
|
event[event_id].id = event_id;
|
|
|
|
event[event_id].func = func;
|
|
|
|
event[event_id].time = delay_time;
|
|
|
|
event[event_id].begin_time = current_time;
|
|
|
|
event[event_id].enabled = 1;
|
|
|
|
return event_id;
|
2024-07-18 11:29:28 +08:00
|
|
|
}
|
|
|
|
|
2024-07-20 10:44:59 +08:00
|
|
|
void TIMER_DelLoopEvent(int8_t id)
|
2024-07-18 11:29:28 +08:00
|
|
|
{
|
2024-07-20 10:44:59 +08:00
|
|
|
event[id].enabled = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TIMER_Count(TIM_HandleTypeDef *htim)
|
|
|
|
{
|
|
|
|
++current_time;
|
|
|
|
for (uint8_t i = 0; i < event_cnt; ++i)
|
|
|
|
{
|
|
|
|
if (event[i].enabled == 0)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
switch (event[i].type)
|
|
|
|
{
|
|
|
|
case INFINITE_LOOP_EVENT: // 无限循环事件
|
|
|
|
if ((current_time - event[i].begin_time) % event[i].time == 0)
|
|
|
|
{
|
|
|
|
event[i].func();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case FINITE_LOOP_EVENT: // 有限循环事件
|
|
|
|
if ((current_time - event[i].begin_time) % event[i].time == 0)
|
|
|
|
{
|
|
|
|
event[i].func();
|
|
|
|
if (event[i].loop_cnt-- <= 0)
|
|
|
|
{
|
|
|
|
TIMER_DelLoopEvent(event[i].id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case FINITE_LOOP_EVENT_WITH_PARAM:
|
|
|
|
if ((current_time - event[i].begin_time) % event[i].time == 0)
|
|
|
|
{
|
|
|
|
printf("FINITE_LOOP_EVENT_WITH_PARAM %d, %d, %d\n",
|
|
|
|
current_time, event[i].begin_time, event[i].time);
|
|
|
|
event[i].param_func(event[i].param);
|
|
|
|
if (--event[i].loop_cnt <= 0)
|
|
|
|
{
|
|
|
|
printf("remove FINITE_LOOP_EVENT_WITH_PARAM %d, %d, %d\n",
|
|
|
|
current_time, event[i].begin_time, event[i].time);
|
|
|
|
TIMER_DelLoopEvent(event[i].id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case DELAY_EVENT: // 延迟事件
|
|
|
|
if (current_time > event[i].begin_time &&
|
|
|
|
(current_time - event[i].begin_time) % event[i].time == 0)
|
|
|
|
{
|
|
|
|
event[i].func();
|
|
|
|
printf("DELAY_EVENT %d, %d, %d\n",
|
|
|
|
current_time, event[i].begin_time, event[i].time);
|
|
|
|
TIMER_DelLoopEvent(event[i].id);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2024-07-18 11:29:28 +08:00
|
|
|
}
|