目录
一、基本定时器
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);
}

















