STM32学习笔记——定时器
目录
一、定时器功能概述
1、基本定时器(TIM6&TIM7)
工作原理
时序
2、通用计时器(TIM2&TIM3&TIM4&TIM5)
时钟源
外部时钟源模式1&2
外部时钟源模式2
外部时钟源模式1
定时器的主模式输出
输入捕获
3、高级定时器(TIM1&TIM8)
重复计数器
DTG(Dead Time Generate)死区生成
刹车输入
二、定时器相关寄存器
1、TIMx_CR1/2 (TIMx_Control Register1/2) TIMx控制寄存器
2、TIMx_SMCR (TIMx_Slave Mode Control Register) 从模式控制器寄存器
3、TIMx_DIER (TIMx_DMA/Interrupt Enable Register) DMA/中断使能寄存器
4、TIMx_SR (TIMx_Status Register) 状态寄存器
5、TIMx_EGR (TIMx_Event Generation Register) 事件生成寄存器
6、TIMx_CCMR1/2 (TIMx_Capture/Compare Mode Register 1/2) 捕获比较寄存器1/2
7、TIMx_CCER (TIMx_Capture/Compare Enable Register) 捕获比较使能寄存器
8、TIMx_CNT (TIMx_Counter) 计数寄存器
9、TIMx_PSC (TIMx_Prescaler) 预分频寄存器
10、TIMx_ARR (TIMx_Auto-Reload Register) 自动重载寄存器
11、TIMx_CCR1/2/3/4 (TIMx_Capture/Compare Register1/2/3/4) 捕获/比较寄存器1/2/3/4
12、TIMx_DCR (TIMx_DMA Control Register) DMA控制寄存器
13、TIMx_DMAR (TIMx_DMA Address for Full Transfer) 全DMA传输地址寄存器
三、定时器配置
一、定时器功能概述
“在STM32中,定时器一共分为基本定时器、通用定时器、高级定时器三种,定时器是STM32众多外设中的一个。”
定时器顾名思义,即用作定时的外设,主要部分是一个带有自动重装载的16位累加计数器,计数器的时钟通过一 个预分频器得到。
计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重装载寄存器(TIMx_ARR)组成一个时基单元。
1、基本定时器(TIM6&TIM7)
基本定时器有两大功能,一是定时功能,二是用于专门驱动数模转换器(DAC)。
基本定时器分别是TIM6和TIM7,两者在功能上完全一致且互相独立,可同时使用。
工作原理
基本定时器带有一个独立的、向上递增的可编程的计数器。当给自动重装载寄存器(TIMx_ARR)设置一个值并使能后,计数寄存器(TIMx_CNT)将从0开始向上计数。当计数寄存器与自动重装载寄存器相同的时候,就会产生一个向上溢出中断,并将计数寄存器中的值清零。

图1.1 基本定时器框图
如图1.1,芯片本身无法完成计时,所以用户若想知道过去了多长时间则必须选择时钟源获取时间。一般来说,基本定时器只能从内部时钟获取时钟源。内部时钟(CK_INT)经过控制器后直接接到了预分频器寄存器(TIMx_PSC),并且变成了CK_PSC,可以认为CK_PSC就是CK_INT。根据不同需求,将会对时钟频率进行分割,得到一个新的输出的时钟频率CK_CNT。此后,时基单元正常工作。
时序

图1.2 预分频系数从1变到2的计数器时序图
如图1.2,线1代表计数器开始使能(enable),在使能之前定时器时钟不运行;使能后定时器时钟在线3之前未分频,在线3之后二分频,并且此时计数器寄存器达到自动重装值,在线3时清零,之后从0重新计数。与此同时,在线3还会产生一个更新事件。下面的预分频器控制寄存器用于用户读写分频系数,并不直接影响分频。预分频器缓冲器又叫作影子寄存器,顾名思义,起缓冲作用,直接影响分频。它的作用是防止在计数过程中突然改变分频值造成的前后频率不一致。它会等到下一个计数周期,也就是线3时才会生效。预分频器计数器每次回到0时输出一个脉冲,对应线3和线4。

图1.2 预分频系数从1变到4的计数器时序图
图1.2与图1.1原理相同,便不做赘述。
*内部时钟的频率一般是72MHz,预分频器写0代表一分频,写1代表二分频。可以这样简单记忆:分频就像切黄瓜,一刀(预分频器写1)两断(二分频),两刀三断...
2、通用计时器(TIM2&TIM3&TIM4&TIM5)
“通用定时器是在基本定时器的基础上,引入了外部引脚,通用定时器不仅仅能定时,还以定时为基础,发展出测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等功能。”

图2.1 通用定时器框图
时钟源
通用定时器除了内部时钟外,还可以选择外部时钟作为时钟源。

图2.2 内部时钟源
选择外部时钟作为时钟源时,有四个输入通道,即TIMx_CH1/2/3/4,具体选择哪一个由用户配置。
外部时钟源模式1&2

