32单片机基础:TIM定时中断

STM32中功能最强大,结构最复杂的一个外设——定时器

因为定时器的内容很多,所以本大节总共分为4个部分,8小节。

第一部分:主要讲定时器基本的定时功能,也就是定一个时间,然后让定时器每隔这个时间产生一个中断,来实现每隔一个固定时间执行一段程序的目的,比如你要做一个时钟,秒表,或者使用一些程序算法的时候,都需要用到定时中断的这个功能

第二部分:我们主要讲的是定时器输出比较的功能,输出比较这个模块最常见的用途就是产生PWM波形,用于驱动电机等设备,在这一部分,我们将会学到,使用STM32输出的PWM波形来驱动舵机和直流电机的例子

第三部分:我们主要讲的是定时器输入捕获的功能,在这部分,我们将会学习使用输入捕获这个模块来实现测量方波频率的例子,

第四部分:我们学习一下定时器的编码器接口,使用这个编码器接口,能够更加方便的读取正交编码器的输出波形,在编码电机测速中,应用十分广泛

简介

定时器就是一个计数器,当这个计数器的输入是一个准确可靠的基准时钟的时候,那它在这个基准时钟进行计数的过程,实际上就是计时的过程。比如在STM32中,定时器的基准时钟一般是主频72MHz,如果我对72MHz计72个数,那就是1MHz也就是1us的时间,如果计72000个数,那就是1KHz也就是1ms的时间。

计数器就是用来执行计数定时的一个寄存器,每来一个时钟,计数器加1,

预分频器,可以对计数器的时钟进行分频,让这个计数更加灵活。

自动重装寄存器就是计数的目标值,就是我们想要计多少个时钟申请中断。

这些定时器构成了定时器最核心的部分,我们把这一块电路称为时基单元,都是16位的,也就是65536,也就是如果预分频器设置最大,自动重装也设置最大,那定时器的最大定时时间就是59.65秒,接近一分钟。就是72M/65535/65535,得到的是中断频率。然后取倒数,就是这个时间。这就是最大的定时时间,应该说还是挺长的了,如果觉得不够长,STM32的定时器还支持级联模式,也就是一个定时器的输出,当做另一个定时器的输入,两个级联的话,就是59.65s乘以65536

再乘以65535.

注意:总线是不一样的,这个在RCC开启时钟的时候要注意一下。

不同的型号定时器种类是不同的,使用这个外设之前,一定要查一下它是不是有这个外设。别操到了不存在的外设,

高级定时器的额外功能是为了三相无刷电机的驱动设计的。

 由于基本定时器只能使用内部时钟。所以可以直接认为,连接到控制的那根线直接连到内部时钟CLK_INT.内部时钟的来源是RCC_TIMxCLK,这里的频率值一般都是系统的的72MHz,所以通向时基单元的计数频率就是72MHz,

预分频,它可以对这个72MHz的计数时钟进行预分配,比如这个寄存器写0,那就是不分频,或者说是1分频,这时候输出频率=输入频率=72MHz,那预分频写1,那就是2分频,输出频率=输入频率/2=36MHz.......所以预分频器的值和实际的分频系数相差了1.即实际分频系数=预分频器的值+1.这个预分频是16位的,所以最大值可以写65535,也就是65536分频,

计数器:这个计数器可以对预分频后的计数时钟进行计数。计数时钟每来一个上升沿,计数器的值加1.这个计数器也是16位的,所以里面的值可以从0到65535,再加的话,计数器就会回到0重新开始。所以计数器的值在计时过程中会不断地自增运行,当自增运行到目标值时,产生了中断,那就完成计时的任务。所以还需要一个存储目标值的寄存器,那就是自动重装寄存器。也是16位。它存的是我们写入的计数目标,在运行的过程中,计数值不断自增,自动重装值是一个固定的值,当计数值等于自动重装值时,就是计时时间到了,那它就会产生一个中断信号,并且清零计数器,计数器自动开始下一次的计数。

STM32定数器的一大主要特色,就是这个主从触发模式,它能让内部的硬件在不受程序的控制下实现自动运行。

DAC有什么用呢?这个用途是在我们使用DAC的时候,可能会用DAC输出一段波形。那就需要每隔一段时间来触发一次DAC(数模转换),让它输出下一个电压点。如果用正常的思路来实现的话,就是先设置一个定时器产生中断。每隔一段时间在中断程序中调用代码手动触发一次DAC转换,然后DAC输出,这样也是没有问题的,但是这样会使主程序处于频繁被中断的状态。这会影响主程序的运行和其他中断的响应。定时器就设计一个主模式,使用这个主模式可以把这个定时器的更新事件映射到这个触发输出TRGO(Trigger Out)的位置。然后TRGO直接接到DAC的触发转换引脚上,这样,定时器的更新就不需要再通过中断来触发DAC转换了。仅需要把更新事件通过主模式映射到TRGO,然后TRGO就会直接去触发DAC了,整个过程不需要软件的参与,实现了硬件自动化,这就是主模式的作用。

