stm32f10x最多有8个定时器,stm32f103zet6就有8个定时器,分别是4个通用定时器,2个高级定时器,2个基本定时器。
定时器种类 | 位数 | 计时器模式 | 产生DMA请求 | 捕获/比较通道 | 互补输出 | 特殊应用场景 |
---|---|---|---|---|---|---|
高级定时器 (TIM1,TIM8) | 16 | 向上,向下,向上/下 | 可以 | 4 | 有 | 带死区控制盒紧急刹车,可应用于PWM电机控制 |
通用定时器 (TIM2~TIM5) | 16 | 向上,向下,向上/下 | 可以 | 4 | 无 | 通用。定时计数,PWM输出,输入捕获,输出比较 |
基本定时器 (TIM6,TIM7) | 16 | 向上,向下,向上/下 | 可以 | 0 | 无 | 主要应用于驱动DAC |
通用定时器(TIM2~TIM5)功能特点描述:
- 位于低速的APB1总线上(可以使用来自APB1的时钟,也有其他始终来源)
- 16位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)
- 16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为(1~65535)之间的任意值
- 4个独立通道(TIMx_CH1~4),这些通道可以用来作为:
- 输入捕获
- 输出比较
- PWM生成(边缘或中间对齐模式)
- 单脉冲模式输出
- 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(用1个定时器控制另一个定时器)的同步电路
- 如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器):
- 更新:计数器向上/向下溢出,计数器初始化(通过软件或者内部/外部触发)
- 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
- 输入捕获
- 输出比较
- 支持针对定位的增量(正交)编码器和霍尔传感器电路
- 触发输入作为外部时钟或者按周期的电流管理
- STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等
- 使用定时器预分频器和RCC时钟控制预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。
计数器模式
通用定时器可以向上计数,向下计数,向上向下双向计数模式
向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器向上溢出事件。
向下计数模式:计数器从自动装载值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,产生一个计数器向下溢出的时间。
中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
通用定时器工作过程简略
定时器的时钟选择有内部时钟(APB1),外部时钟(2,3,4号定时器可以使用),其他定时器(ITRn)或者定时器通道(TIn)。
ITRn:定时器会产生一个TRGn的时钟发送到其他定时器作为ITRn或者发送到DAC/ADC。
TIn:来自TIMx_CHn引脚的电平,通过滤波和边沿检测等后产生的信号
引脚输入的电平除了作为TIn以外,还会经过选择、预分频,当捕获到上升沿(可以设置为下降沿)时,捕获/比较寄存器就会把CNT计数器中的值记下来,通过这种方法可以方便地测量脉冲地宽度。
每个定时器都有4个独立的通道,要么用作输入捕获,要么用作输出比较。输出比较的功能比如,CNT计数器会跟捕获/比较寄存器中的值进行比较,如果更大通道输出高电平,更小通道输出低电平。
如果选择内部时钟APB1,那么APB1的预分频系数为1则通用定时器时钟为36MHz,APB1的预分频系数不为1,那么就为72MHz。
TIMx_PSC的预分频系数在此基础上再进行分频。
常用库函数:
void TIM_TimeBaseInit();//初始化
void TIM_Cmd();//使能
void TIM_ITConfig();//中断使能
FlagStatus TIM_GetFlagStatus();//标志位获取
void TIM_ClearFlag();//标志位清除
ITStatus TIM_GetITStatus();//中断标志位获取
void TIM_ClearITPendingBit();//挂起状态标志位清除
定时器中断实现步骤:
- 使能定时器时钟(和之前的内容一样调用APB1的使能函数)
- 初始化定时器,配置ARR(重装载寄存器),PSC(预分频系数)
- 开启定时器中断,配置NVIC(调用中断使能函数和NVIC初始化)
- 使能定时器
- 编写中断服务函数(TIMx_IRQHandler())
Tout(溢出时间) = (ARR+1)(PSC+1)/Tclk