用CUBEMX设置定时器,如果只用到溢出中断,设置非常简单,如下
下面接着设置定时器中断溢出周期:图中红框内即设置的两个重要参数
计算溢出周期的方法 T=((PSC+1)*(ARR+1))/系统主频(单位为秒)
比如此处溢出周期T=600*800/48000000=0.01s=10ms
生产代码后的设置为在stm32f0xx_hal_tim.c中找到函数void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim),此函数为定时器中断服务函数,包括
N多种定时器的中断(溢出中断、比较中断、输入捕获中断......),在此函数内找到处理溢出中断的代码行
/* TIM Update event */
if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
{
if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) !=RESET)
{
__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
HAL_TIM_PeriodElapsedCallback(htim);
}
}
在 HAL_TIM_PeriodElapsedCallback(htim)是回调函数 为__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)的原形,此处我们需要处理的是重新定义一个函数为 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim),在内编写其中断服务函数
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == (&htim16))
{
}
if(htim == (&htim17))
{
tim17cnt ++;
}
}
/* USER CODE END 1 */
如果有N个定时器溢出中断,则需要判断是哪个定时器的溢出中断,然后做相应的处理,别忘了定义变量tim17cnt
最后需要在初始化阶段进行启动定时器的溢出中断
HAL_TIM_Base_Start_IT(&htim17);
注意是带IT的,不是HAL_TIM_Base_Start(&htim17);
到这里定时器17就开始工作了,每10ms 会进入中断对tim17cnt进行+1。