• 欢迎光临~

stm32c8t6的定时器中断

开发技术 开发技术 2022-08-31 次浏览

采用的定时器为TIM3(TIM1TIM2已经被用于产生PWM波了),TIM3对应的是APB1 Timer clocks,时钟频率Tclk为72MHz。
stm32c8t6的定时器中断

溢出时间(Tout = frac{(arr + 1) * (psc + 1)}{Tclk})

stm32c8t6的定时器中断
本项目PSCarr如图所示,溢出时间为10ms,即10ms触发一次定时器中断。
定时器中断处理逻辑为(个人理解,如有不对请指正): TIM3_IRQHandler处理TIM3的所有中断,调用HAL_TIM_IRQHandler(&htim3),在HAL_TIM_IRQHandler(&htim)中,检测到是TIM Update event,清除TIM_FLAG_UPDATE标志位,调用HAL_TIM_PeriodElapsedCallback(htim)

stm32f1xx_hal_tim.c中,HAL_TIM_PeriodElapsedCallback(htim)定义如下,带__weak标识符,因此直接在main.c里面重新定义HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

// stm32f1xx_hal_tim.c
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}

//main.c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
	//10ms for an timer interrupt
	time_count_it++;
	// 切换当已经清洗到泳池中心时,切换分母
	if (round_count > (zDominator[zDominator_index % 4] / 2)) {
		round_count = 1;
		zDominator_index++;
	}
	if (time_count_it > (time_wall2wall * round_count / zDominator[zDominator_index % 4])) {
		evt = evt_time_it;
		time_count_it = 0;
		HAL_TIM_Base_Stop_IT(&htim3);
	}

}

如果要在HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)里判断是哪个定时器触发的中断,添加

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  //添加回调后的程序逻辑 
        if (htim->Instance == htim3.Instance) //判断是否定时器2
        {

        }
		//或者
		if (htim == &htim3) {
		
		}
}
程序员灯塔
转载请注明原文链接:stm32c8t6的定时器中断
喜欢 (0)