当前位置: 首页 > news >正文

基本定时器(TIM6、TIM7)的基本介绍

引言

       前面我们介绍了最简单的一类定时器——系统定时器,接下来我们要介绍的就是最常用的三类定时器,即基本定时器、通用定时器以及高级定时器。经过前面对定时器的整体介绍,我们知道定时器在STM32中算是一类功能强大、用途广泛的外设了,且这三类定时器一共有8个,对应TIM1~TIM8,那么本文我们首先介绍的就是基本定时器,对应TIM6、TIM7这两个

       因此,本文我们先对基本定时器做一个功能和原理上的基本介绍,为后续相关寄存器介绍以及案例实践做铺垫。

一、基本定时器概述

       基本定时器包括TIM6和TIM7两个定时器,与前面学习的系统定时器不同,它可装载的位数更小、计数方式也完全相反。基本定时器是一个16位自动装载计数器,而且它的计数方式只能向上计数。可想而知,我们装载的值不会直接拿去计数,而是先用一个计数器进行计数,然后达到所设置的装载值后再开始新一轮计数了。

       同时,TIM6和TIM7这两个计数器它们各自是相互独立的,分别有各自的可编程预分频器进行驱动,也就是各自需要分别设置相应的驱动时钟频率,且各自不会共享任何资源

       前面我们说,基本定时器属于一种“低配版”的定时器,其功能相对还算简单的,主要的功能也是计时、定时器中断,然后稍微多一个主模式下触发DAC(这个目前还没学,即数模转换,可不必深究)。主要原因是因为该定时器没有外接IO口,因此没办法实现对外部脉冲进行捕获、计数或者输出特殊波形等功能

因此,简单总结一下即:

       1、基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。

       2、2个定时器是互相独立的,不共享任何资源。

       3、2个基本定时器只能向上计数,所以只能计时,不能对外部脉冲进行计数。

       4、功能:定时中断,主模式,触发DAC


二、基本定时器功能框图

       接下来,我们来详细看看基本定时器的构成。打开参考手册找到基本定时器章节,在其简介即可看见相应的功能框图,如下图所示。

       我们从上往下、从左往右来一点一点得看。

2.1 时钟来源

       首先是来自RCC的TIMxCLK,这里输入了一个内部时钟CK_INT,也就是基本定时器的时钟来源

       基本定时器只有一种时钟来源,也就是上图所示的内部时钟。我们通过查看STM32的时钟树可以发现,通常来说,我们设置的系统时钟为72MHz,也就是给到AHB上的时钟频率,然后流向外设总线时,对于APB1由于最大时钟频率限制会被2分频为36MHz,然后给到APB1总线上的各个外设,刚好定时器TIM2~7(其中就包括了基本定时器)就挂载在该总线上,如下图所示。

       然后图中可以看见,进入APB2后的时钟频率为36MHz,然后会经过一个器件,若APB1预分频系数为1则直接把相应的时钟给到定时器2-7,否则频率x2,也就是说当前进入APB2的36MHz是2分频的结果,所以给定时器2-7之前会先翻倍成72MHz,因此最终基本定时器所用的时钟频率就是72MHz了。

       值得注意的是,基本定时器的时钟源是一般为72MHz,而对于系统时钟的设置,我们不一定为72MHz,也可能低于36MHz,此时给到APB1外设总线时就没必要预分频了,也就是说此时APB1预分频系数为1,那么最终给定时器2~7的频率就会低于36MHz,或者36~72MHz之间了。

2.2 触发控制器

       接着就是流向触发控制器,内部时钟给到触发控制器后可以触发不同的外设协调工作,如下图所示。

       其中一种就是可以触发DAC数模转换输出。当然,对于基本定时器来说,只是控制复位、使能和计数的功能,并将内部时钟给到下面的时基单元

2.3 时基单元

       下面一大块就属于时基单元,也就是前面所说的TimeBase,如下图所示。

      2.3.1 PSC预分频器

       由于内部时钟频率还比较高,不会直接用来作为定时器计数频率,因此首先会经过一个PSC预分频器,先将输入的时钟源进行预分频,以获取合适的定时器计数频率

       那么所谓的PSC预分频器,肯定就会需要设定预分频系数,其预分频系数的设置范围是1~65536,显然应该是一个16位的器件。

       按理说其中的数值范围应该是0~65535才对,那么为什么这里所说的是1~65536呢?那么很显然最终使用的预分频系数会在我们设定的系数基础上进行加1操作,毕竟既然是分频,那肯定不存在0分频这一说法咯,因此我们设置为0,实际就是设置的1分频,以此类推。因此实际设置的预分频系数需要减1

