#include "timer.h" #include #include "tim.h" typedef enum { INFINITE_LOOP_EVENT, // 无限循环事件 FINITE_LOOP_EVENT, // 有限循环事件 FINITE_LOOP_EVENT_WITH_PARAM, DELAY_EVENT // 延迟事件 } EventType; typedef struct Event { uint8_t id; void (*func)(void); void (*param_func)(uint16_t); uint16_t time; EventType type; uint8_t enabled; uint16_t loop_cnt; uint32_t begin_time; uint16_t param; } Event; static Event event[EVENT_MAX]; static int event_cnt; static uint32_t current_time; void TIMER_Count(TIM_HandleTypeDef *htim); void TIMER_Init(void) { HAL_TIM_RegisterCallback(&htim4, HAL_TIM_PERIOD_ELAPSED_CB_ID, TIMER_Count); HAL_TIM_Base_Start_IT(&htim4); } /// @brief 注册无限循环定时回调事件 /// @param func 回调函数 void func(void) /// @param loop_time 定时时间,单位毫秒 int8_t TIMER_AddInfiniteLoopEvent(int8_t event_id, void (*func)(void), uint16_t loop_time) { 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; } /// @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) { 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; } int8_t TIMER_AddFiniteLoopEvent(int8_t event_id, void (*func)(void), uint16_t loop_time, uint16_t loop_cnt) { 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; } /// @brief 注册延迟定时回调事件(单次) /// @param func 回调函数 void func(void) /// @param loop_time 定时时间,单位毫秒 int8_t TIMER_AddDelayEvent(int8_t event_id, void (*func)(void), uint16_t delay_time) { 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; } void TIMER_DelLoopEvent(int8_t id) { 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; } } }