STM32八股【5】----- TIM定时器

news2025/4/25 17:08:47

1. TIM定时器分类

STM32 的定时器主要分为以下几类:

  • 高级定时器(Advanced TIM,TIM1/TIM8)
    具备 PWM 生成、死区控制、互补输出等高级功能,适用于电机控制和功率转换应用。
  • 通用定时器(General-purpose TIM,TIM2-TIM5/TIM9-TIM14)
    支持输入捕获、输出比较、编码器接口等功能,适用于通用定时任务。
  • 基本定时器(Basic TIM,TIM6/TIM7)
    仅支持基本的计时功能,常用于 DAC 触发或作为简单的时间基准。
  • 低功耗定时器(LPTIM)
    适用于低功耗应用,支持超低功耗模式下的定时功能。

其中,高级定时器挂载在APB2,通用和基本定时器挂载在APB1

2. TIM 主要功能

(1) 定时中断

  • 可配置定时器在设定时间后触发中断,实现周期性任务,如系统心跳或 LED 闪烁。

(2) PWM(脉宽调制)

  • 通过设置占空比,控制输出波形,用于电机控制、LED 亮度调节等。

(3) 输入捕获

  • 记录外部信号的到达时间,例如测量信号频率或脉冲宽度。

(4) 输出比较

  • 在特定时间点改变输出状态,实现精确的事件触发或波形生成。

(5) 编码器接口

  • 读取增量式编码器的脉冲信号,进行位移或角度测量,广泛用于运动控制。

3. 基本TIM主从触发模式

STM32 的 TIM 定时器支持 主从模式(Master-Slave Mode),是一种高级功能,允许一个定时器(主)触发另一个定时器(从)或外设(如DAC)的操作。

4. TIM通用定时器

4.1 计数模式:
向上计数
向下计数
中央对齐
4.2 时钟源选择

时钟源说明典型应用
内部时钟(CK_INT)由 APB1/APB2 总线时钟(PCLK)提供普通定时、PWM 生成
外部时钟模式1(ETR)外部引脚 ETR 输入信号作为时钟源频率测量、外部触发控制
外部时钟模式2(TIx)TI1TI2 输入信号作为时钟源事件计数(如红外解码)
内部触发(ITRx)由另一个定时器的输出作为时钟多定时器同步(主从模式)
编码器模式(TI1/TI2)两个输入通道用于检测正交编码器信号旋转编码器测速与方向检测

4.3 输出比较

作用:输出PWM
在这里插入图片描述

模式编号输出状态描述
OCM1Frozen当计数器与比较值匹配时,输出保持当前状态,不发生任何变化。
OCM2Active Level当计数器与比较值匹配时,输出设置为高电平(HIGH)。
OCM3Inactive Level当计数器与比较值匹配时,输出设置为低电平(LOW)。
OCM4Toggle当计数器与比较值匹配时,输出反转(Toggle)。
OCM5Set (PWM Mode)在 PWM 模式下,当计数器与比较值匹配时,输出设置为高电平(HIGH)。
OCM6Reset (PWM Mode)在 PWM 模式下,当计数器与比较值匹配时,输出设置为低电平(LOW)。
OCM7PWM Mode (Center-Aligned)在中心对齐模式下,输出在计数器达到比较值时设置高电平或低电平。
OCM8PWM Mode (Edge-Aligned)在边沿对齐模式下,输出在计数器与比较值匹配时产生一个脉冲(Pulse)。
  • Frozen 模式:保持输出不变,适用于保持定时器输出稳定的情况。
  • Active Level:输出设为高电平,适用于需要常开输出的情况。
  • Inactive Level:输出设为低电平,适用于需要常闭输出的情况。
  • Toggle:每次匹配都会切换输出状态,适用于需要周期性反转输出的场景。
  • SetReset:在 PWM 模式下使用,用于控制输出波形的高低电平。
  • PWM Mode (Center-Aligned)PWM Mode (Edge-Aligned):适用于控制占空比的脉冲宽度调制,分别适用于中心对齐和边沿对齐模式。

4.4 输入捕获

5. TIM高级定时器

5.1 重复次数计数器
重复多次才会触发中断
5.2 输出比较模块的升级
以下功能主要用于电机控制

  • 互补pwm
  • 死区生成电路
  • 刹车输入

6. 定时器配置流程

江科大的图
依次配置

  1. RCC开启
  2. 选择时基单元的时钟源
  3. 配置输出中断控制
  4. 配置NVIC,配置优先级,开启通道
  5. 使能计数器
  6. 书写中断函数

6.1 配置函数

/*
功能:此函数用于将指定的定时器 (TIMx) 进行硬件复位,将其配置恢复为默认状态。

参数:TIMx:指向目标定时器的指针,例如 TIM1, TIM2, 等。
*/
void TIM_DeInit(TIM_TypeDef* TIMx);

