STM32定时器-01定时器概述

内容概述

定时器是STM32中功能最强大、结构最复杂的一个外设,分为四部分:
一部分:定时中断功能
二部分:定时器输出比较,常见的用途:产生PWM波形,驱动电机(如驱动舵机和直流电机)
三部分:定时器输入捕获,测量方波频率
四部分:定时器编码器接口,更加方便地读取正交编码器的输出波形,在编码电机测速中应用广泛

定时器类型:
基本定时器:拥有定时中断、主模式出发DAC的功能
通用定时器:拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能
高级定时器:拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能。
高级定时器中比通用定时器多的功能主要是为了三相无刷电机的驱动设计的。

建议学习路径:通用定时器->高级定时器

时基单元

预分频器、计数器和自动重装寄存器构成最基本的计数计时电路,这一块叫时基单元。

预分频器:对计数时钟进行预分频,实际分频系数=预分频器的值+1。预分频器是16位的,所以最大值是65536分频。

计数器:对预分频后的计数时钟进行计数,计数时钟每来一个上升沿,计数器的值就加1。计数器是16位的,里面的值可以从0-65535。

自动重装寄存器:存储目标值的寄存器。

计数器的值在计数过程中可以不断地自增运行,当自增运行到目标值时,产生中断,并且清零计数器。计数器自动开始下一次的计数计时,那就完成了定时的任务。

向上的折线箭头,就代表会产生中断信号。这种计数值等于自动重装值产生的中断,叫做“更新中断”,更新中断之后,就会通往NVIC,配置好NVIC的定时器通道,那定时器的更新中断就能得到CPU的响应。向下的箭头代表会产生一个事件,这里对应的事件叫做“更新事件”,更新事件不会触发中断,但可以触发内部其他电路的工作。

在计数过程中修改了预分频器的值、或者自动重装载寄存器的值,甚至手动修改了计数器里面的值,后续再做分析。

预分频器时序

CK_CNT=CK_PSC/(PSC+1)

CK_PSC 预分频器的输入时钟
CNT_EN 计数器使能,高电平计数器正常运行,低电平计数器停止
CK_CNT 计数器时钟,既是预分频器的时钟输出,也是计数器的时钟输入,可以看到计数器未使能,计数器时钟不运行。
在计数器时钟的驱动下,下面计数器寄存器也跟随着时钟的上升沿不断自增,这里可以推断ARR自动重装值就是FC,当计数值计到和重装值相等,并且下一个时钟来临时,计数值才清零。同时下面产生一个更新事件。 这就是一个计数周期的工作流程。

        下面的三行时序描述的是预分频寄存器的一种缓冲机制,预分频控制寄存器供用户读写,但并不直接决定分频系数,预分频缓冲寄存器是真正起作用的寄存器。比如在某个时刻,把预分频控制寄存器由0改成1,如果在此时改变时钟的分频系数,那么就会导致这里在一个计数周期内,前半部分和后半部分的频率不一样。当设计了缓冲寄存器,当计数计到一半的时候,改变了分频值,这个变化并不会立刻生效,而是会等到本次计数周期结束时,产生了更新事件,预分频寄存器的值才会传递到缓冲寄存器里面去,才会生效。最后也是,预分频器内部实际上也是靠计数来分频的。当预分频值为0时,计数器就一直为0,直接输出原频率。当预分频器值为1时,计数器就0101计数。在回到0时,输出一个脉冲。这样输出频率就是输入频率的2分频。预分频器的值和实际的分频系数之间有一个数的偏移。

计数器时序

CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR+1)

增加到36的时候,发生溢出,那计到36的时候,再来一个上升沿,计数器清零,计数器溢出,产生一个更新事件脉冲,另外还会置一个更新中断标志位UF,这个标志位只要置1了,就会去申请中断,然后中断响应后,需要在中断程序中手动清零,这是计数器的工作流程。

手册中图里带黑色阴影的寄存器,都是有影子寄存器这样的缓冲机制的。包括预分频器、自动重装寄存器、和下面的捕获比较寄存器。所以计数器的这个ARR自动重装寄存器,也是有一个缓冲寄存器的。并且缓冲寄存器是用还是不用,可以自己设置

