目录
一、基本定时器
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 代码编写
16位递增计数器,有DMA请求生成,捕获比较通道数0,所在总线:APB1,只具有定时功能,有连续定时模式和单次定时模式
基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。
它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它
们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。两定时器相互独立,不共享任何资源
● 16位自动重装载累加计数器
● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值
分频
● 触发DAC的同步电路
● 在更新事件(计数器溢出)时产生中断/DMA请求
TIM6配置为连续定时模式,1ms中断一次
TIM7配置为单次定时模式,2s进入中断
配置中断优先级
配置LED引脚
启动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 */
通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作
通用TIMx (TIM2、 TIM3、 TIM4和TIM5)定时器功能包括:
● 16位向上、向下、向上/向下自动装载计数器
● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
数值
● 4个独立通道:
─ 输入捕获
─ 输出比较
─ PWM生成(边缘或中间对齐模式)
─ 单脉冲模式输出
● 使用外部信号控制定时器和定时器互连的同步电路
● 如下事件发生时产生中断/DMA:
─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
● 支持针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管理
①CubeMX配置
TIM3基础配置
TIM3中断开启
②编写代码
HAL_TIM_Base_Start_IT(&htim3);//启动定时器3
HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1);//启动定时器3CH1通道输出PWM波
//读取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占空比
}
输出总是50%占空比的方波,脉宽总是与ARR的值相等,如果CCR和计数器的值匹配,那么就会使CH1的输出翻转
②代码编写
HAL_TIM_Base_Start(&htim4);
HAL_TIM_OC_Start(&htim4, TIM_CHANNEL_1);
中断配置
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);
}