STM32定时器的来龙去脉

一、定时器介绍  

STM32F1的定时器非常多,由2个基本定时器(TIM6、TIM7)、4个通 用定时器(TIM2-TIM5)和2个高级定时器(TIM1、TIM8)组成。基本定 时器的功能最为简单,类似于51单片机内定时器。通用定时器是在基本 定时器的基础上扩展而来,增加了输入捕获与输出比较等功能。高级定 时器又是在通用定时器基础上扩展而来,增加了可编程死区互补输出、 重复计数器、带刹车(断路)功能,这些功能主要针对工业电机控制方面

1.1 通用定时器简介   

STM32F1的通用定时器包含一个 16 位自动重载计数器(CNT),该计 数器由可编程预分频器(PSC)驱动。STM32F1的通用定时器可用于多种 用途,包括测量输入信号的脉冲宽度(输入捕获)或者生成输出波形(输出 比较和PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉 冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F1 的每个 通用定时器都是完全独立的,没有互相共享的任何资源。

STM32F1的通用定时器TIMx (TIM2-TIM5 )具有如下功能: 

(1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。 

(2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535之间的任意数值。

 (3)4个独立通道(TIMx_CH1-4),这些通道可以用来作为: A.输入捕获 B.输出比较 C. PWM 生成(边缘或中间对齐模式) D.单脉冲模式输出

(4)可使用外部信号(TIMx_ETR)控制定时器,且可实现多个定时器互连(可以用1个定时器控制另外一个定时器)的同步电路。

 (5)发生如下事件时产生中断/DMA请求: A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) C.输入捕获 D.输出比较 

(6)支持针对定位的增量(正交)编码器和霍尔传感器电路 

(7)触发输入作为外部时钟或者按周期的电流管理

1.2 通用定时器结构框图 

我们把通用定时器结构框图分成 5 个子模块,按照顺序依次进行简单介绍。

(1)标号 1:时钟源通用定时器的时钟来源有 4 种可选:

A.内部时钟(CK_INT)

B.外部时钟模式 1:外部输入引脚 TIx(x=1,2,3,4)

C.外部时钟模式 2:外部触发输入 ETR

D.内部触发输入(ITRx(x=0,1,2,3))

(2)标号 2:控制器

通用定时器控制器部分包括触发控制器、从模式控制器以及编码器接口。触发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发DAC/ADC 转换。从模式控制器可以控制计数器复位、启动、递增/递减、计数。编码器接口专门针对编码器计数而设计。 

(3)标号 3:时基单元  通用定时器时基单元包括 3 个寄存器,分别是计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。高级定时器中还有一个重复计数寄存器(TIMx_RCR),通用和基本定时器是没有的。通用定时器这三个寄存器都是 16 位有效。而高级定时器的 TIMx_RCR 寄存器是 8 位有效。  

在这个时基单元中,有个预分频器寄存器(TIMx_PSC),用于对计数器时钟频率进行分频,通过寄存器内的相应位设置,分频系数值可在 1 到 65536 之间。由于从模式控制寄存器具有缓冲功能,因此预分频器可实现实时更改,而新的预分频比将在下一更新事件发生时被采用。  

在时基单元中,还有个计数寄存器(TIMx_CNT),通用定时器计数方式有向上计数、向下计数、向上向下计数(中心对齐计数)。下面分别来介绍下这几种计数方式:

4)标号 4:输入捕获 

(5)输出比较 

 二、通用定时器配置步骤(

1)使能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟 

(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等 

voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); 

typedef struct {  

uint16_t TIM_Prescaler; //定时器预分频器  

 uint16_t TIM_CounterMode; //计数模式   

uint32_t TIM_Period; //定时器周期   

uint16_t TIM_ClockDivision; //时钟分频   

uint8_t TIM_RepetitionCounter; //重复计数器 

} TIM_TimeBaseInitTypeDef;

了解结构体成员功能后,就可以进行配置,例如:

 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

 TIM_TimeBaseInitStructure.TIM_Period=1000; //自动装载值 自己定义

TIM_TimeBaseInitStructure.TIM_Prescaler=35999; //分频系数 自己定义

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式

 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure); 

定时器定时时间计算公式如下: Tout= ((per)*(psc+1))/Tclk; 1000*(35999+1)/72;

(3)设置定时器中断类型,并使能   v

oid TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); 

(4)设置定时器中断优先级,使能定时器中断通道 NVIC初始化库函数是NVIC_Init(); 

(5)开启定时器 void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); 

(6)编写定时器中断服务函数

三、定时器中断编码

进入中断函数

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 7
收藏 8
关注 206
成为作者 赚取收益
全部留言
0/200
  • dy-blNlwnWV 2021-02-17 10:05
    学习
    回复
  • keyhei66 2020-12-16 21:59
    围观学习
    回复
  • 兰波 2020-11-20 09:33
    nice
    回复
  • lihui710884923 2020-11-19 16:28
    写的比较详细
    回复