2.3.2 CNT计数器

       经过预分频后得到的计数频率就会控制CNT计数器按照相应的频率,从0开始向上递增的计数,直到自增到与自动重装载寄存器的值相同时的下一个时钟周期的上升沿到来,CNT计数器就会发生溢出,并从0开始计数,同时产生更新事件,若开启了中断,还会更新中断,如下图所示。

        这也意味着,这里的计数器溢出时机与前面系统是定时中断产生时机一样,会多计数一次,因此设置重装载值的时候也需要减1

       那么基本定时器一个基本的原理我们差不多知道了,所以接下来看看手册中关于计数过程的时序图,如下图所示。

       从图中可以看出,其中含有多个信号,首先是输入的时钟源CK_INT,然后经过预分频器后获得了一个频率较低的定时器计数的频率,有图可看出时钟源四个周期才是实际计数的一个周期,也就是说这是做了4分频得到的计数频率。

       然后CNT_EN是计数器使能,当为高电平时,计数器才会开始工作。此时可以看见计数器寄存器的数值随着定时器时钟频率正在自增,当达到36时,与重装载寄存器值相同了,因此在这之后的下一个时钟周期的上升沿发生了计数器溢出信号,伴随而来的就是更新事件,有中断则还会更新中断。这就是基本定时器计数的一般过程了。

2.3.3 自动重装载寄存器

       紧接着介绍的是自动重装载寄存器,关于其作用相信大家也知道了,就是存放每一轮计数的数值,这里就不再赘述。不过这个寄存器的图看着和其他的图不太一样,如下图所示。

       可以发现,这个寄存器矩形还有个阴影,这也是有一定含义的。实际上,自动重装载寄存器包括了两种寄存器,分别是预装载寄存器影子寄存器

       我们所设置的重装载值一般首先是放在了预装载寄存器中,然后根据设置的不同时机再给影子寄存器,然后计数器与影子寄存器中的重装载值进行比较。也就是说,实际上计数器是否溢出所看的是影子寄存器中的数值

       这个所谓的“不同的时机”,就是一个是否进行预装载的问题。

       基本定时器的状态寄存器中有一个预装载的标志位,如果置1则表示进行预装载。此时重装载值就会先存在预装载寄存器中,然后等到本次计数周期结束后再把预装载寄存器中的值给到影子寄存器用于计数器的比较;

       而置0就是不进行预装载。也就没有缓冲时间,不过为保持一致性,我们设置的重装载值还是会先放进预装载寄存器中,只不过这时候会马上给影子寄存器,用于计数器比较。

       因此,之所以自动重装载寄存器会分两种,产生两个步骤,主要可能是考虑到用户在计数过程中要修改重装载值的问题,然后做的一个比较完善的考虑吧。按照手册中的描述,也就是是否给装载值的修改做一个缓冲的问题了。

       那么接下来,我们就对比看看有无预加载时,中途改变重装载值的计数器时序图,如下图所示。

       首先是没有预装载的时序图

       从图中可以看出,ARPE也就是预装载使能为0,就是不进行预装载。此时我们看自动重装载寄存器原来的值为FF,然后当我们向自动重装载寄存器中写入36后,此时计数器正在自增还未溢出,但是我们发现计数器溢出的的数值已经变成了36,这意味着我们在自动重装载寄存器写入的36马上就更新到影子寄存器中了,没有作一个缓冲,也就是未进行预装载。

       其次看看看有预装载的时序图

       从图中可以看出,ARPE也就是预装载使能为1,即进行预装载。此时我们看自动重装载寄存器原来的值为F5,然后当我们向自动重装载寄存器中写入36后,此时影子寄存器中的数值仍是F5,计数器正在自增还未溢出,且计数器还是计数到F5才会发生溢出;

       当计数器寄存器的数值到F5后,下一个时钟上升沿发生溢出,产生更新事件,同时影子寄存器中的数值更新成了36,这意味着我们在自动重装载寄存器写入的36是在本轮计数器发生溢出后才更新到影子寄存器中的,相当于有一个缓冲,也就是进行了预装载操作。

       实际上,细心地同学也注意到,框图中的PSC预分频器也有一个阴影,实际上他也是有类似影子寄存器的操作,不过他是固定的存在缓冲机制,也就是说,在计数过程中我们改变的预分频系数,总是在出现计数器溢出、产生更新事件后才会在预分频器中起作用,如下图所示。

       原理和前面介绍的重装载是进行预装载的情况差不多,大家可自己理解,这里就不再赘述了。

