当前位置: 首页 > news >正文

STM32之五:TIM定时器(2-通用定时器)

目录

通用定时器(TIM2~5)框图

1、 输入时钟源选择

2、 时基单元

3 、输入捕获:(IC—Input Capture)

3.1 输入捕获通道框图(TI1为例)

3.1.1 滤波器:

3.1.2 边沿检测器:

3.1.3 捕获通道:

3.2 PWM输入模式

4、 输出比较:(OC—Output Compare)

4.1 PWM

4.2 PWM模式

4.3 PWM参数计算

4.4 相关寄存器

5、 GPIO配置


在前一章节,我们介绍了STM32的基本定时器STM之四:TIM定时器(1-基本定时器),本节介绍通用定时器,通用定时器包含基本定时器的所有功能,除此之外,其还能有输入捕获、输出比较、编码器接口、主从触发模式等功能。

通用定时器(TIM2~5)框图

可以将通用定时器框图分为4部分,其中第一部分为输入时钟源选择;第二部分为时基单元;第三部分为输入捕获;第四部分为输出比较。

1、 输入时钟源选择

有4种选择方式:

  • 内部时钟(CK_INT):时钟信号来自于芯片内部,等于72M,一般情况下都是使用内部时钟。
  • 外部时钟模式1:时钟信号来自于定时器的输入通道,即TI1/2/3/4。
  • 外部时钟模式2:时钟信号来自于定时器的特定输入通道TIMx_ETR。
  • 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,用来实现定时器同步或级联,主模式的定时器可以对从模式定时器执行复位、启动、停止或提供时钟。

2、 时基单元

这部分可参考STM之四:TIM定时器(1-基本定时器)2.2.3章节部分。此处讲解与基本定时器不同的部分。基本定时器的计数器只能向上计数,但是通用定时器的计数器有三种模式,分别是:向上计数,向下计数,中心对齐模式。

  • 向上计数:计数器从0开始计数,CK_CNT每来一个脉冲,计数器就+1,直到计数器的值与自动重装载寄存器ARR的值相等。此时计数器从0开始重新计数并生成计数器上溢事件。
  • 向下计数:计数器初始值=自动重装载寄存器ARR的值,CK_CNT每来一个脉冲,计数器CNT的值就减1,直到计数器的值为0。此时计数器从ARR的值开始重新计数并生成计数器下溢事件。
  • 中心对齐模式:计数器从0开始向上计数,直到CNT的值等于(ARR-1)时生成计数器上溢事件,然后从ARR的值开始向下计数,直到CNT的值等于1时生成计数器下溢事件。

3 、输入捕获:(IC—Input Capture)

输入捕获可以用来测量脉冲宽度或者测量频率。在输入捕获模式下,当检测到TIMx_CHx上的边沿信号发生跳变的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。

例如通过输入捕获来捕获高电平脉宽。常用的做法可以先设置TIMx_CHx为上升沿检测,记录发生上升沿的时候TIMx_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的TIMx_CNT的值。这样前后两次TIMx_CNT之差,就是高电平的脉宽。

3.1 输入捕获通道框图(TI1为例)

观看框图,我们可以发现,输入通道TI1首先进入到滤波器输出为TI1F,滤波器还有另外两个输入项:fDTS和ICF[3:0],之后TI1F经过边沿检测器后输出为TI1FP1,之后将输入通道的信号(TI1FP1/TI2FP2)映射到捕获通道IC1上,经分频器后输入IC1PS中,接入到输入/捕获寄存器。TI1FP1另外还有一个输出至从模式控制器,从模式控制器可以在捕获之后自动完成CNT的清零工作,一般常用于PWM模式(下文4.1章节有介绍PWM)。下面我们分别介绍这几个阶段。

3.1.1 滤波器:

        滤波器的作用是对高频信号进行滤波,重新采样。根据采样定律,采样的频率必须大于等于两倍的输入信号。滤波器的配置由CR1寄存器的CKD位和CCMR寄存器的ICxF位来控制。

