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

news2024/12/24 9:06:34

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括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简介
    • 1.2 定时器类型
  • 二、定时器分类
    • 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 计数器无预装时序

在这里插入图片描述

  • ARPE=1,

4.4 计数器有预装时序

在这里插入图片描述

五、 RCC时钟树

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

震惊!kratos的make命令windows下无法使用

Make 命令 kratos想在windows下开发的舒服,各种 命令必须得支持,不然一个protoc就是噩梦,好在官方内置了一些make api这样的命令,坏在windows不支持make命令😂 MinGw 百度一搜大概是MinGW 这么个东西,这…

【Linux】软硬链接与动静态库

环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅 🌹 相关文章: 【Linux】动静态库以及动静态链接 【Linux】基础IO_文件系统 软硬链接 软链接 我们知道,每一个文件都会有自己…

TypeScript学习(1)- ts基础配置介绍

目录 TypeScript是什么? TypeScript开发环境搭建 TypeScript是什么? 以JavaScript为基础构建的语言一个JavaScript的超集typescript扩展了JavaScript,并添加了类型可以在任何支持JavaScript的平台中执行TS不能被js解析器直接执行&#xff0…

【多线程与高并发】- 锁的机制与底层优化原理

锁的机制与底层优化原理 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 一个有梦有戏的人 怒放吧德德 🌝分享学习心得,欢迎指正&#…

c语言第二课------地基打牢,基础打紧,不可放弃

作者前言: 欢迎小可爱们前来借鉴我的gtieehttps://gitee.com/qin-laoda 目录 变量的作用域和生命周期 常量 字符串转义字符注释 选择语句 循环语句 函数 _________________________________________________ 这次我们接着上一篇博客,我们接着来继续C语言的学习 变量的作用…

四十六、B+树

这一次我们来介绍B树。 一个m阶的B树具有如下几个特征&#xff1a; 1.根结点至少有两个子女。 2.每个中间节点都包含k-1个元素和k个孩子&#xff0c;其中 m/2 < k < m 3.每一个叶子节点都包含k-1个元素&#xff0c;其中 m/2 < k < m 4.所有的叶子结点都位于同一层。…

Python学习ing

Python中 字符串不能通过 &#xff0c;把 数字等非字符串&#xff0c;进行拼接&#xff0c; 但Javascript中是可以的。 会把数字自动转换成字符串&#xff0c; 但python 提供了占位符 %s % 占位符 city "徐州" age 20 message "我是%s人,今天%s岁" …

面向对象继承

2. 面向对象特征二&#xff1a;继承(Inheritance) 2.1 继承的概述 说到继承我们会想到什么 在Java面向对象程序设计中的继承&#xff0c;多个类中存在相同属性和行为时&#xff0c;将这些相同的内容抽取到单独一个类&#xff08;父类&#xff09;中&#xff0c;然后所有的类继…

新能源汽车保养vr仿真教学软件为职业培训带来新的思路和方法

电动车电池更换VR虚拟体验是一种利用VR虚拟现实技术实现对电动车电池更换进行模拟仿真演示和实操训练的虚拟仿真实验教学课件&#xff0c;相比传统教学模式&#xff0c;有效提高学生的实践能力和技能水平。 通过VR技术模拟现场&#xff0c;使培训人员可以身临其境滴观摩操作过程…

(二)Liunx下ElasticSearch快速搭建

1.下载安装 1).环境准备&#xff1a; 操作系统&#xff1a;centos7 es版本&#xff1a;8.8.1 jdk:17 es与jdk等兼容支持查看 2).下载安装包上传到服务器&#xff0c;官网地址 https://www.elastic.co/cn/downloads/elasticsearch 3).解压文件 tar -zxvf elasticsearch-8.8.…

信息差永远存在,聪明的人也永远能利用信息差赚钱

信息的差异永远存在&#xff01; 例子一&#xff1a; 在2018年&#xff0c;某宝在央视春晚中成功地获得了广告名额&#xff0c;但与此同时&#xff0c;上百位工程师没想到的是&#xff0c;这是一个恶梦的开始&#xff01; 由于春晚当晚的访问人数过多&#xff0c;服务器立刻发…

模块化相关知识点

这里写目录标题 模块化概述基本使用&#xff08;包的跨模块使用&#xff09;介绍代码演示 模块服务的使用&#xff08;跨模块接口的实现&#xff09;简介具体代码 模块化 概述 基本使用&#xff08;包的跨模块使用&#xff09; 介绍 代码演示 首先 要在第一个模块里&#xf…

路径规划算法:基于算术优化优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于算术优化优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于算术优化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

SpringCloud公共模块项目搭建(二)

我们新建module公共模块项目 microservice-common&#xff0c;主要是放一些其他项目公用的东西&#xff0c;比如实体类&#xff0c;工具类等等&#xff1b; 新建module 勾选 create a simple project 取下module 名称 mircoservice-common 这里用默认的jar pom.xml 加下 jpa…

SpringBatch从入门到实战(四):表结构

batch_job_instance -> batch_job_execution/batch_job_execution_params -> batch_job_execution_context 一&#xff1a;batch_job_instance 作业实例 同一个作业&#xff0c;同一套作业参数 唯一标识一条记录&#xff0c;首次启动时插入一条数据。 字段描述JOB_IN…

MySQL 数据库基础

这里写目录标题 一、Mysql的基本概念数据库管理系统&#xff08;DBMS&#xff09;数据库系统 二、数据库的发展史三、 主流的数据库介绍数据库分为关系型数据库与非关系型数据库关系型数据库非关系型数据库介绍 四、 操作Mysql常用的数据类型&#xff1a;常看数据库结构查看当前…

共探数字化时代安全新思路,腾讯安全联合FreeBuf举办安全运营高峰论坛

近日&#xff0c;由网络安全行业门户FreeBuf主办&#xff0c;腾讯安全协办的「安全运营高峰论坛深圳站」在深圳益田威斯汀酒店圆满举行。在这场网络安全行业盛会上&#xff0c;数百名来自全国各地的网安人共聚一堂&#xff0c;围绕“安全运营”、“新时代下威胁情报对企业的价值…

为什么推荐使用线程池?

为什么推荐使用线程池&#xff1f; 更多优秀文章&#xff0c;请扫码关注个人微信公众号或搜索“程序猿小杨”添加。 背景&#xff1a; 若并发的线程数量很多&#xff0c;且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低系统的效率&…

如何使用Leangoo领歌scrum工具自动生成燃尽图

在上一篇&#xff0c;我为大家介绍了如何使用Leangoo领歌敏捷工具管理Sprint Backlog_哆啦B梦_的博客-CSDN博客&#xff0c;今天我们一起来看看Leangoo领歌敏捷工具是如何自动生成Scrum燃尽图的。 什么是scrum燃尽图&#xff1f; 燃尽图是在项目完成之前&#xff0c;对需要完…

什么是大数据?

现在大数据发展的如火如荼&#xff0c;也有不少小伙伴对于什么是大数据比较感兴趣&#xff0c;那么大数据在比较官方的定义是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力…