STM32_TIMER
一.定时器概述
1.1定时器原理
1.2定时器分类
1.3定时器特性表
F1:
H7:
定时器类型 | 主要功能 |
基本定时器 | 没有输入输出通道,常用作时基,即定时功能 |
通用定时器 | 具有多路独立通道,可用于输入捕获/输出比较,也可用作时基 |
高级定时器 | 除具备通用定时器所有功能外,还具备带死区控制的互补信号输出、刹车输入等功能(可用于电机控制、数字电源设计等) |
二.定时器介绍
2.1基本定时器
2.1.1介绍
TIM6/TIM7
主要特性:
16位递增计数器(计数值:0~65535)
16位预分频器(分频系数:1~65536)
可用于触发DAC
在更新事件(计数器溢出)时,会产生中断/DMA请求
2.1.2定时器框图
①时钟源
②控制器
③计数器(时基单元)
影子寄存器是实际起作用的寄存器,不可直接访问
2.1.3 定时器溢出条件
计数器模式 | 溢出条件 |
递增计数模式 | CNT==ARR |
递减计数模式 | CNT==0 |
中心对齐模式 | CNT==ARR-1、CNT==1 |
2.1.4 计数模式说明
递增:
递减:
中心对其:
2.1.5计算公式
2.1.6配置步骤
步骤 | 操作 | 函数 |
1 | 配置定时器基础工作参数 | HAL_TIM_Base_Init() |
2 | 定时器基础MSP初始化 | HAL_TIM_Base_MspInit() 配置NVIC、CLOCK等 |
3 | 使能更新中断并启动计数器 | HAL_TIM_Base_Start_IT() |
4 | 设置优先级,使能中断 | HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ() |
5 | 编写中断服务函数 | TIMx_IRQHandler()等 HAL_TIM_IRQHandler() |
6 | 编写定时器更新中断回调函数 | HAL_TIM_PeriodElapsedCallback() |
函数 | 主要寄存器 | 主要功能 |
HAL_TIM_Base_Init() | CR1、ARR、PSC | 初始化定时器基础参数 |
HAL_TIM_Base_MspInit() | 无 | 存放NVIC、CLOCK、GPIO初始化代码 |
HAL_TIM_Base_Start_IT() | DIER、CR1 | 使能更新中断并启动计数器 |
HAL_TIM_IRQHandler() | SR | 定时器中断处理公用函数,处理各种中断 |
HAL_TIM_PeriodElapsedCallback() | 无 | 定时器更新中断回调函数,由用户重定义 |
2.2通用定时器
2.2.1介绍
通用定时器:TIM2/TIM3 /TIM4 /TIM5
主要特性:
16位递增、递减、中心对齐计数器(计数值:0~65535)
16位预分频器(分频系数:1~65536)
可用于触发DAC、ADC
在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式使用外部信号控制定时器且可实现多个定时器互连的同步电路支持编码器和霍尔传感器电路等
2.2.2定时器框图
①时钟源:
通过APB1提供的时钟源,
内部触发输入,TIM_ETR复用
IO口提供时钟源,外部时钟模式2
外部时钟模式1,来自通道1和通道2
②控制器:
触发控制器:TRGO可以连接到其他定时器,作为触发信号,完成定时器的级联
从模式控制器:复位,使能,递增,计数
编码器接口:连接编码器
③时基单元:与基本定时器一致,用于计数
④输入捕获:
通过通道捕获型号,经过滤波器过滤和边沿检测器检测,得到TI1FP1和TI1FP2信号,将信号映射到预分频器产生IC1PS信号,产生捕获事件,将CNT计数器的值进行比较
⑤捕获/比较(公共):
⑥输出比较:
向比较寄存器的影子寄存器写入比较值,计数器正常计数,当计数器的值和比较值相等时,产生比较事件
2.2.3计数器时钟源
①内部时钟(CK_INT),来自外设总线APB提供的时钟
②外部时钟模式1:外部输入引脚(TIx),来自定时器通道1或者通道2引脚的信号
③外部时钟模式2:外部触发输入(ETR),来自可以复用为TIMx_ETR的IO引脚
④内部触发输入(ITRx),用于与芯片内部其它通用/高级定时器级联
计数器时钟选择类型 | 设置方法 |
内部时钟(CK_INT) | 设置TIMx_SMCR的SMS=000 |
外部时钟模式1:外部输入引脚(TIx) | 设置TIMx_SMCR的SMS=111 |
外部时钟模式2:外部触发输入(ETR) | 设置TIMx_SMCR的ECE=1 |
内部触发输入(ITRx) | 设置可参考STM32F10xxx参考手册_V10(中文版).pdf,14.3.15节 |
2.2.3.1 外部时钟模式1
2.2.3.2 外部时钟模式2
在外部时钟模式1中,定时器仅在每次外部脉冲到达时进行计数;而在外部时钟模式2中,定时器可以在外部脉冲到达时和外部脉冲消失时各进行一次计数,因此可以更精确地控制定时器的计数。
2.2.3.3 内部触发输入(ITRx)
2.2.4 PWM输出
2.2.4.1比较部分框图
捕获/比较通道1的主电路---输出部分:
捕获/比较通道的输出部分(通道1):
2.2.4.2 PWM原理
2.2.5配置步骤
输出PWM:
步骤 | 操作 | 函数 |
1 | 配置定时器基础工作参数 | HAL_TIM_PWM_Init() |
2 | 定时器PWM输出MSP初始化 | HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等 |
3 | 配置PWM模式/比较值等 | HAL_TIM_PWM_ConfigChannel() |
4 | 使能输出并启动计数器 | HAL_TIM_PWM_Start() |
5 | 修改比较值控制占空比(可选) | __HAL_TIM_SET_COMPARE() |
6 | 使能通道预装载(可选) | __HAL_TIM_ENABLE_OCxPRELOAD() |
函数 | 主要寄存器 | 主要功能 |
HAL_TIM_PWM_Init() | CR1、ARR、PSC | 初始化定时器基础参数 |
HAL_TIM_PWM_MspInit() | 无 | 存放NVIC、CLOCK、GPIO初始化代码 |
HAL_TIM_PWM_ConfigChannel() | CCMRx、CCRx、CCER | 配置PWM模式、比较值、输出极性等 |
HAL_TIM_PWM_Start() | CCER、CR1 | 使能输出比较并启动计数器 |
__HAL_TIM_SET_COMPARE() | CCRx | 修改比较值 |
__HAL_TIM_ENABLE_OCxPRELOAD() | CCER | 使能通道预装载 |
输入捕获:
步骤 | 操作 | 函数 |
1 | 配置定时器基础工作参数 | HAL_TIM_IC_Init() |
2 | 定时器输入捕获MSP初始化 | HAL_TIM_IC_MspInit() 配置NVIC、CLOCK、GPIO等 |
3 | 配置输入通道映射、捕获边沿等 | HAL_TIM_IC_ConfigChannel() |
4 | 设置优先级,使能中断 | HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ() |
5 | 使能定时器更新中断 | __HAL_TIM_ENABLE_IT() |
6 | 使能捕获、捕获中断及计数器 | HAL_TIM_IC_Start_IT() |
7 | 编写中断服务函数 | TIMx_IRQHandler()等 HAL_TIM_IRQHandler() |
8 | 编写更新中断和捕获回调函数 | HAL_TIM_PeriodElapsedCallback() HAL_TIM_IC_CaptureCallback() |
函数 | 主要寄存器 | 主要功能 |
HAL_TIM_IC_Init() | CR1、ARR、PSC | 初始化定时器基础参数 |
HAL_TIM_IC_MspInit() | 无 | 存放NVIC、CLOCK、GPIO初始化代码 |
HAL_TIM_IC_ConfigChannel() | CCMRx、CCER | 配置通道映射、捕获边沿、分频、滤波等 |
__HAL_TIM_ENABLE_IT() | DIER | 使能更新中断等 |
HAL_TIM_IC_Start_IT() | CCER、DIER、CR1 | 使能输入捕获、捕获中断并启动计数器 |
HAL_TIM_IRQHandler() | SR | 定时器中断处理公用函数,处理各种中断 |
HAL_TIM_PeriodElapsedCallback() | 无 | 定时器更新中断回调函数,由用户重定义 |
HAL_TIM_IC_CaptureCallback() | 无 | 定时器输入捕获回调函数,由用户重定义 |
再HAL库中,不需要对中断类型经行设置,采用各种中断的回调函数来达到各种中断的作用
外部输入模式一:
步骤 | 操作 | 函数 |
1 | 配置定时器基础工作参数 | HAL_TIM_IC_Init() |
2 | 定时器输入捕获MSP初始化 | HAL_TIM_IC_MspInit() 配置NVIC、CLOCK、GPIO等 |
3 | 配置定时器从模式等 | HAL_TIM_SlaveConfigSynchro() |
4 | 使能输入捕获并启动计数器 | HAL_TIM_IC_Start() |
5 | 获取计数器的值 | __HAL_TIM_GET_COUNTER() |
6 | 设置计数器的值 | __HAL_TIM_SET_COUNTER() |
函数 | 主要寄存器 | 主要功能 |
HAL_TIM_IC_Init() | CR1、ARR、PSC | 初始化定时器基础参数 |
HAL_TIM_IC_MspInit() | 无 | 存放NVIC、CLOCK、GPIO初始化代码 |
HAL_TIM_SlaveConfigSynchro() | SMCR、CCMRx、CCER | 配置定时器从模式、触发选择、分频、滤波等 |
HAL_TIM_IC_Start() | CCER、CR1 | 使能输入捕获、启动计数器 |
__HAL_TIM_GET_COUNTER() | CNT | 获取计数器当前值 |
__HAL_TIM_SET_COUNTER() | CNT | 设置计数器的值 |
2.3高级定时器
2.3.1定时器介绍
高级定时器:TIM1/TIM8
主要特性:
16位递增、递减、中心对齐计数器(计数值:0~65535)
16位预分频器(分频系数:1~65536)
可用于触发DAC、ADC
在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式
使用外部信号控制定时器且可实现多个定时器互连的同步电路支持编码器和霍尔传感器电路等
重复计数器
死区时间带可编程的互补输出
断路输入,用于将定时器的输出信号置于用户可选的安全配置中
2.3.2定时器框图
有重复计数器,当计数器溢出后等重复计数器为0的时候才会触发中断
N为互补通道,123有4无,DTG可以设置死区事件
刹车输入功能,产生刹车中断
2.3.3输出多个PWM
2.3.3.1重复计数器
计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件
如果设置RCR为N,更新事件将在N+1次溢出时发生
2.3.3.2输出多个PWM
配置边沿对齐模式输出PWM
指定输出N个PWM, 则把N-1写入RCR
在更新中断内,关闭计数器
注意:高级定时器通道输出必须把MOE位置1
步骤 | 操作 | 函数 |
1 | 配置定时器基础工作参数 | HAL_TIM_PWM_Init() |
2 | 定时器PWM输出MSP初始化 | HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等 |
3 | 配置PWM模式/比较值等 | HAL_TIM_PWM_ConfigChannel() |
4 | 设置优先级,使能中断 | HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ() |
5 | 使能定时器更新中断 | __HAL_TIM_ENABLE_IT() |
6 | 使能输出、主输出、计数器 | HAL_TIM_PWM_Start() |
7 | 编写中断服务函数 | TIMx_IRQHandler()等 HAL_TIM_IRQHandler() |
8 | 编写更新中断回调函数 | HAL_TIM_PeriodElapsedCallback() |
2.3.4高级定时器输出比较模式
步骤 | 操作 | 函数 |
1 | 配置定时器基础工作参数 | HAL_TIM_OC_Init() |
2 | 定时器输出比较MSP初始化 | HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等 |
3 | 配置输出比较模式等 | HAL_TIM_OC_ConfigChannel() |
4 | 使能通道预装载 | __HAL_TIM_ENABLE_OCxPRELOAD() |
5 | 使能输出、主输出、计数器 | HAL_TIM_OC_Start() |
6 | 修改捕获/比较寄存器的值 | __HAL_TIM_SET_COMPARE() |
函数 | 主要寄存器 | 主要功能 |
HAL_TIM_OC_Init() | CR1、ARR、PSC | 初始化定时器基础参数 |
HAL_TIM_OC_MspInit | 无 | 存放NVIC、CLOCK、GPIO初始化代码 |
HAL_TIM_OC_ConfigChannel() | CCMRx、CCRx、CCER | 设置输出比较模式、比较值、输出极性等 |
__HAL_TIM_ENABLE_OCxPRELOAD() | CCMRx | 使能通道预装载 |
HAL_TIM_OC_Start() | CR1、CCER、BDTR | 使能输出比较、主输出、启动计数器 |
__HAL_TIM_SET_COMPARE() | CCRx | 修改捕获/比较寄存器的值 |
2.3.4高级定时器输出比较模式实验
步骤 | 操作 | 函数 |
1 | 配置定时器基础工作参数 | HAL_TIM_PWM_Init() |
2 | 定时器PWM输出MSP初始化 | HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等 |
3 | 配置PWM模式/比较值等 | HAL_TIM_PWM_ConfigChannel() |
4 | 配置刹车功能、死区时间等 | HAL_TIMEx_ConfigBreakDeadTime() |
5 | 使能输出、主输出、计数器 | HAL_TIM_PWM_Start() |
6 | 使能互补输出、主输出、计数器 | HAL_TIMEx_PWMN_Start() |
函数 | 主要寄存器 | 主要功能 |
HAL_TIM_PWM_Init() | CR1、ARR、PSC | 初始化定时器基础参数 |
HAL_TIM_PWM_MspInit() | 无 | 存放NVIC、CLOCK、GPIO初始化代码 |
HAL_TIM_PWM_ConfigChannel() | CCMRx、CCRx、CCER | 配置PWM模式、比较值、输出极性等 |
HAL_TIMEx_ConfigBreakDeadTime() | BDTR | 配置刹车功能、死区时间等 |
HAL_TIM_PWM_Start() | CCER、CR1 | 使能输出、主输出、启动计数器 |
HAL_TIMEx_PWMN_Start() | CCER、CR1 | 使能互补输出、主输出、启动计数器 |