STM32定时器TIM控制

一、CubeMX的设置

1、新建工程,进行基本配置

2、配置定时器TIM2

1)定时器计算公式:(以下两条公式相同)

Tout = ((ARR+1) * PSC+1)) / Tclk
TimeOut = ((Prescaler + 1) * (Period + 1)) / TimeClockFren

Tout = TimeOut:定时器溢出时间(单位为us),多少触发(进入)一次TIM中断。
PSC = Prescaler:预分频系数(预分频器值)。
ARR = Period:自动重装载值,TIM计数当超过这个值,则清0重新计数。
Tclk = TimeClockFren:定时器的输入时钟频率(单位MHZ),当前使用的TIM2系统时钟频率。

eg: 

STM32定时器TIM控制_第1张图片

Tout = (71+1)*(999+1)/72 = 1000us
= 1 ms = 0.001 s

因此,定时器则0.001s触发一次中断。

2)配置分频系数为72-1,向上计数模式,计数周期为1000-1,使能自动重载模式。

STM32定时器TIM控制_第2张图片

3)开启定时器TIM2的中断

STM32定时器TIM控制_第3张图片

二、代码调试

在CubeMX中生成工程后,打开main.c添加中断响应之后所需的一些代码

main.c

  /* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start_IT(&htim2); //以中断方式开启定时器2
  /* USER CODE END 2 */

上述添加的函数表示启动相应的定时器,“h”表示HAL库,“tim2”表示定时器2。

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//定时器回调函数
//当到达指定定时值时进入中断执行中断任务
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static int i = 0; //定义一个静态变量i
  if(htim == &htim2) 
  {
		//执行对应代码
		if(++i == 1000) //1s
		{
			i = 0;
			//对led灯或者其他外设进行操作
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0);//对GPIO口的电平进行反转(低-高,高—低)
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_2);
		}
  }
}

/* USER CODE END 0 */

上述以3个LED灯闪烁作为例子,可自行在CubeMX中设置

该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。

在函数内部定义了一个静态变量:i ,当它等于1000的时候,才会执行if里面的代码。也就是说需要发生1000次中断,才会让LED的状态翻转。

前面根据公式计算出,一次定时中断的时间是0.001秒,所以1000次中断的时间是0.001*1000=1秒。也就是说每隔1秒,LED的状态翻转一次。

三、烧录结果

修改后,保存,编译、下载,重新上电。可以看到LED灯差不多每隔1秒翻转一次

你可能感兴趣的:(stm32,嵌入式硬件,单片机)