这个看的时候很难理解,看到正点原子这里解释的易懂,可参考下。

输入捕获1滤波器IC1F[3:0]用来设置输入采样频率和数字滤波器长度,见下图。其中f_{CK\_INT}是定时器的输入频率(TIMxCLK,这个不了解可以看前面基本定时器章节的框图),一般是72MHz,而f_{DTS}则是根据TIMxCR1寄存器的CKD[1:0]位来设置的,如果CKD[1:0]=00,则f_{DTS}=f_{CK\_INT},N值是滤波长度。

举个例子:假设IC1F[3:0]=0011,并设置IC1映射到通道1上,且为上升沿触发,那么在捕获到上升沿的时候,再以f_{CK\_INT}的频率连续采样到8次通道1的电平,如果都是高电平,则说明是一个有效的触发,就会触发输入捕获中断(如果开启了的话)这样可以滤掉那些高电平脉宽低于8个采样周期的脉冲信号,从而达到滤波的效果。

CKD[1:0]是时钟分频因子,决定f_{DTS}f_{DTS}f_{CK\_INT}经过分频后得到的频率,其关系见下图CKD位描述。 

3.1.2 边沿检测器:

        边沿检测器用来设置捕获什么边沿的信号,可以是上升沿、下降沿、或者是双边沿,可通过配置捕获/比较使能寄存器TIMx_CCER的CCxP位决定,CCxP=0是上升沿捕获。

3.1.3 捕获通道:

        共有4个捕获通道,即IC1/2/3/4,每个捕获通道都有相对应的捕获寄存器CCR1/2/3/4,当发生捕获的时候,计数器CNT的值就会被锁存到捕获寄存器CCR中。

        这里要搞清楚输入通道和捕获通道,4个输入通道分别为TI1/2/3/4,是为了输入信号的,而捕获通道是用来捕获输入通道的信号的。输入通道并不是一一对应捕获通道的,一个输入通道的信号可以同时输入给两个捕获通道。        

        看下图,输入通道TI1可以占用捕获通道IC1和IC2,输入通道TI2可以占用捕获通道IC1和IC2,输入通道TI3可以占用捕获通道IC3和IC4,输入通道TI4可以占用捕获通道IC3和IC4。这样进行交叉连接的目的是两个: 1.一个输入通道灵活切换两个捕获通道,可以灵活切换后续捕获电路的输入; 2.两个通道同时捕获一个引脚,可以把一个引脚的输入,同时映射到两个捕获单元,这也是PWM输入捕获的经典结构,实现两个通道(IC)对一个引脚(TI)进行捕获,就可以同时测量频率和占空比,具体可详见下面3.2章节PWM输入模式。

输入通道和捕获通道(来源:
辰哥单片机设计 STM32-定时器详解,侵删。这个图比较清晰,一目了然)

 通过TIMxCMMRx寄存器的CCxS位可以配置捕获通道映射在那个输入通道上,详看下图:

看完上面的说明,在读下参考手册的输入捕获模式的介绍,应该就会有一个全面的了解了。

 B站江协科技up主对于输入捕获总结的很详细,此处引用其总结框图

3.2 PWM输入模式

PWM模式是输入捕获的一个特殊情况,在该模式下同一个输入通道(例如TI1)占用两个捕获通道(IC1和IC2),两个通道的捕获边沿极性相反(因为PWM输入捕获模式下,其中一个捕获通道测量周期,另外一个捕获通道测量占空比,周期需要捕获两个连续的相同边沿例如两个上升沿来进行测量,但是测量占空比需要捕获一个上升沿,之后紧接着捕获一个下降沿来测量高电平脉宽,因此两个捕获边沿极性相反)。

