STM32CubeIDE(Timer)

目录

一、基本定时器

1、TIM6和TIM7简介

2、TIM6和TIM7主要特性

3、CubeMX配置

 4、代码编写

二、通用定时器

1、简介

2、主要功能

3、生成PWM波

3.1 固定占空比

3.2 可变占空比

4、输出比较

5、输入PWM

5.1 CubeMX配置 

 5.2 代码编写

一、基本定时器

1、TIM6和TIM7简介

16位递增计数器,有DMA请求生成,捕获比较通道数0,所在总线:APB1,只具有定时功能,有连续定时模式和单次定时模式

基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。
它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它
们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。两定时器相互独立,不共享任何资源

2、TIM6和TIM7主要特性

● 16位自动重装载累加计数器
● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值
分频
● 触发DAC的同步电路
● 在更新事件(计数器溢出)时产生中断/DMA请求

3、CubeMX配置

TIM6配置为连续定时模式,1ms中断一次

 TIM7配置为单次定时模式,2s进入中断

配置中断优先级 

配置LED引脚

 

 4、代码编写

启动TIM6中断

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim6);
  /* USER CODE END 2 */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  	if(ledFlag==1)
  	{
  		ledFlag=0;
  		HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
  		HAL_TIM_Base_Start_IT(&htim7);
  	}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM6)
	{
		timerCount++;
		if(timerCount==1500)
		{
			timerCount=0;
			ledFlag=1;
		}
	}
	else if(htim->Instance==TIM7)
	{
		HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
	}
}
/* USER CODE END 1 */

二、通用定时器

1、简介

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作

2、主要功能

通用TIMx (TIM2、 TIM3、 TIM4和TIM5)定时器功能包括:
● 16位向上、向下、向上/向下自动装载计数器
● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
数值
● 4个独立通道:
─ 输入捕获
─ 输出比较
─ PWM生成(边缘或中间对齐模式)
─ 单脉冲模式输出
● 使用外部信号控制定时器和定时器互连的同步电路
● 如下事件发生时产生中断/DMA:
─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
● 支持针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管理

3、生成PWM波

3.1 固定占空比

①CubeMX配置

TIM3基础配置

 TIM3中断开启

 ②编写代码

	HAL_TIM_Base_Start_IT(&htim3);//启动定时器3
	HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1);//启动定时器3CH1通道输出PWM波

3.2 可变占空比

//读取TIM3 CH1 Compare
int CH1_Value=__HAL_TIM_GetCompare(&htim3,TIM_CHANNEL_1);

动态修改TIM3 CH1 占空比,可以实现呼吸灯效果

//脉宽调制
int pulsWidth=100,dirInc=0;
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM3)
	{
		if(dirInc==0)
		{
			pulsWidth++;
			if(pulsWidth>=195)
			{
				pulsWidth=195;
				dirInc=1;
			}
		}
		else
		{
			pulsWidth--;
			if(pulsWidth<=5)
			{
				pulsWidth=5;
				dirInc=0;
			}
		}
	}
	__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,pulsWidth);//设置TIM3 CH1占空比
}

4、输出比较

输出总是50%占空比的方波,脉宽总是与ARR的值相等,如果CCR和计数器的值匹配,那么就会使CH1的输出翻转

①CubeMX配置

②代码编写

	HAL_TIM_Base_Start(&htim4);
	HAL_TIM_OC_Start(&htim4, TIM_CHANNEL_1);

5、输入PWM

5.1 CubeMX配置 

中断配置

 5.2 代码编写

	HAL_TIM_Base_Start(&htim2);
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
//输入PWM
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	int IC1_Width=__HAL_TIM_GET_COMPARE(&htim2,TIM_CHANNEL_1);
	int IC2_Pulse=__HAL_TIM_GET_COMPARE(&htim2,TIM_CHANNEL_2);

	char buff[20]="";
	sprintf(buff,"IC1_Width:%d \r\n",IC1_Width);
	HAL_UART_Transmit(&huart2, (uint8_t *)buff, strlen(buff),HAL_MAX_DELAY);
	sprintf(buff,"IC2_Pulse:%d \r\n",IC2_Pulse);
	HAL_UART_Transmit(&huart2, (uint8_t *)buff, strlen(buff),HAL_MAX_DELAY);
}

猜你喜欢

转载自blog.csdn.net/qq_57594025/article/details/132476884