图2.3 外部时钟源模式2外部触发输入模块
外部时钟信号从TIM2_ETR (PA0引脚)进来后,经过极性选择和边沿检测器和预分频器,兵分两路。
外部时钟源模式2
一路ETRF进入触发控制器,此后便可选择作为时基单元了。这一路叫做外部时钟源模式2。若想使用外部时钟或者把这个定时器当作计数器,那么配置这一路即可。
外部时钟源模式1
另一路TRGI (Trigger In)有两个用途,第一个是触发从模式控制器;第二个是作为外部时钟源的输入,此时这一路叫做外部时钟源模式1。
此外路径a、路径b、路径c也是外部时钟源模式1.

图2.4 外部时钟源模式1外部触发输入模块
外部时钟源模式1和外部时钟源模式2是等价的,区别在于前者占用从模式触发器。

图2.5 通用定时器框图(局部)
INR0/1/2/3是其他定时器的输入通道,相当于其他定时器的TRGO;同样地,该定时器的TRGO也连接至其他定时器的ITRx。如图2.7。这样可以实现定时器级联的功能。

图2.6 示意简图
具体连接如表2.1

表2.1
总而言之,外部时钟源模式1的输入可以是ETR引脚、TIM1_CH1、TIMx_CH2、其他定时器。
定时器的主模式输出

图2.7 定时器的主模式输出
该电路可以把内部的一些事件映射到TRGO引脚上。
输出比较

图2.8 输出比较电路
该电路用于输出PWM波、驱动电机等。
输入捕获

图2.9 输入捕获电路
该电路用于测量输入信号的脉冲长度等。
3、高级定时器(TIM1&TIM8)
图3.1框内的电路与通用定时器相同。

图3.1 高级定时器
重复计数器

图3.2 重复计数器
重复计数器可以实现每隔几个周期发生一次更新(基本定时器和通用定时器都是每个周期都要发生一次更新)
DTG(Dead Time Generate)死区生成

图3.3 死区生成电路
可输出两个互补的PWM波,用于驱动三相无刷电机。
刹车输入

图3.4 刹车输入
当TIMx_BKIN产生刹车信号,或者内部时钟失效,控制电路会自动切断电机的输出,确保安全。