计数器无预装时序

就是没有缓冲寄存器的情况
突然更改自动加载寄存器,就是自动重装寄存器,由FF改为36,那计数值的目标就由FF变成了36,所以这里计到36之后,就直接更新,开始下一轮计数

计数器有预装时序

就是有缓冲寄存器的情况,通过ARPE位,就可以选择是否使用预装功能。
突然更改自动加载寄存器,就是自动重装寄存器,由F5改为36,那计数值的目标还是计到F5之后,产生中断事件,同时要更改的36才被传递到影子寄存器。
在下一个计数周期这个更改的36才有效。
所以可以看出,引入影子寄存器的目的实际上是为了同步,就是让值的变化和更新中断事件同步发生,防止在运行途中更改造成错误。

时钟源选择

        基本定时器只能选内部时钟,就是系统频率。通用定时器还可以选择外部时钟模式1:外部输入脚(TIx); 外部时钟模式2:外部触发输入(ETR); 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时 器Timer1而作为另一个定时器Timer2的预分频器。
       TRGI(Trigger In)单从名字来看,主要是用作触发输入来使用,这个触发输入可以触发定时器的从模式(后续再讲),本节讲的是这个触发输入当做外部时钟来使用的情况,当TRGI当做外部输入时钟来使用的时候,这一路叫做“外部时钟模式1。

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

        ETR引脚信号 既可以通过上面这一路进来当做时钟,又可以通过下面这一路进来当做时钟,两种情况对于输出而言是等价的,只不过下面这一路输入会占用触发输入的通道而已。

        定时器级联

        ITR信号是来自于其他定时器,从右边可以看出,主模式的输出TRGO可以通向其他定时器。那通向其他定时器的时候,就接到了其他定时器的ITR引脚上了。把它的更新事件映射到TRGO上,再通过这1路可以实现定时器级联的功能。

        TI1F_ED,连接的是输入捕获单元的CH1引脚,也就是从CH1引脚获得时钟,ED(Edge 边沿的意思),也就是这一路时钟,上升沿和下降沿均有效。TI1FP1和TI2FP2获得,其中TI1FP1就是CH1引脚的时钟,TI2FP1就是CH2引脚的时钟,

        一般情况下,外部时钟通过ETR引脚就可以了,设置这么复杂的输入,不仅仅是为了扩大时钟输入的范围,更多的是为了某些特殊应用场景而设计的。对于时钟而言,最常用的还是72MHz的时钟,如果要使用外部时钟,首选ETR引脚外部时钟模式2的输入,这一路最简单,最直接。

        这是定时器的一个编码器接口,,可以读取正交编码器的输出波形,后续再讲。

        右边是输出比较电路,总共4个通道,分别对应CH1-CH4的引脚,可以用于输出PWM波形,驱动电机。左边是输入捕获电路,总共4个通道,对应CH1-CH4的引脚,可以用于测量输入方波的频率等。中间的寄存器是捕获/比较寄存器,是输入捕获和输出捕获比较电路共用的。因为输入捕获和输出比较不能同时使用,所以寄存器共用,引脚也共用。

高级定时器

与通用定时器相比变动的部分:

        1.申请中断的地方,增加了一个重复次数计数器,有了这个计数器之后,就可以实现每隔几个计数周期,才发生一次更更新事件和更新中断,原来的结构是每个计数周期完成后都会发生更新,这就相当于对输出的更新信号又做了一次分频,这里可以59s多再乘65536,
        2.对输出比较模块的升级:DTG(Dead Time Generate)是死区生成电路,右边的输出引脚由原来的一个变为了两个互补的输出,可以输出一对互补的PWM波,这些电路是为了驱动三相无刷电机的,三相无刷电机还是比较常用,比如四轴飞行器,电动车的后轮、电钻等里面都可能是三相无刷电机,因为三相无刷电机的驱动电路需要三个桥臂,每个桥臂两个大功率开关管来控制,总共需要6个大功率开关管来控制,所以这里的输出PWM引脚的前三路就变为了互补的输出,而第4路却没什么变化。

        为了防止互补输出的PWM驱动桥臂时,在开关切换的瞬间,由于器件的不理想,造成短暂的直通现象,所以前面加上了死区生成电路,在开关切换的瞬间,产生一定时长的死区,让桥臂的上下管全都关断,防止直通现象。

        3.刹车输入的功能,是为了给电机驱动提供安全保障的,如果外部引脚BKIN(Break IN)产生了刹车信号,或者内部时钟失效,产生了故障,那么控制电路就会自动切断电机的输出,防止意外的发生。

