【STM32】TIM定时器

news/2024/6/3 17:34:38 标签: stm32, 嵌入式硬件, 单片机, 定时器, 定时中断

第一部分:定时器基本定时的功能;

第二部分:定时器的输出比较功能;

第三部分:定时器输入捕获的功能;

第四部分:定时器的编码接口。

1 TIM简介

  1. TIM(Timer定时器
  2. 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断(定时触发中断);
  3. 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时(72M/65536/65536,再取倒数);
  4. 不仅具备基本的定时中断功能,而且还包含内外时钟源选择输入捕获输出比较编码器接口主从触发模式等多种功能;
  5. 根据复杂度和应用场景分为了高级定时器通用定时器、基本定时器三种类型。

1.1 定时器类型

类型

编号

总线

功能

高级定时器

TIM1TIM8

APB2

拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能

通用定时器

TIM2TIM3TIM4TIM5

APB1

拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能

基本定时器

TIM6TIM7

APB1

拥有定时中断、主模式触发DAC的功能

STM32F103C8T6定时器资源:TIM1TIM2TIM3TIM4

1.1.1 基本定时器

基本定时器框图:拥有定时中断、主模式触发DAC的功能

下面三部分预分频器计数器自动重装载寄存器构成最基本的计数计时电路,因此叫时基单元。

预分频器之前连接的是基准计数时钟的输入,可以认为连接到了输入端,也就是CK_INT(72MHz)

预分频器对72MHz的计数时钟进行分频,预分频器写0就是不分频,写1就是二分频36MHz......,所以预分频器的值和实际的分频系数相差1,即实际分频系数=预分频器的值 + 1。这个预分频器是16位的,所以最大值是65535,也就是65536分频。

然后是计数器,计数器可以对预分频器后的计数时钟进行计数,计数时钟每来一个上升沿,计数器就加1,这个计数器也是16位的,所以里面的值可以从0一直加到65535,再加的话,计数器就会从0开始。所以计数器的值在计时过程中会不断的自增运行,当自增运行到目标值时,产生中断,那就完成了定时的任务,所以还需要一个存储目标值的寄存器,那就是自动重装载寄存器。

自动重装载寄存器也是16位的,它存储的就是我们写入的计数目标,在运行过程中,计数器值不断自增,自动重装载寄存器的值是固定的,当计数值等于自动重装值时,也就是计时时间到了,此时会产生一个中断信号,并且清零计数器,计数器自动开始下一次的计数计时。

UI那里向上的折线,代表这里会产生中断信号,像这种计数值等于重装值产生的中断,称为"更新中断",这个更新中断会通往NVIC,再配置好NVIC的定时器通道,那定时器的更新中断就能够得到CPU的响应了。

U向下的折线,代表这里会产生一个事件,这里对应的事件称为"更新事件",更新事件不会触发中断,但是可以触发内部其它电路的工作。

总结:从基准时钟,到预分频器,再到计数器,计数器自增,同时不断与自动重装寄存器进行比较,它俩值相等时,即计时时间到,这时会产生一个更新中断和更新事件,CPU响应更新中断,就完成定时中断的任务了。

主模式触发DAC(数字/模拟转换模块)功能:它能让内部的硬件在不受程序的控制下实现自动运行。

用途:在使用DAC的时候,可能会用DAC输出一段波形,那就需要每隔一段时间来触发一次DAC,让它输出下一个电压点。如果用正常的思路实现,就是先设置一个定时器产生中断,每隔一段时间在中断函数中调用代码手动触发一次DAC转换,然后DAC输出,这样也是没问题的,但是会使主程序处于频繁被中断的状态,会影响主程序的运行和其它中断的响应,所以定时器设置了一个主模式,使用这个主模式可以把定时器的更新事件映射到触发输出(Trigger Out, TRFO)的位置,然后TRGO直接接到DAC的触发转换引脚上,这样定时器的更新就不需要通过中断来触发DAC转换了,仅需要把更新事件通过主模式映射到TRGO,然后TRGO就会直接去触发DAC了,整个过程不需要软件的参与,实现了硬件的自动化,这就是主模式的作用。

1.1.2 通用定时器

复杂很多,中间部分还是时基单元

通用计数器那种模式是向上计数,即自增;通用定时器和高级定时器还支持向下计数模式(向下自减,减到0,再回到重装值申请中断)和中央对齐模式(先向上自增到重装值,申请中断,再向下自减,减到0,申请中断)

这部分是内外时钟源选择和主从触发模式的结构了。对于基本定时器而言,定时只能选择内部时钟,也就是系统频率72MHz;到了通用定时器这里,时钟源不仅可以选择内部的72MHz时钟,还可以选择外部时钟。第一个外部时钟来自TIMx_ETR引脚上的外部时钟,这个ETR(External)引脚的位置,参考引脚定义表。

TIM2_CH1_ETR的意思是TIM2的CH1和ETR都是复用在这个位置,即PA0引脚。

这里就可以在TIM2的ETR引脚,也就是PA0上接一个外部方波时钟,然后配置一下内部的极性选择、边沿检测和预分频器电路,再配置一下输入滤波电路(对输入波形进行滤波),滤波后的信号,兵分两路,上面一路ETRF进入触发控制器,紧跟着就可以选择作为时基单元的时钟了,这一路电路称为"外部时钟模式2"。

除了外部ETR引脚可以提供时钟外,下面还有一路可以提供时钟,就是TRGI(Trigger In),它主要的作用是用作触发输入来使用的,这个触发输入可以触发定时器的从模式。暂时可以把TRGI看作外部时钟的输入来看,这一路称为"外部时钟模式1"。通过这一路的外部时钟有ETR引脚的信号ITR信号(ITR信号来自其他定时的TRGO处,连接方式见下图:TIM2的ITR0连到TIM1的TRGO上,TIM2的ITR1连到TIM8的TRGO上,TIM2的ITR2连到TIM1的TRG3上,TIM2的ITR3连到TIM4的TRGO上)可以实现定时器级联的功能。

通过这一路的外部时钟有TI1F_ED这里连接的是输入捕获单元的CH1引脚,也就是从CH1引脚获得时钟,后面加ED,是边沿的(Edge)意思,也就是通过这一路输入的时钟,上升沿和下降沿均有效。

最后还能通过TI1FP1TI2FP2获得。其中TI1FP1连接到CH1引脚的时钟,其中TI2FP2连接到CH2引脚的时钟。

总结:外部时钟模式1的输入可以是ETR引脚、其他定时器、CH1引脚的边沿、CH1引脚和CH2引脚;一般情况外部时钟通过ETR引脚就可以了。

如果使用外部时钟,首选ETR引脚外部时钟模式2的输入。

定时的编码器接口,可以读取正交编码器的输出波形。

再看下面的电路,主要是两部分:

输出比较电路:总共有4个通道,分别对应CH1-CH4的引脚,可以用于输出PWM波形,驱动电机

输入捕获电路:总共有4个通道,分别对应CH1-CH4的引脚,可以用来测量输入方波的频率等

中间寄存器是捕获/比较寄存器,是输入捕获和输出比较共用的电路。输入捕获和输出比较不能同时使用。

1.1.3 高级定时器

和通用定时器相比多的地方,第一个是申请中断的地方,增加了重复次数计数器,实现每个几个计数周期才发生一次更新事件和更新中断(原来是每个计数周期都会发生更新),相当于对输出的更新信号又做了一次分频(59s*65536)

下面的是高级定时器对输出比较模块的升级了

DTG(Dead Time Generate)死区生成电路,右边的输出引脚由原来的一个变为两个互补的输出,可以输出一对互补的PWM波,这些电路是为了驱动三相无刷电机的(四轴飞行器、电动车的后轮、电钻等)

最后一部分就是刹车输入功能,为了给电机驱动提供安全保障的。如果外部引脚TIMx_BKIN(break in)产生刹车信号或者内部时钟失效,产生了故障,那么控制电路就会自动切断电机的输出,防止意外的发生。

1.2 定时中断基本结构


http://www.niftyadmin.cn/n/5233957.html

相关文章

二分查找:LeetCode2035:将数组分成两个数组并最小化数组和的差

本文涉及的基础知识点 二分查找算法合集 作者推荐 动态规划LeetCode2552:优化了6版的1324模式 题目 给你一个长度为 2 * n 的整数数组。你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之 差的绝对…

组件化编程

hello,我是小索奇,精心制作的Vue系列持续发放,涵盖大量的经验和示例,如果对您有用,可以点赞收藏哈~ 组件化编程 组件是什么? 一句话概括就是:实现特定功能的模块化代码单元 vm就是大哥&#xff…

LeetCode - 965. 单值二叉树(C语言,二叉树,配图)

二叉树每个节点都具有相同的值,我们就可以比较每个树的根节点与左右两个孩子节点的值是否相同,如果不同返回false,否则,返回true。 如果是叶子节点,不存在还孩子节点,则这个叶子节点为根的树是单值二叉树。…

【C++干货铺】继承 | 多继承 | 虚继承

个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 继承的概念及定义 继承的概念 继承的定义 继承基类成员访问方式的变化 基类和派生类的赋值转化 继承中的作用域 派生类的默认成员函数 构造函数 拷贝构造…

深度学习之基于Django文本情感分析识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在文本情感分析领域的应用已经取得了显著的进展。Django是一个流行的Python Web框架,它可以帮助…

无人机停机坪的主要功能有哪些

随着无人机行业领域的不断完善,无人机停机坪作为一项关键基础设施,正发挥着越来越重要的作用。无人机停机坪也叫无人机机巢、无人机机库、无人机机场。无人机停机坪不仅是无人机的“家”,更是其高效运行的关键环节。让我们一同探索无人机停机…

使用coco数据集进行语义分割(1):数据预处理,制作ground truth

如何coco数据集进行目标检测的介绍已经有很多了,但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json,将上面那些json中的dict转化为图片的label mask&am…

杨志丰:OceanBase助力企业应对数据库转型深水区挑战

11 月 16 日,OceanBase 在北京顺利举办 2023 年度发布会,正式宣布:将持续践行“一体化”产品战略,为关键业务负载打造一体化数据库。OceanBase 产品总经理杨志丰发表了《助力企业应对数据库转型深水区挑战》主题演讲。 以下为演讲…