/****************************************************************************** * @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; }