对于通用寄存器而言,这个计数器的计数模式就不止向上计数这一种了,也就是计数器向上自增,计到重装值,清零同时申请中断。依次循环

除了这种模式。还有向下计数模式和中央对齐模式。

向下计数就是从重装值开始,向下自减。减到0之后,回到重装值同时申请中断,然后循环

中央对齐的计数模式,就是从0开始,先向上自增,计到重装值,申请中断,然后向下自减,减到0,再申请中断。依次循环。

下图就是内外时钟源选择和主从触发模式的结构了,

对于基本定时器而言,定时只能选择内部时钟,也就是系统频率72MHz。

通用寄存器,时钟源不仅可以选择内部的72MHz时钟,还可以选择外部时钟,第一个外部时钟就是来自TIMx_ETR引脚上的外部时钟,我们参考一下;引脚定义表。

 

可以看到这里有TIM2_CH1_ETR,意思就是这个TIM2的CH1和ETR都是复用在了这个位置,也就是PA0引脚。下面也有CH2,CH3,CH4和其他定时器的一些引脚 ,也都可以查到。

所以我们可以在这TIM2的ETR引脚,也就是PA0上接一个外部方波的时钟,配置一下内部的极性选择,边沿检测,和预分频器电路。再输入一下滤波电路,这两块电路可以对外部时钟进行一定的整形,因为是外部引脚的时钟,难免会有一些毛刺,那这些电路就可以对输入的波形进行滤波。同时也可以选择一下极性和预分频器。滤波后的电路,兵分两路,上面一路ETRF进入触发控制器,紧跟着就可以选择作为时基单元的时钟了。如果你想在ETR外部引脚提供时钟,或者想对ETR时钟进行计数,把这个定时器当做计数器来用的话。那就可以配置这一路的电路,在STM32中,这一路也叫做“外部时钟模式2”

除了ETR可以提供时钟外,TRGI(Trigger in)也是可以的,从名字上看,它主要是用作触发输入来使用的,这个触发输入可以触发定时器从模式,关于触发输入和从模式,我们下面的博文会介绍,这里讲的是这个触发输入作为外部时钟来使用的情况,你暂且就可以把这个TRGI当做外部时钟的输入来看,当这个TRGI当做外部时钟来使用的时候,这一路叫作“外部时钟模式1”,那通过这一路的外部时钟有哪些呢?第一个就是ETR引脚的信号,所以ETR可以有两条路来当做时钟。两种情况对于时钟输入是等价的。只不过作为TRGI的输入会占用触发输入的通道而已。

第二部分,就是ITR信号,这一部分的时钟信号是来自其他定时器的。怎么来的呢,右边有一个TRGO,这个主模式下的输出TRGO可以通向其他定时器,那通向其他定时器的时候,就会接到了其他定时器的ITR引脚上来了。这个ITR0到ITR3分别来自四个定时器的TRGO输出。至于具体的连接方式,如下图所示

这里可以看到,TIM2的ITR0是接到了TIM1的TRGO上 ,ITR1接到了TIM8,ITR3接在了TIM4,其他定时器也可以参照这个表,这就是ITR和定时器的连接关系。通过这一路可以实现定时器级联的功能,比如我们可以初始化TIM3,然后使用主模式把它的更新事件映射到TRGO上,接在再初始化TIM2,这里选择ITR2,对应就是TIM3的TRGO,然后后面再选择时钟为外部时钟模式1,这样TIM3的更新事件就可以驱动TIM2的时基单元,也就实现了定时器级联。

继续看,这里还可以选择TI1F_ED,这里连接的是输入捕获单元的CH1引脚,也就是从CH1引脚获得时钟,后缀加一个ED(Edge)就是边沿的意思,也就是这一路输出的时钟,上升沿和下降沿均有效,

最后TRGI时钟还能通过TI1FP1和TI2FP2获得

 其中TI1FP1是CH1引脚的时钟,TI2FP2是CH2引脚上的时钟。

到这里,外部时钟1的输入依旧介绍完了,外部时钟模式1的输入可以是ETR引脚,其他定时器,CH1引脚的边沿,CH1引脚和CH2引脚,这是比较复杂的,哦我们一般情况下外部时钟通过ETR引脚就OK了。设置这么复杂的输入,不仅仅是为了扩大时钟输入的范围,更多的还是为了某些特殊应用场景而设计的·。比如为了定时器的级联而设计的这一部分。