主从触发模式

        主从触发模式:它让内部硬件在不受程序的控制下实现自动运行,在一些情景下将极大地减轻CPU的负担。比如:在使用DAC时,会使用DAC输出一段波形,那就需要每隔一段时间来触发一次DAC,让它输出下一个电压点,如果正常的思路来实现:就是先设置一个定时器产生中断,每隔一段时间在中断程序中调用代码手动触发一次DAC转换,然后DAC输出。但是会使主程序频繁被中断的状态,这会影响主程序的运行和其他中断的响应。

        所以定时器设置了一个主模式:使用主模式可以把定时器的更新事件映射到触发输出TRGO(Trigger Out)的位置,然后TRGO直接接到DAC的触发转换引脚上,这样定时器的更新就不需要通过中断来触发DAC转换了,仅需要把更新事件通过主模式映射到TRGO(如何映射到TRGO的呢?),然后TRGO就会直接去触发DAC了,整个过程不需要软件的参与,实现了硬件的自动化。 除了主模式还有很多硬件自动化的设计,可以后续再做了解。

计时器模式:常使用向上计数模式,最符合人脑的逻辑思维。

程序编写


1.RCC开启时钟,基本上每个代码都是第一步,不用多想,打开时钟后,定时器的基准时钟和整个外设的工作时钟就都会同时打开了,
2.选择时基单元的时钟源,对于定时器中断,选择内部时钟源,
3.配置时基单元,包括预分频器、自动重装器、计数模式等,用一个结构体配置就好了
4.配置输出中断控制,允许更新中断输出都按NVIC
5.配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
6.运行控制,整个模块配置完成后,还需要使能一下计数器,要不然计数器不会运行。
当定时器使能后,计时器就会开始计数了,当计数器更新时,触发中断。最后再写一个定时器的中断函数,这样这个中断每隔一段时间就能自动执行一次了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Ubuntu 中用 Docker 安装 RAGFlow

一、安装 1.前提条件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安装docker:在Ubuntu中安装Docker并配置国内镜像 2.设置 vm.max_map_count #设置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…

17153 班级活动

17153 班级活动 ⭐️难度:简单 🌟考点:2023、思维、国赛 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10…

Java IO 流:从字节到字符再到Java 装饰者模式(Decorator Pattern),解析与应用掌握数据流动的艺术

在 Java 编程中,IO(输入输出)流是处理数据输入输出的核心工具。无论是读取文件、网络通信,还是处理用户输入,IO 流都扮演着重要角色。本文将深入探讨 Java IO 流的核心概念、分类、经典代码实例及其应用场景&#xff0…

HTTPS

目录 一 HTTPS是什么 二 加密 三 加密方案 四 CA机构/证书 五 最终方案(对称密钥/非对称密钥/CA证书)和总体流程 一 HTTPS是什么 在应用层存在SSL,TLS(HTTP之下,传输层之上)加密/解密安全协议,如果HTTP经过这个协议,对端也走…

StarRocks 主键(Primary Key)深度解析

一、StarRocks 产品简介 StarRocks 是一款高性能分析型数据库,专为海量数据的实时分析而设计。作为新一代湖仓(Lakehouse)加速引擎,StarRocks 融合了 MPP 架构和列式存储引擎的优势,能够支持亿级数据秒级查询响应。 …

(学习总结30)Linux 进程优先级、进程切换和环境变量

Linux 进程优先级、进程切换和环境变量 进程优先级基本概念查看系统进程PRI 和 NI 解释进程优先级调整命令行调整进程优先级调整新进程调度优先级命令 nice调整已运行进程调度优先级命令 renice 使用 top 调整进程优先级使用系统调用调整进程优先级 进程的竞争、独立、并行、并…

《Manus学习手册》.pdf(文末附完整版下载地址)