/*
功能:初始化定时器的基本时间配置,包括计数器的预分频器、计数器的自动重载值、计数模式等。

参数:

TIMx:指向目标定时器的指针。

TIM_TimeBaseInitStruct:一个指向 TIM_TimeBaseInitTypeDef 结构体的指针,包含初始化所需的时间基本配置参数。
*/
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

/*
功能:将 TIM_TimeBaseInitTypeDef 结构体初始化为默认值。通常在设置定时器时,先调用此函数清除结构体中的旧配置,然后再配置新的参数。

参数:TIM_TimeBaseInitStruct:指向 TIM_TimeBaseInitTypeDef 结构体的指针,用于保存定时器的时间基本配置。
*/
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

/*
功能:启用或禁用定时器。使能定时器后,计数器开始计数;禁用定时器则停止计数。

参数:

TIMx:指向目标定时器的指针。

NewState:新状态,ENABLE 启用定时器,DISABLE 禁用定时器。

*/
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

/*
功能:启用或禁用定时器的中断。根据传入的中断源,可以启用或禁用相应的中断。

参数:

TIMx:指向目标定时器的指针。

TIM_IT:指定定时器中断类型,例如 TIM_IT_Update。

NewState:新状态,ENABLE 启用中断,DISABLE 禁用中断。
*/
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

//时基选择
/*
功能:选择定时器的内部时钟源进行计时。

参数:TIMx:指向目标定时器的指针。
*/

void TIM_InternalClockConfig(TIM_TypeDef* TIMx);


/*
功能:配置定时器的外部输入触发源,以外部事件作为定时器的时钟输入。

参数:

TIMx:指向目标定时器的指针。

TIM_InputTriggerSource:外部触发源的配置。
*/
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);


/*
功能:配置定时器的输入捕获 (Input Capture) 外部时钟源,包括时钟源、极性和滤波器配置。

参数:

TIMx:指向目标定时器的指针。

TIM_TIxExternalCLKSource:外部时钟源的配置。

TIM_ICPolarity:输入捕获极性配置(上升沿或下降沿触发)。

ICFilter:输入捕获信号的滤波器配置。
*/
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);


/*
功能:配置定时器的外部触发模式 1,用于外部时钟源的配置。

参数:

TIMx:指向目标定时器的指针。

TIM_ExtTRGPrescaler:外部触发器预分频器配置。

TIM_ExtTRGPolarity:外部触发器极性配置。

ExtTRGFilter:外部触发信号的滤波器配置。
*/
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                             uint16_t ExtTRGFilter);


/*
功能:配置定时器的外部触发模式 2,用于外部时钟源的配置。

参数:

TIMx:指向目标定时器的指针。

TIM_ExtTRGPrescaler:外部触发器预分频器配置。

TIM_ExtTRGPolarity:外部触发器极性配置。

ExtTRGFilter:外部触发信号的滤波器配置。
*/
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);


/*
功能:配置定时器的外部触发源配置。

参数:

TIMx:指向目标定时器的指针。

TIM_ExtTRGPrescaler:外部触发器预分频器配置。

TIM_ExtTRGPolarity:外部触发器极性配置。

ExtTRGFilter:外部触发信号的滤波器配置。
*/
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                   uint16_t ExtTRGFilter);


/*
功能:设置定时器的预分频器,用于调整定时器的计数速度。

参数:

TIMx:指向目标定时器的指针。

Prescaler:预分频器值,用于调整计数频率。

TIM_PSCReloadMode:预分频器重载模式,决定何时更新预分频器值(TIM_PSCReloadMode_Immediate 或 TIM_PSCReloadMode_Update)。
*/
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);


/*
功能:配置定时器的计数模式,决定计数器是向上计数、向下计数还是双向计数。

参数:

TIMx:指向目标定时器的指针。

TIM_CounterMode:计数模式,通常有 TIM_CounterMode_Up (向上计数)、TIM_CounterMode_Down (向下计数) 和 TIM_CounterMode_CenterAligned (中心对齐模式)。
*/
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);


/*
功能:配置定时器的自动重载寄存器 (ARR) 预加载,使得 ARR 的更新值在下一次计数周期开始时生效。

参数:

TIMx:指向目标定时器的指针。

NewState:新状态,ENABLE 启用预加载,DISABLE 禁用预加载。
*/
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);


/*
功能:设置定时器计数器的当前值。

参数:

TIMx:指向目标定时器的指针。

Counter:要设置的计数器值。
*/
void TIM_SetCounter(TIM_TypeDef* TIMx, uint32_t Counter);


/*
功能:设置定时器的自动重载值,定时器的计数器会在达到该值时自动重新加载并清零。

参数:

TIMx:指向目标定时器的指针。

Autoreload:自动重载值。
*/
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload);