定时器输入部分就讲完了。 

下图这个可以读取编码器的输出波形,

下面这一块是输出比较电路,总共四个通道,分别对应CH1到CH4的引脚,可以输出PWM波形,驱动电机。 

 

下面电路主要功能是测输入方波的频率 

 中间这个寄存器是捕获/比较寄存器,是输入捕获和输出比较电路共用的。因为输入捕获和输出比较不能同时使用,所以这里的寄存器是共用的,引脚也是共用的。

 

那以上有关输入捕获和输出比较电路这一部分电路,我们留到之后的视频再具体分析。我们本节主要讲的是定时器中断和内外时钟源选择,也用不到这一部分电路

定时器基本中断:

1.定时中断   2.内外时钟源选择

 为什么需要中断输出控制,因为很多地方都需要中断。

接下来看几个时序图,研究一下时基单元运行的一些细节问题。

CK_PSC:预分频的输入时钟

CNT_EN:计数器使能,高电平计数器正常运行,低电平计数器停止

CK_CNT:定时器时钟 ,它既是预分频的时钟输出 ,也是计数器的时钟输入

预分频缓冲器才是真正起作用的。

预分频器内部实际上也是靠计数来分频的,当预分频为0时,计数器的值一直为0,直接输出原频率。当预分频为1时,计数器就0/1/0/1,这样计数在回到0时,输出一个脉冲这样输入频率就是输入频率的二分频。

更新中断标志为1,进行中断响应,中断响应后,需要在中断程序中手动清零, 

ARR:自动重装寄存器,也有一个缓存寄存器,这个缓存寄存器用还是不用,是可以自己设置的

无预装时序,就是没有缓存器的情况,设置ARPE,就可以选择是否使用预装功能。

 RCC时钟树:就是STM32中用来控制产生和配置时钟,并且把配置好的时钟发送到各个外设的系统,时钟是所有外设运行的基础,所以时钟也是最先需要配置的东西,ST公司已经写好程序了,所以我们了解一下。

 下面画圈的就是我们在程序中写RCC_APB2/1PeriPhCIockCmd作用的地方。打开时钟,就是在这个位置写1,让左边的时钟能够通过与门输出到外设

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙ArkTs开发WebView问题总结

