STM32定时器

STM32定时器

一、通用定时器功能特点描述
1.STM32F4的通用TIMx (TIM2、TIM3、TIM4和 TIM5)定时器功能特点包括:16(TIM3、TIM4)/32(TIM2、TIM5)位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器
(TIMx_CNT)
2.16位可编程(可以实时修改)预分频器(TIMX_PSC),计数器时钟频率的分频系数为1~65535之间的任意数值。
3.4个独立通道(TIMx_ CH1~4),这些通道可以用来作为:
(1)输入捕获
(2)输出比较
(3)PWM生成(边缘或中间对齐模式)
(4)单脉冲模式输出
4.可使用外部信号(TMx_ETR) 控制定时器和定时器互连(可以用1个定时器控制另外一个定时器)的同步电路。
5.如下事件发生时产生中断/DMA (6个独立的IRQ/DMA请求生成器):
(1)更新:计数器向上海出/向下溢出,计数器初始化(通过软件或者内部/外
部触发)
(2)触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
(3)输入捕获
(4)输出比较
(5)支持针对定位的增量(正交)编码器和霍尔传感器电路
(6)触发输入作为外部时钟或者按周期的电流管理
注:通用定时器TIM9—TIM14不可触发DMA请求,16位计数模式,2通道,其余与上文所述的TIM2—TIM5基本一致
6.STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。
7.使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。
二、计数器模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
(1)向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
(2)向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
(3)中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件,然后再从0开始重新计数。
三、通用定时器工作原理

通用定时器框图
在这里插入图片描述

第一部分,产生时钟源CK_PSC
在这里插入图片描述

时钟来源:
计数器时钟可由下列时钟源提供:
(1)内部时钟 (CK_INT),(来自于APB1)
(2)外部时钟模式 1:外部输入引脚 (TIx,x=0-4),即来自于其他的定时器的输出
(3)外部时钟模式 2:外部触发输入 (ETR),仅适用于 TIM2、TIM3 和 TIM4。
(4)内部触发输入 (ITRx):使用一个定时器作为另一个定时器的预分频器,例如可以将定时 器配置为定时器 2 的预分频器。

时基单元
在这里插入图片描述
时基单元包括:
● 计数器寄存器 (TIMx_CNT)
● 预分频器寄存器 (TIMx_PSC)
● 自动重载寄存器 (TIMx_ARR)

自动重载寄存器是预装载的。对自动重载寄存器执行写入或读取操作时会访问预装载寄存器。预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件 (UEV) 时传送到影子寄存器,这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 (ARPE)。当 计数器达到上溢值(或者在递减计数时达到下溢值)并且 TIMx_CR1 寄存器中的 UDIS 位为 0 时,将发送更新事件。该更新事件也可由软件产生。
计数器由预分频器输出 CK_CNT 提供时钟,仅当 TIMx_CR1 寄存器中的计数器启动位 (CEN) 置 1 时,才会启动计数器。
产生的CK_PSC进行分频,产生CK_CNT,根据此时钟以及出发控制器钟设置的向上/向下计数来进行计数。

输入比较
在这里插入图片描述

输入滤波器和边沿检测器进行捕获,产生信号经过下面的预分频器(决定几个信号检测一次),得到的值与计数器中的值进行比较,产生相应事件。

输出比较
在这里插入图片描述

CNT计数器计数产生值与捕获比较寄存器比较,根据比较的大小产生相应高低电平。

相关寄存器
在这里插入图片描述

定时器中断实现步骤:
1.使能定时器时钟。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE); //时钟使能

2.初始化定时器,配置ARR(自动装载值),PSC(预分频系数)。

void TIM_TimeBaseInit(TIM_TypeDef*TIMx,
TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); 
//前面指是哪个TIM,后面指TimeBaseInitStruct结构体指针。
eg:
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   
//定义TIM初始化类型结构体变量
TIM_TimeBaseStructure.TIM_Period = 5000;   
//设置自动重载计数周期值
TIM_TimeBaseStructure.TIM_Prescaler =7199;   
//设置分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
//设置时钟分频因子
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
//设置为向上计数方式
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);  
//初始化时钟TIMx

3.设置允许更新中断

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, 
FunctionalState NewState);
//第二个参数非常关键,是用来指明我们使能的定时器中断的类型,
//定时器中断的类型有很多种,包括更新中断 TIM_IT_Update,
//触发中断 TIM_IT_Trigger,以及输入捕获中断等等。
//第三个参数就很简单了, 就是失能还是使能 。

4.开启定时器中断,配置NVIC。

NVIC_Init();
eg:
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; 
//TIM3 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
//先占优先级 0 级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
//从优先级 3 级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
//IRQ 通道被使能
NVIC_Init(&NVIC_InitStructure); 
//初始化 NVIC 寄存器
TIM_Cmd(TIM3, ENABLE); 
//使能 TIM3 

5.使能定时器。

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) ;

6.编写中断服务函数。

TIMX_IRQHandler();

常用函数:
定时器使能函数

void TIM_Cmd(TIM_ TypeDef* TIMx, FunctionalState NewState)

定时器中断使能函数

void TIM_ITConfig(TIM TypeDef* TIMx,uint16_t TIM_IT,
FunctionalState NewState);

状态标志位获取和清除

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx,uint16_t TIM FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx,uint16_t TIM_FLAG);
ITStatus TIM_GetlTStatus(TIM_TypeDef* TIMx,uint16_t TIM_IT);
void TIM_ClearlTPendingBit(TIM_TypeDef* TIMx,uint16_t TIM IT);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值