stm32定时器简单定时配置与时钟源选择


前言

最近复习到stm32定时器的配置和时钟源的选择,有所收获,故写此篇以作记录。

一、stm32的定时器简介

定时器,又称计数器。定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。
stm32有三种定时器,分别如下:
在这里插入图片描述
使用的较多的是通用定时器,可以配置16位计数器、预分频器、自动重装寄存器的时基单元,实现简单的计时功能。

二、定时器结构

stm32定时器的结构大致可以分为4部分:
①时钟源输入 ②时基单元 ③输入捕获 ④输出比较
在这里插入图片描述
简单定时器只有①②,通用定时器有①②③④,高级i定时器在此基础多三个功能:时基单元的重复次数计数器、比较输出中的死区互补功能、刹车功能。
本文着重讲解通用定时器

三、时钟源选择

stm32定时器的时钟源有四种可选:
● 内部时钟(CK_INT)
● 外部时钟模式1:外部输入引脚
● 外部时钟模式2:外部触发输入ETR
● 内部触发输入(ITRx):

1、内部时钟(CK_INT)
在这里插入图片描述
选择stm32的内部72MHz时钟源

void TIM_InternalClockConfig(TIM_TypeDef* TIMx);在这里插入图片描述

2、外部时钟模式1
可选两个来源
①ETR外部输入(经过数据选择器,一个) ②定时器的外部输入引脚(四个)
在这里插入图片描述

1、ETR外部时钟输入
可以通过STM32的外部ETR引脚(特殊的GPIO口,每个定时器只有一个)的脉冲作为定时器的时钟源,该时钟源可以进行极性选择、边沿检测和预分频
在这里插入图片描述

void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);	

在这里插入图片描述

2、定时器外部引脚输入

与ETR外部引脚输入类似,可以将外部脉冲信号经过极性选择和边沿检测来作为定时器的外部时钟源。
在这里插入图片描述

void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);

在这里插入图片描述
定时器外部引脚输入和ETR外部引脚输入的区别:
①都可以对外部输入时钟进行极性选择和滤波,但ETR外部引脚输入还可以对时钟进行预分频
②定时器外部引脚输入有多个,而ETR外部引脚输入只有一个

3、外部时钟模式2
只有一个来源 ETR外部引脚,不经过数据选择器
在这里插入图片描述
库函数如下:

void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                             uint16_t ExtTRGFilter);

在这里插入图片描述

4、内部触发输入(ITRx):

在这里插入图片描述

其中其他定时器的主模式输入用于实现多个定时器的串联,一个16位计数器最高可计时65536*65536/72000000可实现最长59.65秒的计时,需要计时更多时间需要进行定时器的串联,即采用其他定时器的输出作为该定时器的时钟源。

void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
在这里插入图片描述

四、时基单元

结构:
三部分组成:预分频器PSC、计数器CNT、自动重装载寄存器
在这里插入图片描述
1、预分频器PSC:
对定时器的时钟源进行分频操作。72MHz分频1为72MHz,分频2为36MHz.
2、计数器CNT:
计数个数,可以向上计数、向下计数、中央对齐计数
3、自动重装载寄存器:
计数的个数是多少,如装载了36,CNT设置为向上计数模式,计数器会从0计数到36产生一个中断。

**计时时间的计算**:
计数个数/频率=计时时间
频率=CK_PSC/(PSC+1) 计数个数=(CNT+1) 
时间=(CNT+1/(CK_PSC/(PSC+1))=CK_PSC / (PSC + 1) / (ARR + 1)
72MHZ下计时1s 72000000/(9999+1)(7199+1) 

时序
预分频器PSC:
由于预分频影子寄存器(又预分频缓冲寄存器)的存在,虽然在计数的过程①中改变了分频系数,但②脉宽未改变,说明分频没有立即生效。而是本轮计数完成后③才产生一个更新中断,真正改变分频系数。
在这里插入图片描述
(笔者没有找到stm32是否默认预分频器PSC的影子寄存器使能状态?有大佬知道可以在评论区回复一下。)

计数器CNT
TIMx_ARR没有预装载:改变装载值FF变为36,可以发现计数到36时产生更新中断。这种方式有些时候会产生一些小的BUG,如计数已经到F5,此时修改装载值为36,可能会导致计数器计数到FFFF然后重置为0,接着从0到36在产生一个更新中断。
在这里插入图片描述
TIMx_ARR已装载:
由于打开了预装载影子寄存器,计数器载预装载寄存器改变后不会立即修改装载值,而是在完成本轮计数达到装载值后,才产生一个更新中断,此时修改的装载值才会立即生效。
在这里插入图片描述
计数器预装载库函数如下:

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值