Files
mcu-codegen-template/App/Core/jb_timer.c
T

87 lines
2.6 KiB
C

/******************************************************************************
* @file jb_timer.c
* @brief TIM6 1ms 基础定时器硬件驱动实现
* @author cyWu <1917507415@qq.com>
* @date 2026.08.10
* @version V1.0.1
* @history
* - V1.0.1, 2026.08.10, cyWu, 软件 ms 计数交还协议层,本模块仅负责 TIM6 硬件
* - V1.0.0, 2026.08.10, cyWu, 首次发布
******************************************************************************/
#include "jb_timer.h"
#include "log.h"
/*============================================================================*/
/* 私有变量 */
/*============================================================================*/
TIM_HandleTypeDef g_jb_tim_handle;
static uint8_t s_initialized;
/*============================================================================*/
/* 公有接口 */
/*============================================================================*/
/**
* @brief 初始化 TIM6 为 1ms 周期中断
* @return JbTimer_Ret_t
*/
JbTimer_Ret_t jb_timer_init(void)
{
uint32_t pclk1;
uint32_t tim_clk;
if (s_initialized)
{
return JB_TIMER_OK;
}
/* APB 不分频时 TIMCLK=PCLK1;分频时 TIMCLK=2*PCLK1 */
pclk1 = HAL_RCC_GetPCLK1Freq();
if ((RCC->CFGR & RCC_CFGR_PPRE) == RCC_HCLK_DIV1)
{
tim_clk = pclk1;
}
else
{
tim_clk = pclk1 * 2U;
}
g_jb_tim_handle.Instance = JB_TIMER;
g_jb_tim_handle.Init.Prescaler = (tim_clk / 1000000U) - 1U;
g_jb_tim_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
g_jb_tim_handle.Init.Period = (1000U * JB_TIMER_PERIOD_MS) - 1U;
g_jb_tim_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
g_jb_tim_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
g_jb_tim_handle.Init.RepetitionCounter = 0;
if (HAL_TIM_Base_Init(&g_jb_tim_handle) != HAL_OK)
{
return JB_TIMER_ERR_HAL;
}
if (HAL_TIM_Base_Start_IT(&g_jb_tim_handle) != HAL_OK)
{
return JB_TIMER_ERR_HAL;
}
s_initialized = 1U;
appPrintf(LOG_NOTIC, "TIM6 1ms timer started, pclk=%lu tim_clk=%lu\r\n",
(unsigned long)pclk1, (unsigned long)tim_clk);
return JB_TIMER_OK;
}
/**
* @brief 获取初始化状态
* @return JbTimer_Ret_t
*/
JbTimer_Ret_t jb_timer_get_status(void)
{
if (!s_initialized)
{
return JB_TIMER_ERR_NOT_INIT;
}
return JB_TIMER_OK;
}