stm32f103 hal库中timer使用
使用步骤
1.初始化定时器
tim.Instance = TIM2;
tim.Init.Period = 1000-1;
tim.Init.Prescaler = (uint32_t)((SystemCoreClock / 1000) - 1);
tim.Init.ClockDivision = 0;
tim.Init.CounterMode = TIM_COUNTERMODE_UP;
tim.Init.RepetitionCounter = 0;
tim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
2.HAL_TIM_Base_Init(&htim2)基本参数配置
HAL_TIM_Base_Init(&htim2);
3.重写void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)函数
在函数中我们需要使能timer的时钟、设置固定中断优先级和中断使能(此函数在2.HAL_TIM_Base_Init中调用)
注意:打开对应的时钟使能,我用的是TIM2
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM2)
{
/* TIM2 clock enable */
__HAL_RCC_TIM2_CLK_ENABLE();
/* TIM2 interrupt Init */
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
}
4.中断函数的重写
void TIM2_IRQHandler(void)
{
//自己想要做的事情,但是不能进入递归等函数,不要进行浮点运算!
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
//结束自己要做的事情
HAL_TIM_IRQHandler(&tim);
}
5.如果想用溢出回调
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* 自己想要做的事情,与上面的要求一样 */
//HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
6.启动定时器
编写到这里基本已经完成配置,接下来要启动定时器,定时器才能运行(不可以没有这一步)
HAL_TIM_Base_Start_IT(&tim);
7.整个代码
static TIM_HandleTypeDef tim;
void TIM_Init(void)
{
tim.Instance = TIM2;
tim.Init.Period = 1000-1;
tim.Init.Prescaler = (uint32_t)((SystemCoreClock / 1000) - 1);
tim.Init.ClockDivision = 0;
tim.Init.CounterMode = TIM_COUNTERMODE_UP;
tim.Init.RepetitionCounter = 0;
tim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_Base_Init(&tim);
HAL_TIM_Base_Start_IT(&tim);
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspInit 0 */
/* USER CODE END TIM2_MspInit 0 */
/* TIM2 clock enable */
__HAL_RCC_TIM2_CLK_ENABLE();
/* TIM2 interrupt Init */
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM2_MspInit 1 */
/* USER CODE END TIM2_MspInit 1 */
}
}
void TIM2_IRQHandler(void)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
HAL_TIM_IRQHandler(&tim);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* Toggle LED3 */
//GpioToggle(&Led_tx);
//HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}