146 lines
3.9 KiB
C
146 lines
3.9 KiB
C
#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) {
|
|
McuBspTimerStartOrStop(MCU_BSP_TIMER_STOP);
|
|
__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);
|
|
McuBspTimerStartOrStop(MCU_BSP_TIMER_START);
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|