20230731_XiaoFuZi_emb/ZheDaXiaoFuZiBoot/Src/Usr/Bsp/McuBspTimer.c
Rjh913828050 a8560d741e 类型:重构
内容:重新整理项目文件分类
人员:任家豪
2023-10-08 16:10:23 +08:00

144 lines
3.7 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) {
__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);
}