图3.5 定时中断基本结构 (江科大自化协)
二、定时器相关寄存器
1、TIMx_CR1/2 (TIMx_Control Register1/2) TIMx控制寄存器
2、TIMx_SMCR (TIMx_Slave Mode Control Register) 从模式控制器寄存器
3、TIMx_DIER (TIMx_DMA/Interrupt Enable Register) DMA/中断使能寄存器
4、TIMx_SR (TIMx_Status Register) 状态寄存器
5、TIMx_EGR (TIMx_Event Generation Register) 事件生成寄存器
6、TIMx_CCMR1/2 (TIMx_Capture/Compare Mode Register 1/2) 捕获比较寄存器1/2
7、TIMx_CCER (TIMx_Capture/Compare Enable Register) 捕获比较使能寄存器
8、TIMx_CNT (TIMx_Counter) 计数寄存器
9、TIMx_PSC (TIMx_Prescaler) 预分频寄存器
10、TIMx_ARR (TIMx_Auto-Reload Register) 自动重载寄存器
11、TIMx_CCR1/2/3/4 (TIMx_Capture/Compare Register1/2/3/4) 捕获/比较寄存器1/2/3/4
12、TIMx_DCR (TIMx_DMA Control Register) DMA控制寄存器
13、TIMx_DMAR (TIMx_DMA Address for Full Transfer) 全DMA传输地址寄存器
三、定时器配置
使能寄存器时钟→定时器初始化→允许定时器中断→中断源配置→开启定时器→中断服务函数
若文章内容出现错误,恳请各位批评指正,感激不尽!
相关文章:
STM32学习笔记——定时器
目录 一、定时器功能概述 1、基本定时器(TIM6&TIM7) 工作原理 时序 2、通用计时器(TIM2&TIM3&TIM4&TIM5) 时钟源 外部时钟源模式1&2 外部时钟源模式2 外部时钟源模式1 定时器的主模式输出 输入捕获…...
Android编程权威指南(第四版)- 第 4 章 UI状态的保存与恢复
文章目录 代码:依赖MainActivityQuizViewModelQuestion知识点代码: 大体是一样的,修改了一些 依赖 implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")MainActivity package com.example.geoquizimport androidx.appcompat.app.AppCompatActivi…...
代理模式
如有错误或有补充,以及任何改进的意见,请留下您的高见 定义 代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式是一种结构型模式,它可以在不修改源码的情况下增强方法,在方法前后增…...
C++三剑客之std::any(一) : 使用
相关系列文章 C三剑客之std::any(一) : 使用 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二):深入剖析 目录 1.概述 2.构建方式 2.1.构造函数 2.2.std::make_any 2.3.operator分配新值 3.访问值…...
2024年:用OKR管理你的生活
在科技高速发展的时代,越来越多的企业和团队开始采用OKR(Objectives and Key Results)管理方法来设定目标并跟踪进度。你是否想过,将OKR理念引入个人生活,以更有效地实现人生目标?本文将探讨如何在2024年运…...
Lua迭代器以及各种源函数的实现
范型for 范型for的格式如下所示: for <var-list> in <exp-list> do<body> end var-list指变量名列表,可以为多个,exp-list指表达式列表,通常情况下只有一个值。可以更具体地写为另一种形式: fo…...
e5 服务器具备哪些性能特点?
随着云计算和大数据技术的不断发展,服务器作为数据中心的核心设备,其性能特点也日益受到关注。其中,E5服务器作为当前主流的服务器类型之一,具备许多优秀的性能特点。本文将详细介绍E5服务器的性能特点,帮助读者更好地…...
《C++ Primer Plus》《2、开始学习C++》
文章目录 0 前言:1 进入C1.1 main()函数1.2 C注释1.3 预处理器和iostream1.4 头文件名1.5 名称空间1.6 使用cout进行C输出1.7 C源代码的格式化 2 C语句2.1 声明语句和变量2.2 赋值语句2.3 cout语句 3 其他C语句3.1使用cin3.2 使用cout进行拼接3.3 类简介 4 函数4.1 …...
Backtrader 文档学习- Sizers
Backtrader 文档学习- Sizers 1.概述 智能仓位 Strategy提供了交易方法,即:buy,sell和close。看一下buy的定义: def buy(self, dataNone,sizeNone, priceNone, plimitNone,exectypeNone, validNone, tradeid0, **kwargs):注意&…...
基于YOLOv8算法的照片角度分类项目实践
目录 一、任务概述二、YOLOv8算法简介2.1 算法改进2.2 算法特点2.3 网络结构2.4 性能比较 三、工程实践3.1 安装算法框架库ultralytics3.2 库存照片预处理3.2.1 提取所有图片3.2.2 去除冗余的相同照片3.2.3 去除无车辆照片3.2.4 随机提取指定数量的图片 3.3 照片朝向分类3.3.1 …...
go语言进阶篇——面向对象(一)
什么是面向对象 在我们设计代码时,比如写一个算法题或者写一个问题结局办法时,我们常常会使用面向过程的方式来书写代码,面向过程主要指的是以解决问题为中心,按照一步步具体的步骤来编写代码或者调用函数,他在问题规…...
C#,栅栏油漆算法(Painting Fence Algorithm)的源代码
1 刷油漆问题 给定一个有n根柱子和k种颜色的围栏,找出油漆围栏的方法,使最多两个相邻的柱子具有相同的颜色。因为答案可以是大的,所以返回10^97的模。 计算结果: 2 栅栏油漆算法的源程序 using System; namespace Legalsoft.Tr…...
java_error_in_pycharm.hprof文件是什么?能删除吗?
java_error_in_pycharm.hprof文件是什么?能删除吗? 🌵文章目录🌵 🌳引言🌳🌳hprof格式文件介绍🌳🌳java_error_in_pycharm.hprof文件什么情况下能删除🌳&…...
LeetCode 491 递增序列
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]说明: 给定数组的长度不会超过15。 数组中的整数范围是 [-…...
考研/计算机二级数据结构刷题之顺序表
目录 第一题 顺序表的初始化,销毁,头插,尾插,头删,尾删,指定位置插入,指定删除以及打印 第二题 移除元素 题目链接: OJ链接 题目详解:移除元素 第三题:删…...
Git 代码协同的使用方法 for Azure DevOps
1. 登陆Azure 步骤1.1. VS Code,登陆Azure Cloud的Ubuntu环境,如下: 重点: 这里的Azure Cloud的用户名是YourAzureUserName,口令是YourAzurePassword 步骤1.2. 登陆Azure Cloud的Ubuntu环境后,配置Git账户信息&…...
数据库学习笔记2024/2/5
2. SQL 全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前,先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…...
PSM-Net根据Stereo图像生成depth图像
一、新建文件夹 在KITTI数据集下新建depth_0目录 二、激活anaconda环境 conda activate pt14py37三、修改submission.py文件 3.1 KITTI数据集路径 parser.add_argument(--datapath, default/home/njust/KITTI_DataSet/00/, helpselect model)3.2 深度图像输出路径 save…...
Mocaverse NFT 概览与数据分析
作者:stellafootprint.network 编译:mingfootprint.network 数据源:Mocaverse NFT Collection Dashboard Mocaverse 是 Animoca Brands 推出的专属 NFT(非同质化代币)系列,包含 8,888 个独特的 "M…...
SpringBoot之事务源码解析
首先事务是基于aop的,如果不了解aop的,建议先去看下我关于aop的文章: Spring之aop源码解析 先说结论,带着结论看源码。首先,在bean的生命周期中, 执行实例化前置增强,会加载所有切面并放入缓存࿰…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
