124 lines
3.7 KiB
C
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);
|
|
}
|