87 lines
2.6 KiB
C
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;
|
|
}
|