124 lines
3.7 KiB
C

//硬件定时器库
#include "sys.h"
#include "tim.h"
/**
* @brief 开启定时中断
* @param TIMx: 定时器
* @param _ulFreq: 定时频率 (Hz)。0 表示关闭
* @param _PreemptionPriority: 抢占优先级
* @param _SubPriority: 子优先级
*/
void TIM_Set(TIM_TypeDef *TIMx, double _ulFreq, uint8_t _PreemptionPriority, uint8_t _SubPriority)
{
TIM_HandleTypeDef TimHandle = {0};
uint16_t usPeriod;
uint16_t usPrescaler;
uint32_t uiTIMxCLK;
//使能TIM时钟
if (TIMx == TIM1)
__HAL_RCC_TIM1_CLK_ENABLE();
else if (TIMx == TIM2)
__HAL_RCC_TIM2_CLK_ENABLE();
else if (TIMx == TIM3)
__HAL_RCC_TIM3_CLK_ENABLE();
else if (TIMx == TIM4)
__HAL_RCC_TIM4_CLK_ENABLE();
else if (TIMx == TIM5)
__HAL_RCC_TIM5_CLK_ENABLE();
else if (TIMx == TIM6)
__HAL_RCC_TIM6_CLK_ENABLE();
else if (TIMx == TIM7)
__HAL_RCC_TIM7_CLK_ENABLE();
else if (TIMx == TIM8)
__HAL_RCC_TIM8_CLK_ENABLE();
else if (TIMx == TIM12)
__HAL_RCC_TIM12_CLK_ENABLE();
else if (TIMx == TIM13)
__HAL_RCC_TIM13_CLK_ENABLE();
else if (TIMx == TIM14)
__HAL_RCC_TIM14_CLK_ENABLE();
else if (TIMx == TIM15)
__HAL_RCC_TIM15_CLK_ENABLE();
else if (TIMx == TIM16)
__HAL_RCC_TIM16_CLK_ENABLE();
else if (TIMx == TIM17)
__HAL_RCC_TIM17_CLK_ENABLE();
if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM15) || (TIMx == TIM16) || (TIMx == TIM17))
uiTIMxCLK = SystemCoreClock / 2; //APB2 定时器时钟 = 200M
else
uiTIMxCLK = SystemCoreClock / 2; //APB1 定时器 = 200M
if (_ulFreq < 100)
{
usPrescaler = 10000 - 1; //分频比 = 10000
usPeriod = ((double)uiTIMxCLK / 10000.0) / _ulFreq - 1.0; //自动重装的值
}
else if (_ulFreq < 3000)
{
usPrescaler = 100 - 1; //分频比 = 100
usPeriod = ((double)uiTIMxCLK / 100.0) / _ulFreq - 1.0; //自动重装的值
}
else //大于 4k 的频率
{
usPrescaler = 0; //分频比 = 1
usPeriod = (double)uiTIMxCLK / _ulFreq - 1.0; //自动重装的值
}
//定时器中断更新周期
TimHandle.Instance = TIMx;
TimHandle.Init.Prescaler = usPrescaler;
TimHandle.Init.Period = usPeriod;
TimHandle.Init.ClockDivision = 0;
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
TimHandle.Init.RepetitionCounter = 0;
TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
HAL_TIM_Base_Init(&TimHandle);
//使能定时器中断
__HAL_TIM_ENABLE_IT(&TimHandle, TIM_IT_UPDATE);
//配置TIM定时更新中断
{
uint8_t irq = 0;
if (TIMx == TIM1)
irq = TIM1_UP_IRQn;
else if (TIMx == TIM2)
irq = TIM2_IRQn;
else if (TIMx == TIM3)
irq = TIM3_IRQn;
else if (TIMx == TIM4)
irq = TIM4_IRQn;
else if (TIMx == TIM5)
irq = TIM5_IRQn;
else if (TIMx == TIM6)
irq = TIM6_DAC_IRQn;
else if (TIMx == TIM7)
irq = TIM7_IRQn;
else if (TIMx == TIM8)
irq = TIM8_UP_TIM13_IRQn;
else if (TIMx == TIM12)
irq = TIM8_BRK_TIM12_IRQn;
else if (TIMx == TIM13)
irq = TIM8_UP_TIM13_IRQn;
else if (TIMx == TIM14)
irq = TIM8_TRG_COM_TIM14_IRQn;
else if (TIMx == TIM15)
irq = TIM15_IRQn;
else if (TIMx == TIM16)
irq = TIM16_IRQn;
else if (TIMx == TIM17)
irq = TIM17_IRQn;
HAL_NVIC_SetPriority((IRQn_Type)irq, _PreemptionPriority, _SubPriority);
HAL_NVIC_EnableIRQ((IRQn_Type)irq);
}
HAL_TIM_Base_Start(&TimHandle);
}