#include "McuBspTimer.h" typedef struct { uint32_t TimerTick[MCU_BSP_TIMER_TASK_NUM_MAX]; uint8_t TaskEnable[MCU_BSP_TIMER_TASK_NUM_MAX]; MCU_BSP_TIMER_TASK *TimerTask[MCU_BSP_TIMER_TASK_NUM_MAX]; } MCU_BSP_TIMER_TASK_INLINE; TIM_HandleTypeDef gTimHandle; MCU_BSP_TIMER_TASK_INLINE gTimerTask = {0}; uint32_t gTimerTick = 0; uint8_t gTimerUseFlag = 0; /* 使用定时器3作为定时器的复用 */ int McuBspTimerInit(void) { gTimHandle.Instance = TIM3; gTimHandle.Init.Period = 10000 - 1; gTimHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 10000) - 1; gTimHandle.Init.ClockDivision = 0; gTimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; gTimHandle.Init.RepetitionCounter = 0; gTimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&gTimHandle) != HAL_OK) { return -1; } McuBspTimerStartOrStop(MCU_BSP_TIMER_START); gTimerUseFlag = 1; return 0; } /* 定时器反初始化 */ int McuBspTimerDeInit(void) { gTimHandle.Instance = TIM3; if (HAL_TIM_Base_DeInit(&gTimHandle) != HAL_OK) { return -1; } gTimerUseFlag = 0; return 0; } /* 开启或关闭定时器 */ int McuBspTimerStartOrStop(uint8_t flag) { if (flag == MCU_BSP_TIMER_START) { if (HAL_TIM_Base_Start_IT(&gTimHandle) != HAL_OK) { return -1; } } else { if (HAL_TIM_Base_Stop_IT(&gTimHandle) != HAL_OK) { return -1; } } return 0; } /* 添加任务 */ int McuBspTimerAddTask(MCU_BSP_TIMER_TASK *Task) { int i; for (i = 0; i < MCU_BSP_TIMER_TASK_NUM_MAX; i++) { if (gTimerTask.TaskEnable[i] != MCU_BSP_TIMER_ENABLE) { gTimerTask.TimerTick[i] = gTimerTick; gTimerTask.TimerTask[i] = Task; gTimerTask.TaskEnable[i] = MCU_BSP_TIMER_ENABLE; return i; } } return -1; } /* 删除任务 */ void McuBspTimerDelTask(int TaskId) { gTimerTask.TaskEnable[TaskId] = MCU_BSP_TIMER_DISABLE; } /* 刷新定时器 */ void McuBspTimerTaskRefresh(int TaskId) { if (gTimerTask.TaskEnable[TaskId] == MCU_BSP_TIMER_ENABLE) { gTimerTask.TimerTick[TaskId] = gTimerTick; } } /* 定时器Sleep */ void McuBspTimerSleep(void) { if (gTimerUseFlag == 1) { __HAL_RCC_TIM3_CLK_DISABLE(); } HAL_NVIC_DisableIRQ(TIM3_IRQn); } /* 定时器WakeUp */ void McuBspTimerWakeUp(void) { if (gTimerUseFlag == 1) { __HAL_RCC_TIM3_CLK_ENABLE(); HAL_NVIC_EnableIRQ(TIM3_IRQn); } } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) { __HAL_RCC_TIM3_CLK_ENABLE(); /* TIM2 interrupt Init */ HAL_NVIC_SetPriority(TIM3_IRQn, 0x0E, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { int i; gTimerTick++; if (htim->Instance == TIM3) { for (i = 0; i < MCU_BSP_TIMER_TASK_NUM_MAX; i++) { if (gTimerTask.TaskEnable[i] == MCU_BSP_TIMER_ENABLE) { if (gTimerTick <= gTimerTask.TimerTick[i]) { if ((UINT32_MAX - (gTimerTask.TimerTick[i] - gTimerTick)) >= gTimerTask.TimerTask[i]->TaskPeriod) { gTimerTask.TaskEnable[i] = MCU_BSP_TIMER_DISABLE; gTimerTask.TimerTask[i]->Callback(); } } else { if (gTimerTick - gTimerTask.TimerTick[i] >= gTimerTask.TimerTask[i]->TaskPeriod) { gTimerTask.TaskEnable[i] = MCU_BSP_TIMER_DISABLE; gTimerTask.TimerTask[i]->Callback(); } } } } } } void TIM3_IRQHandler(void) { HAL_TIM_IRQHandler(&gTimHandle); }