/*
功能:获取定时器当前的计数值。

参数:

TIMx:指向目标定时器的指针。
*/
uint32_t TIM_GetCounter(TIM_TypeDef* TIMx);


/*
功能:获取定时器的当前预分频器值。

参数:

TIMx:指向目标定时器的指针。
*/
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);

6.2 中断相关函数

/*
功能:检查指定定时器的中断是否被触发,即获取指定的中断标志位的状态。

参数:

TIMx:指向目标定时器的指针(例如 TIM1, TIM2 等)。

TIM_IT:要检查的定时器中断类型。常见的定时器中断类型包括:

TIM_IT_Update:更新中断标志(计数器溢出或自动重载值更新时触发)。

TIM_IT_CC1:捕获比较 1 中断标志。

TIM_IT_CC2:捕获比较 2 中断标志。

TIM_IT_CC3:捕获比较 3 中断标志。

TIM_IT_CC4:捕获比较 4 中断标志。

这些中断类型常见于定时器的配置中,当定时器达到特定条件时触发中断。
*/
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);

/*
功能:清除指定的定时器中断挂起标志。定时器中断的挂起标志位在中断发生时会被设置,该函数用于手动清除该标志位,通常在处理中断后调用,确保中断不会重复触发。

参数:

TIMx:指向目标定时器的指针(例如 TIM1, TIM2 等)。

TIM_IT:要清除的定时器中断类型(与 TIM_GetITStatus 中使用的类型相同)。

例如,TIM_IT_Update、TIM_IT_CC1 等。
*/
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

6.3 外部时钟

知识点回顾

基础
STM32的定时器主要分为哪几类?它们之间有什么区别?

请简要描述STM32定时器的主要功能有哪些?

定时器的时钟源可以来自哪里?如何配置不同的时钟源?
通用TIM
通用定时器有哪几种计数模式?请分别描述它们的特点。

如何配置定时器的向上计数模式?请描述相关寄存器的设置。

什么是定时器的预分频器(Prescaler)和自动重装载寄存器(ARR)?它们的作用是什么?

请解释PWM输出的原理,并描述如何在STM32定时器上配置PWM输出。

什么是输出比较功能?如何配置定时器的输出比较模式?
主从触发
什么是定时器的主从模式?有什么应用场景?

请举例说明如何配置一个定时器作为主设备,另一个作为从设备?

定时器之间可以通过哪些信号进行同步?
高级TIM
高级定时器相比通用定时器有哪些额外的功能?

如何配置互补PWM输出?需要考虑哪些保护机制?

什么是死区时间?为什么在电机控制中需要设置死区时间?
中断配置
定时器中断配置的基本流程是什么?

定时器可以产生哪些类型的中断?如何使能这些中断?

在中断服务函数中,如何判断是哪个定时器中断源触发了中断?
实际应用
如何使用定时器测量外部脉冲的频率和占空比?

如何利用定时器实现精确的延时功能?

在低功耗应用中,如何配置定时器以最小化功耗?

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

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

相关文章

厘米级定位赋能智造升级:品铂科技UWB技术驱动工厂全流程自动化与效能跃升”

在智能制造中的核心价值体现在‌高精度定位、流程优化、安全管理‌等多个维度,具体应用如下: 一、‌核心技术与定位能力‌ ‌厘米级高精度定位‌ UWB技术通过‌纳秒级窄脉冲信号‌(带宽超500MHz)实现高时间分辨率,结合…

C++刷题(四):vector

📝前言说明: 本专栏主要记录本人的基础算法学习以及刷题记录,使用语言为C。 每道题我会给出LeetCode上的题号(如果有题号),题目,以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…

【虚拟仪器技术】Labview虚拟仪器技术应用教程习题参考答案[13页]

目录 第1章 第2章 第3章 第4章 第5章 第6章 第7章 第8章 第1章 1. 简述虚拟仪器概念。 参考答案:虚拟仪器是借助于强大的计算机软件和硬件环境的支持,建立虚拟的测试仪器面板,完成仪器的控制、数…

UE5学习笔记 FPS游戏制作34 触发器切换关卡

文章目录 搭建关卡制作触发器传送门显示加载界面 搭建关卡 首先搭建两个关卡,每个关卡里至少要有一个角色 制作触发器传送门 1 新建一个蓝图,父类为actor,命名为portal(传送门) 2 为portal添加一个staticMesh&#…

智谱大模型(ChatGLM3)PyCharm的调试指南

前言 最近在看一本《ChatGLM3大模型本地化部署、应用开发和微调》,本文就是讨论ChatGLM3在本地的初步布设。(模型文件来自魔塔社区) 1、建立Pycharm工程 采用的Python版本为3.11 2、安装对应的包 2.1、安装modelscope包 pip install model…

