❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。
⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
专栏主页:http://t.csdn.cn/HCD8v
本学习过程参考:https://space.bilibili.com/383400717
STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf
链接里压缩包的解压密码:32
本大节主要学习TIM定时器的相关知识,包含八小节:
第一小节主要学习定时器基本定时的功能,第二小节是对第一小节的内容写两个程序进行练习,分别是定时器定时中断和定时器外部时钟;
第三小节主要学习定时器输出比较的功能,第四小节是对第三小节的内容写三个程序进行练习,分别是PWM驱动LED呼吸灯、PWM驱动舵机以及PWM驱动直流电机;
第五小节主要学习定时器输入捕获的功能,第六小节是对第五小节的内容写两个程序进行练习,分别是输入捕获模式测频率和PWMI模式测频率占空比;
第七小节主要学习定时器的编码器接口功能,第八小节是对第七小节的内容写一个程序进行练习,即编码器接口测速;
最终附上所有的源代码;
本小节主要是学习定时器基本定时的功能,也就是定一个时间,然后让定时器每隔这个时间产生一个中断,来实现每隔一个固定时间执行一段程序的目的;
文章目录
- 一、定时器基础知识
-
- 二、定时器分类
-
- 2.1 基本定时器
- 2.2 通用定时器
- 2.3 高级定时器
- 三、定时中断基本结构
- 四、定时器时序
-
- 4.1 预分频时序
- 4.2 计数器时序
- 4.3 计数器无预装时序
- 4.4 计数器有预装时序
- 五、 RCC时钟树
一、定时器基础知识
1.1 TIM简介
- 定时器最基本的功能就是定时触发中断
- 定时器本质就是一个计数器,当这个计数器的输入时一个准确可靠的基准时钟的时候,它对这个基准时钟进行计数的过程,其实就是计时的过程
- 16位计数器、预分频器、自动重装寄存器;这几个寄存器构成了定时器最核心的部分,我们称其为时基单元
1.2 定时器类型
- 需要了解TIM1到TIM8,每个数字都对应着什么类型的定时器
- RCC开启时钟的时候要注意,所使用的定时器使用的总线是APB2还是APB1
- 这三种定时器是由高级向低级向下兼容的
二、定时器分类
2.1 基本定时器
- 预分频器、CNT计数器、自动重装载寄存器,他们构成了最基本的计数计时电路,所以这一块电路就叫做时基电路,如下图所示
- 来自RCC的TIMxCLK主频一般都是72MHz
- 预分频器可以对这个72MHz的计数时钟进行预分频;比如此寄存器给0,那就是不分频,或者说1分频,这时候输出频率=输入频率=72MHz;如果预分频寄存器给1,那就是2分频,输出频率=输入频率/2 = 36MHz;如果预分频寄存器给2,那就是3分频,输出频率=输入频率/3 = 27MHz;以此类推
- 预分频器是16位的,所以其最大值可以写65535,也就是65536分频
- 预分频器就是对输入的基准频率提前进行一个分频的操作
- 计数器可以对预分频后的计数时钟进行计数,计数时钟每来一个上升沿,计数器的值就加1
- 计数器也是16位的,所以里面的值可以从0一直加到65535,如果再加,计数器就会回到0重新开始,所以计数器的值在计时过程中会不断地自增运行,当自增运行到目标值时,产生中断,那就完成了定时的任务
- 自动重装寄存器是一个可以存储目标值的寄存器;
- 自动重装寄存器也是16位的,它存的就是我们写入的计数目标
- 在运行过程中,计数器中的计数值是不断自增的,自动重装值时固定的目标,当计数值等于重装值时,计时时间就到了,就会产生中断信号,并且清零计数器;计数器自动开始下一次的计数计时
- 上图中折线箭头,表示这里会产生中断信号
- 像计数值等于自动重装值产生的中断,我们一般称其为“更新中断”;这个更新中断之后就会通完NVIC,我们再配置好NVIC的定时器通道,那定时器的更新中断就能够得到CPU的响应了。
- 图中向下的折线,表示会产生一个事件,对应的事件称为“更新事件”;
- 更新事件不会触发中断,但可以触发内部其他电路的工作
定时器的定时的总流程如下所示:
2.2 通用定时器
- 通用定时器中,最核心的部分还是时基单元,如上图所示,这部分结构和基本定时器是一样的;且部分的工作流程和基本定时器也是一样的;
- 基本定时器只支持向上计数模式;通用定时器和高级定时器均支持向上计数、向下计数、中央对齐三种计数模式;
- 上图是内外时钟源选择和主从率触发模式的结构
- 时钟源选择:对于基本定时器而言,定时只能选择内部时钟,也就是系统频率72MHz;对于通用定时器,时钟源不仅可以选择内部的72MHz时钟,还可以选择外部时钟,比如来自TIMx_ETR引脚上的外部时钟;
ITR和定时器的连接关系如下图所示:
- ITR0到ITR3分别来自其他4个定时器的TRGO输出,具体的连接关系如下表(手册中)所示:
- 上表就是ITR和定时器的连接关系
TIIF_ED从CH1引脚获得时钟,这里后缀加个ED(Edge)就是边沿的意思;
小总结:外部时钟模式1的输入可以是ETR引脚、其他定时器、CH1引脚的边沿、CH1引脚和CH2引脚
;如下图所示
- 一般情况下,外部时钟通过ETR引脚就可以了。
- 对于时钟而言,最常用的还是内部的72MHz的时钟
- 如果要使用外部时钟,首选ETR引脚外部时钟模式2的输入,这一路最简单最直接;如下图:
下图部分是输出比较电路,总共有四个通道,分别对应CH1到CH4的引脚,可以用于输出PWM波形,驱动电机。
下图左边红圈部分是输入捕获电路,也是有4个通道,对应的也是CH1到CH4的引脚,可以用于测量输入方波的频率等;
中间部分的捕获/比较寄存器是输入捕获和输出公用的,因为输入捕获和输出比较不能同时使用,所以这里的寄存器是公用的,引脚也是共用的;
2.3 高级定时器
- 高级定时器比通用寄存器增加了一个重复次数寄存器,有了这个寄存器,就可以实现每隔几个计数周期才发生依次更新事件和更新中断;这就相当于对输出的更新信号又做了一次分频,
- 对于高级定时器,我们之前计算的最大定时时间是59秒多,在这里有了重复次数计数器后,就可以再乘一个65536,这就提升了很多的定时时间;这就是重复计数器的工作流程;
三、定时中断基本结构
- 由预分频器、计数器、自动重装器组成的时基单元当然还是最重要的部分
- 运行控制可以控制寄存器的一些位,比如启动停止、向上或向下计数等等;操作这些寄存器就能控制时基单元的运行了;
- 时基单元左边部分是为时基单元提供时钟的部分,这里可以选择RCC提供的内部时钟,也可以选择ETR引脚提供的外部时钟模式2;在本小节示例程序里,第一个定时中断就是用的内部时钟这一路;第二个外部时钟就是用的外部时钟模式2这一路;
- 时基单元右边部分,就是计时时间到了之后,产生更新中断后的信号去向;(如果是高级定时器,还会多一个重复计数器)
四、定时器时序
4.1 预分频时序
- 第一行是CK_PSC,预分频器的输入时钟,选内部时钟的话,一般是72MHz
- CNT_EN,计数器使能,高电平计数器正常运行,低电平计数器停止
- CK_CNT,计数器时钟,它既是预分频器的时钟输出,也是计数器的时钟输入
4.2 计数器时序
- 更新中断标志(UIF)只要置1了,就会去申请中断,然后中断响应后,需要在中断程序中手动清零
4.3 计数器无预装时序
4.4 计数器有预装时序
五、 RCC时钟树