CCR对CNT进行捕获之后,需要对CNT进行一次清0操作,这样每次捕获得到的值才是两个上升沿(下降沿)之间的时间间隔。这个清零操作,可以使用主从模式通过硬件自动完成。由输入捕获输入部分框图来看,TI1FP1信号可以通向从模式控制器,从模式控制器可以通过硬件电路自动完成CNT清零操作。

下面我们看下主模式、从模式、触发源这三个概念。

主模式可以将定时器内部的信号映射到TRGO引脚,用于触发其他外设的操作;从模式可以接收其他外设或自身外设的一些信号,用于触发自己的一些操作(定时器的运行);触发源选择,即选择从模式的触发信号源功能,也可以认为它是从模式的一部分。

主从触发模式(来源:B站江协科技)

主从模式可以使用TIMx_CR2寄存器的MMS位进行配置。

从模式控制寄存器TIMx_SMCR的SMS位可以进行从模式选择,TS位进行触发选择。 

同样,参考手册中对于PWM输入模式说明的也很详细,可参考理解。

同样,引入B站江协科技UP的总结框图,有利于记忆和理解。

首先TI1FP1配置上升沿触发,触发捕获和清零CNT,正常的捕获周期,再来一个TI1FP2,配置为下降沿触发,通过交叉通道去触发通道2的捕获单元(最开始上升沿CCR1捕获同时清零CNT,之后CNT一直加,然后在下降沿时刻触发CCR2捕获,这时CCR2的值就是CNT从上升沿到下降沿的计数值也就是高电平期间的计数值,CCR2捕获并不触发CNT清零,所以CNT继续加,直到下一次上升沿,CCR1捕获周期并CNT清零,这样执行之后CCR1就是一整个周期的计数值,CCR2就是高电平期间的计数值,用CCR2/CCR1就是占空比,以上就是PWMI模式使用两个通道来捕获频率和占空比的思路

4、 输出比较:(OC—Output Compare)

输出比较功能是用来控制一个输出波形,就是通过定时器的外部引脚对外输出控制信号,可输出八种模式,具体哪种模式可由捕获/比较模式寄存器TIMx_CCMRx的OCxM[2:0]位配置。

输出比较模式[来源:B站江协科技-PPT]

其中使用最常见的是PWM模式。

4.1 PWM

PWM(Pulse Width Modulation)简称脉宽调制,是一种利用微处理器的数字输出来对模拟电路进行控制的一种技术。

4.2 PWM模式

定时器输出比较的PWM模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。在PWM模式下,TIMx_CNT和TIMx_CCRx始终在进行比较,根据比较值对输出进行置1、置0或者翻转的操作。

以CCR1为例,CNT和CCR1经过比较,将比较值输入到输出模式控制器中,输出模式控制器共有8种模式(即为上图输出比较模式的8种),PWM下可以选择PWM1和PWM2模式,这两种模式不同之处在于输出的极性相反。输出模式控制器输出一个oc1ref信号,该信号为输出参考信号,该信号后续有两路输出,其中一路输出至主模式控制器,PWM模式下不关注这个。另外一路输出至一个选择器,该选择器由TIMx_CCER寄存器CCxP控制,若oc1ref为0,则直接接入到输出使能电路。若oc1ref为1,则该信号通过非门跳转信号接入至输出使能电路。输出使能电路由TIMx_CCER寄存器TIMx_CCxE位控制,后续经过OC1通道输出信号。

4.3 PWM参数计算

4.4 相关寄存器

主要有3个寄存器来控制PWM,分别是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。

捕获/比较模式寄存器共有两个(TIMx_CCMR1/2)共有2个,TIMx_CCMR1控制CH1和CH2,TIMx_CCMR2控制CH3和CH4。其中通过配置OCxM[2:0]位为110、111,即PWM1和PWM2模式。

捕获/比较使能寄存器,主要用到了CCxE位,改位为输入捕获/输出比较使能位。要想PWM从I/O口输出,则该位必须置1。

在输出模式下,捕获/比较寄存器(TIMx_CCRx)的值与CNT的值比较,根据比较结果产生相应动作,所以,利用这点通过修改CCRx寄存器的值,可以调整PWM输出的脉宽。

最后看下参考手册中对于PWM输出模式的介绍,加深下了解。

5、 GPIO配置

此处在注意下各种不同模式下,GPIO口的配置

相关文章:

STM32之五:TIM定时器(2-通用定时器)

目录 通用定时器(TIM2~5)框图 1、 输入时钟源选择 2、 时基单元 3 、输入捕获:(IC—Input Capture) 3.1 输入捕获通道框图(TI1为例) 3.1.1 滤波器: 3.1.2 边沿检测器&#xf…...

【分布式系统】监控平台Zabbix对接grafana

以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署(命令截图版)-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 一.安装grafana并启动 添加一台服务器192.168.80.104 初始化操作 systemctl disable --now firewalld set…...

操作系统真象还原:编写硬盘驱动程序

第13章-编写硬盘驱动程序 这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件 13.1 硬盘及分区表 13.1.1 创建从盘及获取安装的磁盘数 要实现文件系统,必须先有个磁盘介质,虽然咱们己经有个虚拟磁盘 hd60M.img,但它只…...

firewalld防火墙(二)

一:firewalld高级配置 1:关于iptables的知识 iptables 是Linux系统中传统的命令行防火墙管理工具,它基于内核的netfilter框架工作,用于配置和管理网络规则集,比如过滤(允许/拒绝)进出的数据包…...

Android-悬浮窗口

在Android系统中&#xff0c;如果应用需要弹出一个悬浮窗口&#xff0c;就需要申请一项特殊权限 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW"/>在Android O之前的系统中申请了该权限后&#xff0c;再给对应的window设置 WindowM…...

打破僵局:Foxit Reader无法打开的终极解决方案

打破僵局&#xff1a;Foxit Reader无法打开的终极解决方案 在数字化阅读时代&#xff0c;Foxit Reader作为一款广受欢迎的PDF阅读器&#xff0c;其打不开的问题无疑会给用户带来诸多不便。本文将为您提供全面的解决方案&#xff0c;从基础检查到高级技巧&#xff0c;确保您能够…...

[调试] JTAG下运行正常,从QSPI或者SD卡启动则无响应,如何查找问题

[调试] JTAG下运行正常&#xff0c;从QSPI或者SD卡启动则无响应&#xff0c;如何查找问题 一、问题现象二、用自定义fsbl替代系统默认的fsbl1. 新建fsbl_new2. 如果提示缺少xilffs库3. 使能调试信息输出 三. 启动成功和失败情况下的典型输出1. JTAG启动模式: 正常加载2. QSPI启…...

Linux内核 -- 多线程之wait_event用法

Linux Kernel 中 wait_event 的高级用法及注意事项 在Linux内核编程中&#xff0c;wait_event 系列函数是用于实现进程等待和事件通知机制的重要工具。本文将详细介绍 wait_event 的高级用法以及注意事项。 1. 基本用法 wait_event 系列宏主要包括以下几种形式&#xff1a; …...

双指针系列第 8 篇:盛水最多的容器。几句话讲明白!

Leetcode 题目链接 思路 取首尾双指针和水量如下所示&#xff0c;设高度函数为 h ( i ) h(i) h(i)&#xff0c;在下图中 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r)。 观察以 l l l 为左边界所能构成的其他水量&#xff0c;与矮的右边界搭配结果如下。 与高的…...

c++高阶-1-模板

文章目录 模板一、模板基本语法二、函数模板1.基本语法2.函数模板注意事项3.普通函数和函数模板区别4.普通函数和函数模板调用规则 三、类模板1.基本语法2.类模板和函数模板的区别3.类模板中成员函数调用时机4.类模板对象做函数参数5.类模板与继承6.成员函数的类外实现 模板 一…...

.net core 的 winform 的 浏览器控件 WebView2

在.NET Core WinForms应用程序中&#xff0c;没有直接的“浏览器控件”&#xff0c;因为WinForms不支持像WebBrowser控件那样的功能。但是&#xff0c;你可以使用WebView2控件&#xff0c;它是一个基于Chromium的浏览器内核&#xff0c;可以在WinForms应用程序中嵌入Web内容。 …...

Django QuerySet对象,all()方法

all()方法 在Django中&#xff0c;all()方法是QuerySet对象的一个方法&#xff0c;用于获取模型的所有实例。 当你调用ModelName.objects.all()时&#xff0c;Django会生成一个SQL查询&#xff0c;从数据库中获取该模型的所有记录&#xff0c;并返回一个QuerySet对象&#xf…...

自动生成网站sitemap

要在 Next.js 和 Contentlayer 项目中实现自动生成 Sitemap 的功能&#xff0c;你可以编写一个脚本&#xff0c;在每次生成文档后自动生成 Sitemap。以下是一个示例脚本&#xff0c;你可以根据自己的需求进行调整。 步骤 1&#xff1a;安装必要的依赖 首先&#xff0c;你需要…...

中国经济昆虫志(55卷)

中国经济昆虫志&#xff0c;共55卷&#xff0c;内容包括概述、形态特征、分类等。各级分类单元均编有检索表&#xff0c;每个种有特征描述、地理分布&#xff0c;有的还记载有生活习性和防治方法。为便于鉴定&#xff0c;绘制有特征图和彩色图。 包括鞘翅目天牛科、半翅目蝽科、…...

linux环境安装elasticsearch缓存数据库和Kibana客户端

linux环境安装elasticsearch缓存数据库&#xff0c;今天我们安装7.17.18版本&#xff0c;并分析遇到的问题。 一、elasticsearch安装运行 1、直接下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.18-linux-x86_64.tar.gz2、解压 tar -…...

OpenSSL的一些使用案例

目录 一、介绍 二、基本使用 1、Shell &#xff08;1&#xff09;文件加解密 &#xff08;2&#xff09;生成密钥文件 2、API &#xff08;1&#xff09;md5sum &#xff08;2&#xff09;AES256加解密 一、介绍 本篇博客重点不是详细描述 OpenSSL 的用法&#xff0c;只…...

常用字符串方法<python>

导言 在python中内置了许多的字符串方法&#xff0c;使用字符串方法可以方便快捷解决很多问题&#xff0c;所以本文将要介绍一些常用的字符串方法。 目录 导言 string.center(width[,fillchar]) string.capitalize() string.count(sub[,start[,end]]) string.join(iterabl…...

线程池666666

1. 作用 线程池内部维护了多个工作线程&#xff0c;每个工作线程都会去任务队列中拿取任务并执行&#xff0c;当执行完一个任务后不是马上销毁&#xff0c;而是继续保留执行其它任务。显然&#xff0c;线程池提高了多线程的复用率&#xff0c;减少了创建和销毁线程的时间。 2…...

Python28-5 k-means算法

k-means 算法介绍 k-means 算法是一种经典的聚类算法&#xff0c;其目的是将数据集分成 ( k ) 个不同的簇&#xff0c;每个簇内的数据点尽可能接近。算法的基本思想是通过反复迭代优化簇中心的位置&#xff0c;使得每个簇内的点与簇中心的距离之和最小。k-means 算法的具体步骤…...

主流国产服务器操作系统技术分析

主流国产服务器操作系统 信创 "信创"&#xff0c;即信息技术应用创新&#xff0c;作为科技自立自强的核心词汇&#xff0c;在我国信息化建设的进程中扮演着至关重要的角色。自2016年起步&#xff0c;2020年开始蓬勃兴起&#xff0c;信创的浪潮正席卷整个信息与通信技…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...