STM32单片机(六)TIM定时器 -> 第一节:TIM定时中断

  • Post author:
  • Post category:其他


❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括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模式测频率占空比;

第七小节主要学习定时器的编码器接口功能,第八小节是对第七小节的内容写一个程序进行练习,即编码器接口测速;

最终附上所有的源代码;

本小节主要是学习定时器基本定时的功能,也就是定一个时间,然后让定时器每隔这个时间产生一个中断,来实现每隔一个固定时间执行一段程序的目的;



一、定时器基础知识



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 计数器无预装时序

在这里插入图片描述

  • ARPE=1,



4.4 计数器有预装时序

在这里插入图片描述



五、 RCC时钟树

在这里插入图片描述



版权声明:本文为AnChenliang_1002原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。