STM32定时器(TIM)

文章介绍了STM32定时器的基本概念和分类,包括基本定时器和通用定时器,重点讲解了定时器的中断机制、内外时钟源的选择以及基本定时器的计数原理。通用定时器支持更多的功能,如内外时钟源切换,输入捕获和输出比较。文章提供了配置通用定时器执行中断的步骤,并给出了中断函数的应用示例。
摘要由CSDN通过智能技术生成

因为定时器内容太多了,这一章先讲定时器的中断内外时钟源选择,其余的功能再分成几章讲

定时器(TIM)的定位是:对输入的时钟进行(上升沿/下降沿/中央对齐)计数,到了设置的某个计数阈值自动产生中断执行中断函数。

按照定时器的复杂度,我们分为三种定时器

1:基本定

2:通用定时器

3:高级定时器(这个暂时还没研究)

各个定时器的基本功能如下图由上图能看出,定时器功能由基本到高级是包含关系,我们先看编号,TIM后面跟了数字,是因为同一个芯片拥有很多个定时器,那么TIM后面跟的数字就是用来区分高级,通用,基本定时器的,对于总线,通用和高级定时器的总线都是APB1,高级定时器的总线当然要高级一些,用的是APB2的总线,这个在写定时器的时候,开启时钟那部分注意一下,按照需要的定时器,打开对应的总线。那么每个定时器的功能由上图所写,首先讲基本定时器的功能

                                                                                        基本定时器

拥有定时中断,(我的上一篇博客有讲到中断的基本知识)顾名思义就是,对时钟进行计数,达到设定的计数次数自动产生中断,执行中断函数,还有主模式触发DAC功能,我们首先来看它是怎么执行计时功能的,以下是基本定时器的框图

 下面有三个最重要的寄存器,自动重装载寄存器(ARR),分频器(PSC),计数器(CNT),这三部分称为时基单元,也就是主要靠这三部分执行计数功能,看图再往上连接控制器,选择时钟源,因为基本定时器只能选择内部时钟,所以我们可以认为,时基单元由来自内部时钟(CK_INT)提供时钟源,内部时钟的来源又来自RCC_的TIMxCLK,这里的系统主频率一般是72MHZ,然后72MHZ通向下面的时基单元,首先是预分频器(PSC),预分频器是用来对传下来的72MHZ进行分频,预分频寄存器写0,就是不分频,写1就是1分频,(预分频器16位,最大写65535,也就是最大65536分频),通俗一点来说就是,对传下来的72M砍几刀,0分频就是不砍,1分频就是砍一刀,就成了36M,分频器就是用来调整频率的,接下来说图上的计数器(CNT),计数器可以选择向上计数,向下计数,向下向上都计数,当然基本定时器只有向上计数,计数器可以对预分频后的时钟进行计数,时钟每来一个上升沿,就记一次,计数器也是16位的,最大记65535,加到65535下一次上升沿计数就跳转到0开始,当然我如果想让计数器听话,按照我的来计数,我想记到X次就跳到0怎么办呢(X是我们自己假设的哈),这下就需要自动重装载寄存器(ARR),我们对ARR设定一个值,计数器达到我们设定的ARR值就产生中断信号,执行中断程序,并自动清零,当然ARR也是16位,最大65535,接下来我画张图,总结一下时基单元这三个小伙伴之间的关系

 总结一下:传下来的内部时钟根据自己需要进行分频器分频,设置计数器阈值,也就是ARR,计数器接到时钟上升沿信号进行计数,和ARR值相等,产生中断,执行中断函数,并清零计数器,以此不断工作

                        除了拥有定时中断的作用,还有一个功能就是主模式触发DAC的功能,主从触发模式

主从触发模式:它能让内部的硬件在不受程序的控制下实现自动运行,使用这个主模式可以把这个定时器的更新事件映射到触发输出TRGO的位置,然后TRGO直接接到DAC的触发转换引脚上,这样定时器的更新就不需要再通过中断来触发DAC转换了,仅需要把更新事件通过主模式映射到TRGO,然后TRGO就会直接去触发DAC了,整个过程不需要软件参与,实现硬件自动化,这就是主模式的作用(我大致就了解到这些,更深入的了解还需要我花时间慢慢去学习)。

好了,基本定时器就讲到这里,接下来是通用定时器

                                                                通用定时器

通用定时器拥有基本定时器所有功能,另外还可以内外时钟源选择,输入捕获,输出比较,编码器接口,主从触发模式,这一章只讲内外时钟源选择。

通用定时器不仅可以选择内部时钟72MHZ,还可以选择外部时钟,也就是GPIO引脚输入时钟信号,GPIO引脚接收到的电平信号跳变,计数器就自增,至于向上计数自增,还是向下计数自增,或者中央对齐自增,要根据自己的需求设置,因为基本定时器只有向上计数,而通用定时器功能强大一些,所以可以选择自己需要的效果进行设置,关于计数方式,我画了一张图

 重点来了,先来看一张通用定时器的结构图

 1是时基单元,上面已经讲过了,3是下一章要讲的输入捕获和输出比较,2就是时钟源选择的大致流程

可以选择三个外部时钟哈,第一个是ETR外部时钟,第二个是 ITR信号(其他定时器),第三个是左下角的CH1和CH2引脚

其中,CH1和CH2引脚的时钟到下一章的输入捕获和输出比较再讲

ITR信号是来自其他定时器的TRGO,就是用其他定时器的输出引脚TRGO来接入ITR,实现定时器级连的功能,ITR和定时器的连接关系可以在参考手册里看

 

我们一般用的最多的还是ETR的外部时钟,ETR外部时钟引脚的位置,可以参考引脚定义表

 

 这些GPIO口就可以提供外部时钟,我们就可以再这些引脚上(对照结构图)配置方波时钟,极性选择,边沿检测和预分频器电路和输入滤波,输入滤波主要是处理毛刺信号,然后经过触发控制器,进入时基单元,再到中断输出控制,最后到NVIC申请中,写程序的时候,把这些挨个连通就行了,最后再给一张大致结构图,可以照着写程序

这一章我们讲的是定时器的中断和内外时钟源选择 ,为了方便,那么接下来我就用通用定时器选择内部时钟执行中断写程序

步骤:开启ARR时钟,选择时基单元时钟源,配置时基单元,允许中断输出,配置NVIC参数

1:开启RCC时钟,选择TIM2(这里注意,通用定时器是TIM2,TIM3,TIM4,TIM5都是哈,为了方便,我就选TIM2)

2:选择内部时钟 

3:配置时基单元

1分频(也就是不分频),向上计数,接下来自动重装器的值,预分频器的值,计数器的值,最后一个是高级定时器需要的参数,我们直接给0,假设设置一个定时一秒,也就是定时频率为1HZ,PSC给7200,ARR给1000,就可以实现,当然这两个值不是固定的,可以调整,具体公式是     定时频率=72M/(PSC+1)/(ARR+1)

4:使能更新中断,允许中断输出

5:NVIC分组,配置NVIC参数 ,配置中断通道,抢占优先级和响应优先级,这些上一章都讲过

6:启动定时器

 最后写每秒加一的中断函数,每秒中断一下这个条件我们已经在上面配置好了,现在只需要再中断函数里执行num++即可

你们如果要看现象的话,可以选择外接一个OLED显示屏,初始化OLED的参数 ,在OLED显示函数里面加入num就行了,显示屏就能看到每秒加一了

谢谢观看,小白的自学总结,如有不正确的地方,还望大佬们理解并指出

(最后,基本框架图片我是参考的江科大的)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值