因为定时器内容太多了,这一章先讲定时器的中断和内外时钟源选择,其余的功能再分成几章讲
定时器(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就行了,显示屏就能看到每秒加一了
谢谢观看,小白的自学总结,如有不正确的地方,还望大佬们理解并指出
(最后,基本框架图片我是参考的江科大的)