1. 加载WebView页面报错"Can not read properties of null (reading getltem)" 解决: 在加载webview的controller中加入.domStorageAccess(true) build() {Column() {Row().width(100%).height(50rpx)Web({ src: src, controller: this.controller }).javaScriptAc…

【2.3深度学习开发任务实例】(1)神经网络模型的特点【大厂AI课学习笔记】

从本章开始,我把标题的顺序变了一下,大厂AI课笔记,放到后面。因为我发现App上,标题无法显示完全。 从本章开始,要学习深度学习开发任务的全部过程了。 我们将通过小汽车识别赛道上的标志牌,给出检测框&am…

Leetcoder Day25| 回溯part05:子集+排列

491.递增子序列 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 示例: 输入:[4, 7, 6, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [6, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数…

Camtasia 2023 v23.4.2.51146 (x64) 中文激活授权版(附安装教程+激活补丁) 喀秋莎(屏幕录制剪辑) 常用快捷键

目录 功能特性 常用快捷键 一、关于文件设置 二、关于编辑设置 三、关于视图设置 四、关于录制设置 破解说明 Camtasia 2023免费版是一款由TechSmith公司官方进行汉化推出的最新版本,该软件集屏幕录制和视频剪辑功能于一体的软件,提供屏幕录制、区域录…

Maya笔记 设置工作目录

Maya会把素材场景等自动保存在工作目录里,我们可以自己定义工作目录 步骤1 创建workspace.mel文件 文件/设置项目 ——>选择一个文件夹,点击设置——>创建默认工作区 这一个后,可以在文件夹里看到.mel文件 步骤2 自动创建文件夹…

Groovy(第九节) Groovy 之单元测试

JUnit 利用 Java 对 Song 类进行单元测试 默认情况下 Groovy 编译的类属性是私有的,所以不能直接在 Java 中访问它们,必须像下面这样使用 setter: 编写这个测试用例余下的代码就是小菜一碟了。测试用例很好地演示了这样一点:用 Groovy 所做的一切都可以轻易地在 Java 程序…

使用 Debezium 和 RisingWave 对 MongoDB 进行持续分析

MongoDB 和流式 Join 的挑战 谷歌趋势显示,有关 MongoDB 流式计算的搜索率不断上升 作为一种操作型数据库,MongoDB 在提供快速数据操作和查询性能方面表现十分出色。然而,在维护实时视图或执行流处理任务的内置支持方面,它确实存…

uni-app之android原生插件开发

官网 uni小程序SDK 一 插件简介 1.1 当HBuilderX中提供的能力无法满足App功能需求,需要通过使用Andorid/iOS原生开发实现时,可使用App离线SDK开发原生插件来扩展原生能力。 1.2 插件类型有两种,Module模式和Component模式 Module模式&…

51单片机 wifi连接

一、基本概念 ESP8266是一款集成了WiFi功能的高性能芯片,广泛应用于物联网设备、智能家居、传感器网络等领域。以下是ESP8266的详细讲解: 1. 功能特点:ESP8266集成了TCP/IP协议栈,支持STA(Station)和AP&am…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(八)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型,由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”(そら sora),即天空之意,以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

虚拟机安装+固定ip地址

一、下载CentOS 二、安装CentOS 1、打开你的VMware Workstation Pro,并点击“创建新的虚拟机” 2、点选典型(推荐)(T),并点击“下一步” 3、点选稍后安装操作系统(S),并点击“下一步” 4、点选Linux,并点击“下一步” 6、点击“…

tomcat下载搭建

环境:centos7 打开环境先测试是否有网 ping www.baidu.com 在使用ifconfig命令查询ip地址 准备工作做好打开tomcat官网Apache Tomcat - Apache Tomcat 8 Software Downloads 找到tomcat8安装 复制链接 打开centos安装wget 进入到 /usr/local目录中 cd /usr/loc…

SpringMVC 学习(八)之文件上传与下载

目录 1 文件上传 2 文件下载 1 文件上传 SpringMVC 对文件的上传做了很好的封装,提供了两种解析器。 CommonsMultipartResolver:兼容性较好,可以兼容 Servlet3.0 之前的版本,但是它依赖了 commons-fileupload …

Linux 基础之 vmstat 命令详解

文章目录 一、前言二、使用说明2.1 vmstat [delay/count/d/D/t/w]2.2.vm模式的字段 一、前言 vmstat(VirtualMeomoryStatistics,虚拟内存统计)是一个不错的 Linux/Unix 监控工具,在性能测试中除了top外也是比较常用的工具之一,它可以监控操作…

算法 -【螺旋矩阵】

螺旋矩阵 题目示例1示例2 分析代码 题目 一个 m 行 n 列的矩阵 matrix ,请按照顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例1 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例2 输入:matrix…

JWT基于Cookie的会话保持,并解决CSRF问题的方案

使用JWT进行浏览器接口请求,在使用Cookie进行会话保持传递Token时,可能会存在 CSRF 漏洞问题,同时也要避免在产生XSS漏洞时泄漏Token问题,如下图在尽可能避免CSRF和保护Token方面设计了方案。 要点解释如下: 将JWT存入…

DAY12_VUE基本用法详细版

目录 0 HBuilderX酷黑主题修改注释颜色1 VUE1.1 VUE介绍1.2 Vue优点1.3 VUE入门案例1.3.1 导入JS文件1.3.2 VUE入门案例 1.4 VUE基本用法1.4.1 v-cloak属性1.4.2 v-text指令1.4.3 v-html指令1.4.4 v-pre指令1.4.5 v-once指令1.4.6 v-model指令1.4.7 MVVM思想 1.5 事件绑定1.5.1…

Centos6安装PyTorch要求的更高版本gcc

文章目录 CentOS自带版本安装gcc 4的版本1. 获取devtoolset-8的yum源2. 安装gcc3. 版本检查和切换版本 常见问题1. 找不到包audit*.rpm包2. 找不到libcgroup-0.40.rc1-27.el6_10.x86_64.rpm 的包4. cc: fatal error: Killed signal terminated program cc1plus5. pybind11/pybi…

如何使用Fastapi上传文件?先从请求体数据讲起

文章目录 1、请求体数据2、form表单数据3、小文件上传1.单文件上传2.多文件上传 4、大文件上传1.单文件上传2.多文件上传 1、请求体数据 前面我们讲到,get请求中,我们将请求数据放在url中,其实是非常不安全的,我们更愿意将请求数…

【C语言】linux内核ipoib模块 - ipoib_ib_handle_tx_wc

一、中文注释 这个函数是用来处理 Infiniband 设备在传输完成时的回调。该回调负责释放发送队列中的缓冲区并更新网络设备统计信息。 static void ipoib_ib_handle_tx_wc(struct net_device *dev, struct ib_wc *wc) {// 通过net_device结构体获取私有数据结构struct ipoib_d…