至此,关于基本定时器的功能框图就介绍完了。


三、定时时间计算

       接下来,我们再聊聊如何计算定时时间。我们使用定时器进行计时计数等操作时,首先定时时间的配置时逃不了的,因此掌握定时时间的计算方式显得尤为重要。

       定时时间,实际上也就是计数器每一次发生溢出所经过的时间,换句话说,就是出现更新事件或者出现更新中断会经过的时间

       那么首先,肯定是有一个时钟源,用来确定计数频率。送给定时器的内部时钟频率一般为72MHz,经过预分频器后才会得到计数频率,因此计数频率=内部时钟频率 / (设置的预分频系数+1),那么相应的计数周期,即计数一次经过的时间也就是计数频率的倒数,即 (设置的预分频系数+1) / 内部时钟频率。比如预分频系数为72,则设置的预分频值为71,计数周期为(71+1)/72000000 = 1us;

       接着,就是要知道多久计数器会出现溢出,即产生更新事件或者更新中断经过的时间。那么这涉及到的就是我们设定的自动重装载值,由于基本定时器是计数器数值到重装载值后的下一个时钟上升沿发生溢出,所以设置的重装载值+1就是实际的计数次数;然后计数次数×前面得到的计数周期即为计数周期。因此计数周期=(设置的预分频系数+1) / 内部时钟频率 * (设置的重装载值+1)

       因此,假如我们需要定时1s,内部时钟频率为72MHz,那么便于计算我们进行7200分频(注意预分频数值范围1-65535),因此设置的预分频系数为7200-1=7199,然后计数次数为1/(设置的预分频系数+1) / 内部时钟频率,则设置的自动重装载值为1/(7199/72000000)-1=10000-1=9999


四、小结

       本文主要介绍了STM32中的基本定时器(TIM6和TIM7),包括其功能特点、工作原理及定时时间计算方法。基本定时器是16位自动装载计数器,只能向上计数,主要功能包括定时中断和触发DAC。其时钟源一般为72MHz,通过预分频器(PSC)和计数器(CNT)实现定时功能。自动重装载寄存器分为预装载寄存器和影子寄存器,支持预装载。最后还介绍了定时时间的计算方法。


       以上便是本次文章的所有内容,欢迎各位朋友在评论区讨论,本人也是一名初学小白,愿大家共同努力,一起进步吧!

鉴于笔者能力有限,难免出现一些纰漏和不足,望大家在评论区批评指正,谢谢!

http://www.dtcms.com/a/438746.html

相关文章:

  • 荆州网站建设兼职旅游网站功能简介
  • 有关做美食的网站android源码下载网站
  • Ubuntu中部署docker教程及使用指南(易用版)
  • c++之基础A(系统函数)(第一课)
  • 使用scrollview 时,自动滚动条和视图大于子view时居中显示
  • 如何最小阻力练习软件测试相关的英语口语
  • 专门做视频点评的网站iis 新建网站没有文件夹权限
  • 【完整源码+数据集+部署教程】 小麦病害分割系统: yolov8-seg-dyhead
  • Java 黑马程序员学习笔记(进阶篇16)
  • 自适应网站功能网站开发开发的前景
  • 整套网站设计网络服务费
  • python autocad comtypes+pyautocad二次开发 pywin32连不上高版本cad解决办法
  • Linux——0:安装与配置、命令、gcc
  • 健康管理实训室:创新教学场景,推动健康管理人才实战能力提升
  • 网站建设设计模板工业设计 做自己的网站 知乎
  • CAN-FIFO 确认处理(FIFO Acknowledge Handling)
  • Java--多线程知识(四)
  • 浅谈内存DDR——DDR4的RASR/Bank Group等技术
  • 网站上传模板后xml天气预报网站怎么做
  • 人工智能:从技术本质到未来图景,一场正在重塑世界的变革
  • 成都私人网站制作做读书网站的前景
  • linux学习笔记(11)fork详解
  • Streamlit:CSS——从基础到实战美化应用
  • ORB_SLAM2原理及代码解析:Tracking::MonocularInitialization() 函数
  • JVM的类加载机制
  • 6. Pandas 数据排序与排名
  • lanqiao1110 小王子单链表——单链表
  • 张店网站建设价免费的编程自学软件
  • 农机网站建设目标php网站mysql数据库导入工具
  • 浙江网站建设平台app开发费用计入什么科目