大家好,我是吾鳴。 吾鳴今天要给大家分享的一份比较全面详细的Manus学习手册,该学习手册主要包含Manus产品概述与核心理念、Manus功能与使用场景、Manus技术架构与工作流、Manus案例库与用户实践、邀请码获取与内测信息、Manus与传统AI对比与优势、用户评…

【MySQL】从零开始:掌握MySQL数据库的核心概念(三)

人生碌碌,竞短论长,却不道枯荣有数,得失难量。 前言 这是我自己学习MySQL数据库的第二篇博客总结。后期我会继续把MySQL数据库学习笔记开源至博客上。 上一期笔记是关于MySQL数据库的数据类型,没看的同学可以过去看看&#xff1a…

Web3智能合约与数据交互安全性探讨

Web3智能合约与数据交互安全性探讨 随着区块链技术的飞速发展,Web3的概念已经成为技术圈的热门话题。Web3不仅仅是技术迭代,它代表了一种全新的互联网交互方式,其中智能合约扮演着核心角色。智能合约是自动执行、控制或文档化法律事件和行动…

人工智能赋能山西乡村振兴:智能空间规划与可持续发展

摘要:随着人工智能技术的快速发展,山西乡村振兴面临着从传统农业到智能化现代化转型的重大机遇。本文探讨了人工智能在山西乡村振兴中的具体应用,重点分析了智能空间规划、生态保护与环境治理、产业转型以及基础设施升级的可能路径。文章从数…

QT三 自定义控件

一 自定义控件 现在的需求是这样: 假设我们要在QWidget 上做定制,这个定制包括了关于 一些事件处理,意味着要重写QWidget的一些代码,这是不实际的,因此我们需要自己写一个MyWidget继承QWidget,然后再MyWi…

【C++ 进阶】语句:从基础到实践

目录 一、输入输出体系的范式革命 1.1 C语言的格式化 1.2 C的流抽象革命 二、字符串处理的抽象跃迁 2.1 C语言的字符指针 2.2 C的string类革命 三、结构体到类的类型系统进化 3.1 C语言的结构体局限 3.2 C类的革命性演进 四、基础控制语句差异 4.1 条件语句&#xf…

C语言操作符

🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C语言的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…

PostgreSQL:语言基础与数据库操作

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

KMP算法

KMP算法 为什么叫做KMP呢。 因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP next数组就是一个前缀表(prefix table)。 前缀表是用来回退的,它记录了模式串与…

3D点云数据处理中的聚类算法总结

1.欧式聚类: 基于点的空间距离(欧几里得距离)来分割点云,将距离较近的点归为同一簇。 欧式聚类需要的参数:邻域半径R,簇的最小点阈值minPts,最大点数阈值maxPts。 实现效率: O(n * log n) 实现…

WRC世界机器人大会-2024年展商汇总

2024世界机器人大会 时间:2024年8月21日至25日 地点:北京经济技术开发区北人亦创国际会展中心 大会主题:共育新质生产力,共享智能新未来 2024世界机器人博览会亮点纷呈,20余款人形机器人整机将亮相博览会&#xff…

拉取镜像,推送到阿里云镜像仓库

需求背景:在学习k8s,虚拟机无法正常拉取 wangyanglinux/tools:busybox 镜像。 解决办法:将墙外镜像拉到国内(阿里云)再使用 准备工作需要创建对应的镜像仓库,然后再进行推送 1. 拉取镜像 docker pull …

DeepSeek和Kimi在Neo4j中的表现

以下是2个最近爆火的人工智能工具, DeepSeek:DeepSeek Kimi: Kimi - 会推理解析,能深度思考的AI助手 1、提示词: 你能帮我生成一个知识图谱吗,等一下我会给你一篇文章,帮我从内容中提取关键要素,然后以N…

哈尔滨工业大学DeepSeek公开课人工智能:大模型原理 技术与应用-从GPT到DeepSeek|附视频下载方法

导 读INTRODUCTION 今天继续哈尔滨工业大学车万翔教授带来了一场主题为“DeepSeek 技术前沿与应用”的报告。 本报告深入探讨了大语言模型在自然语言处理(NLP)领域的核心地位及其发展历程,从基础概念出发,延伸至语言模型在机器翻…