新专栏预告 《AI大模型应知应会短平快系列100篇》 - 整体规划设计

做个预告,为系统化梳理AI大模型的发展脉络,并为普及AI素养做一点贡献,特给自己制定了一个小目标,3个月内完成交稿。 AI大模型应知应会短平快系列100篇 - 整体规划设计 一、基础知识模块(20篇) 1.1 大模型…

SwanLab Slack通知插件:让AI训练状态同步更及时

在AI模型训练的过程中,开发者常常面临一个难题:如何及时跟踪训练状态?无论是实验超参数的调整、关键指标的变化,还是意外中断的告警,传统的监控方式往往依赖手动刷新日志或反复检查终端,这不仅效率低下&…

操作系统高频(六)linux内核

操作系统高频(六)linux内核 1.内核态,用户态的区别⭐⭐⭐ 内核态和用户态的区别主要在于权限和安全性。 权限:内核态拥有最高的权限,可以访问和执行所有的系统指令和资源,而用户态的权限相对较低&#x…

位置编码汇总 # 持续更新

看了那么多还没有讲特别好的,GPT老师讲的不错关于三角函数编码。 一、 手撕transformer常用三角位置编码 GPT说:“低维度的编码(例如,第一个维度)可以捕捉到大的位置差异,而高维度的编码则可以捕捉到小的细…

DaVinci Resolve19.1下载:达芬奇调色中文版+安装步骤

如大家所了解的,DaVinci Resolve中文名为达芬奇,是一款专业视频编辑与调色软件。它最初以调色功能闻名,但经过多年发展,已扩展为一套完整的后期制作解决方案,涵盖了剪辑、视觉特效、动态图形和音频后期制作等多个模块。…

LINUX 1

快照 克隆:关机状态下:长时间备份 uname 操作系统 -a 获取所有信息 绝对路径 相对路径 -a -l 列表形式查看 -h 查看版本 相对路径这个还没太搞懂 LS -L LL 简写 显示当前路径 pwd cd 切换到目录 clear 清屏 reboot 重启操作系统

高效定位 Go 应用问题:Go 可观测性功能深度解析

作者:古琦 背景 自 2024 年 6 月 26 日,阿里云 ARMS 团队正式推出面向 Go 应用的可观测性监控功能以来,我们与程序语言及编译器团队携手并进,持续深耕技术优化与功能拓展。这一创新性的解决方案旨在为开发者提供更为全面、深入且…

【Windows】win10系统安装.NET Framework 3.5(包括.NET 2.0和3.0)失败 错误代码:0×80240438

一、.NET3.5(包括.NET 2.0和3.0)安装方式 1.1 联网安装(需要联网,能访问微软,简单,很可能会失败) 1.2 离线安装-救急用(需要操作系统iso镜像文件,复杂,成功几率大) 二、联网安装 通过【控制面板】→【程序】→【程序和功能】→【启用或关闭Windows功能】 下载过程…

蓝桥杯训练士兵

思路:其实每次就是要比较士兵单独训练的价格之和SUM与S的大小,如果 SUM大,那么就减去所有士兵都要训练的次数的最小值,SUM再更新一下,继续比较。 先对士兵的次数按从小到大的次序排序(很重要)&…

循环神经网络 - 简单循环网络

本文我们来学习和了解简单循环网络(Simple Recurrent Network,SRN), SRN是一个非常简单的循环神经网络,只有一个隐藏层的神经网络。 简单循环神经网络,也常称为 Elman 网络,是最基本的循环神经网络(RNN&am…

Linux 企业项目服务器组建(附脚本)

一、架构概述​ 本方案旨在为企业搭建一套高效、安全的 Linux 服务器架构,包含一台 DNS 服务器,以及一台同时承载 FTP 和 Samba 服务的服务器,满足公司在域名解析、图片存储与共享、文件共享等方面的业务需求。​ 二、服务器部署​ DNS 服…

⼆、Kafka客户端消息流转流程

这⼀章节将重点介绍Kafka的HighLevel API使⽤,并通过这些API,构建起Kafka整个消息发送以及消费的主线流程。 Kafka提供了两套客户端API,HighLevel API和LowLevel API。 HighLevel API封装了kafka的运⾏细节,使⽤起来⽐较简单&…

es 3期 第28节-深入掌握集群组建与集群设置

#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性&#xff…

如何在 SwiftUI 视图中使用分页(Paging)机制显示 SwiftData 数据(三)

概述 小伙伴们都知道,自从有了 SwiftData 的加持,现在 SwiftUI 可以非常惬意的利用描述型命令创建以数据驱动为本的视图了。这在测试或演示小项目中工作的完美无缺,不过真实世界要“残酷”的多。 实际情况是,我们无法一次性将海量数据统统拉入内存以便在 SwiftUI 中显示,…