【STM32Cube HAL】定时器中断(四)

  实验内容:使用基本定时器,实现LED灯以1S间隔进行亮灭切换。

一、原理图

 二、 CubeMX配置

Step1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。

 Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。

  

Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)

 

Step4.配置时基以及定时器中断。

 

到这里关于定时器参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。
三、添加功能代码
首先在主函数中开启定时器,并使能定时器中断(更新中断),并在while(1)循环中添加一个判断语句,在定时器中断1000次以后,进行LED灯电平的翻转,并将中断计数清零。
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM6_Init();
	
	__HAL_TIM_CLEAR_IT(&htim6,TIM_IT_UPDATE);//清除中断标志位,防止一使能定时器就进入中断
	HAL_TIM_Base_Start_IT(&htim6);//开启定时器,并使能定时器中断(更新中断)
  while (1)
  {
    
			if(cnt==1000)
			{
				HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
				cnt=0;
			}
  }
}

 回调函数,主要是用来计录定时器中断的次数,与while(1)循环中的判断语句相呼应。从而实现定时器计时1S,LED灯状态切换一次的效果。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	cnt++;//记录定时器中断的次数
}
定时器注意要点在于时基的配置。 这里我们先了解几个参数和概念。
定时器的定时时间等于计数器的中断周期乘以中断的次数。
定时器的时钟:TIMxCLK
计数器时钟:CK_CNT
预分频数:PSC
定时器周期: ARR( 注意:这里的周期指的不是时间而是计数个数!!!计数器能计数的最大数值,有时候这里很容易混淆
计数器的时钟频率等于定时器的时钟频率除以预分频数:
TIMxCLK/(PSC+1)   
计数器计一个数的时间等于计数器时钟频率的倒数:
(PSC+1)/TIMxCLK
产生一次中断的时间(中断周期)则等于计一个数的时间乘以计数的个数(定时器周期 ):                                                    (ARR+1)*(PSC+1)/TIMxCLK
如果在中断服务程序里面设置一个变量 time ,用来记录中断的次数,那么就可以计算出我们需要的定时时间等于:
                                      time*(ARR+1)*(PSC+1)/TIMxCLK

        

猜你喜欢

转载自blog.csdn.net/qq_29031103/article/details/119893953