032 - STM32学习笔记 - TIM基本定时器(一) - 定时器基本知识

news2025/1/16 17:46:12

032 - STM32学习笔记 - TIM定时器(一) - 基本定时器知识

在这里插入图片描述

这节开始学习一下TIM定时器功能,从字面意思上理解,定时器的基本功能就是用来定时,与定时器相结合,可以实现一些周期性的数据发送、采集等功能,比如定时发送USART数据、ADC定时采集数据、与GPIO结合测量信号输入脉宽以及产生输出波形,常用的PWM波控制电机就是定时器的一种应用。

在STM32F42xxx系列控制器中,有2个高级控制定时器、10个通用定时器和2个基本定时器以及2个看门狗定时器。控制器上所有定时器都是彼此独立,不共享任何资源。高级控制定时器包含通用定时器的所有功能,通用定时器包含基本定时器的所有功能。其特性参见下表:

定时器类型Timer计数器分辨率计数器类型预分频系数DMA请求生成捕获/比较通道互补输入最大接口时钟(MHz)最大定时器时钟(MHz)
高级控制TIM116位递增、递减、递增/递减1~65536490(APB2)180
通用TIM232位递增、递减、递增/递减1~65536445(APB1)90/180
通用TIM316位递增、递减、递增/递减1~65536445(APB1)90/180
通用TIM416位递增、递减、递增/递减1~65536445(APB1)90/180
通用TIM532位递增、递减、递增/递减1~65536445(APB1)90/180
基本TIM616位递增1~65536045(APB1)90/180
基本TIM716位递增1~65536045(APB1)90/180
高级控制TIM816位递增、递减、递增/递减1~65536490(APB2)180
通用TIM916位递增1~65536290(APB1)180
通用TIM1016位递增1~65536190(APB1)180
通用TIM1116位递增1~65536190(APB1)180
通用TIM1216位递增1~65536245(APB1)90/180
通用TIM1316位递增1~65536145(APB1)90/180
通用TIM1416位递增1~65536145(APB1)90/180

这里需要注意,所有定时机器预分频系数都是在1~65536之间取值,且都为整数。最大定时器时钟可以通过RCC_DCKCFGR寄存器进行配置,可配置值为90/180MHz。

一、基本定时器功能框图

基本定时器的功能框图包含了基本定时器最核心的内容,其结构如下图:

在这里插入图片描述

在上图中,绿框中是对定时器的图标解释,黑框带阴影方框中,方框内容一般为寄存器名称,比如上面的自动重载寄存器(TIMx_ARR)和PSC(TIMx_PSC)预分频寄存器,方框加阴影效果主要是为了突出表示该寄存后面还有一个寄存器,只是这个寄存器我们无法进行操作,这里我们称之为影子寄存器,而上面我们可以操作的寄存器我们称之为源寄存器。影子寄存器是在程序运行时真正起到作用的,源寄存器只是给我们提供读写功能,当特定事件发生时,才会把源寄存器的值拷贝给其影子寄存器。多个影子寄存器一起使用可以达到同步更新多个寄存器内容。

下面向下趋势的折线箭头表示为一个事件,向上趋势的这下箭头表示中断和DMA输出,以上图为例,在自动重载寄存器左侧带有字母“U”的是按图标,表示在更新事件生成时就把自动重载寄存器内容拷贝到影子寄存器内,寄存器右边的时间图标、中断和DMA输出图标表示在自动重载寄存器与计数器寄存器值相等时生成事件、中断和DMA输出。

在了解图示图标后,下来我们逐项分析下基本定时器框图:

1、时钟源

既然要实现定时的功能,就必须要给定时器提供时钟源实现计数,基本定时器时钟只能使用内部时钟,而高级和通用定时器可以选择外部时钟源或者其他定时器等待模式。可以通过RCC专用始终配置寄存器(RCC_DCKCFGR)的TIMPRE位设置所有定时器的时钟频率,一般改为设置为默认值0。从而使得上面表中的可选最大定时器时钟为90MHz,即基本定时器的内部时钟CK_INT频率为90MHz。

基本定时器只能使用内部时钟,当TIM6和TIM7控制寄存器1(TIMx_CR1)的GEN位置1时,启动基本定时器,并且预分频器的始终来源位CK_INT。

2、控制器

控制器用于控制实现定时器功能,控制其复位、使能、计数等其基础功能,基本定时器还专门用于DAC转换触发。

3、计数器

基本定时器计数过程中主要针对三界寄存器,分别位计数器寄存器TIMx_CNT、预分频器寄存器TIMx_PSC、自动重载寄存器TIMx_ARR,这三个寄存器均为16位有效位,可以设置的值为0~65535。

预分频寄存器PSC:预分频器PSC有一个输入时钟CK_PSC和一个输出时钟CK_CNT,输入时钟CK_PSC来源于控制器,基本定时器只有内部时钟源,所以CK_PSC实际等于CK_INT,即90MHz。当需要不同的定时频率时,可以通过设置预分频器PSC的值可以得到不同的时钟输出CK_CNT,计算公式如下:
f C K C N T = f C K P S C / ( P S C [ 15 : 0 ] + 1 ) fCKCNT = fCKPSC/(PSC[15:0]+1) fCKCNT=fCKPSC/(PSC[15:0]+1)
在这里插入图片描述

上图中明确表示了将预分频从1改为4时计数器变化过程,在1分频时,CK_PSC和CK_CNT频率相同。向TIMx_PSC寄存器写入新值时,并不会马上更新CK_CNT的输出频率,需要等到更新事件发生时,把TIMx_PSC寄存器值更新到影子寄存器中,才能产生效果。当更新为4分频后,CK_PSC每产生4个脉冲时,CK_CNT才会产生1个脉冲。

当定时器使能时(CNT_EN = 1),计数器COUNTER根据CK_CNT的频率向上计数,意思就是当CK_CNT每产生一个脉冲,TIMx_CNT的值就累加1。当TIMx_CNT的值与TIMx_ARR的值一致时会自动生成事件,并且TIMx_CNT自动清零,然后开始下一轮计数,如此往复。

因此我们只需要设置CK_PSC和TIMx_ARR这两个寄存器的值,就可以控制事件生成的事件,一般的应用程序就是在事件生成的会点函数中运行,在TIMx_CNT递增至TIMx_ARR值相等时,我们称之为定时器上溢。

自动重载寄存器TIMx_ARR用于存放与计数器值比较的数值(设定值),如果两个数值相等就生成事件,将相关事件标志位置位,生成DMA和中断输出。TIMx_ARR有影子寄存器,可通过RIMx_CR1寄存器的ARPE位控制影子寄存器功能,如果ARPE位置1,影子寄存器有效,当且只有事件更新时,才会将TIMx_ARR值赋值给影子寄存器,如果ARPE位为0,修改TIMx_ARR值则可以马上生效。

4、定时器周期计算

通过上面的内容,我们直到定时时间生成时间主要由TIMx_PSC和TIMx_ARR两个寄存器值决定,这个称之为定时器的周期。假如我们需要一个1s周期的定时器,该如何设置这两个寄存器的值呢?

假设我们先设置TIMx_ARR寄存器的值为9999,则表示当TIMx_CNT从0开始计数,当累加到9999个脉冲后,生成事件,合计就是10000次,那么如果此时时钟源周期为100us,就刚好得到了1s的定时周期。

如此我们只需要关注如何设置TIMx_PSC寄存器值,使得CK_CNT输出为100us(1/0.0001 = 10000Hz)周期的时钟即可。预分频的输入时钟CK_PSC为90Mhz,根据上面提供的CK_CNT计算公式得到PSC = 90MHz / 10000Hz - 1 = 9000 - 1 = 8999。

OK,定时器的基本内容学习完了,下来就是了解一下与定时器相关的结构体了。

二、定时器相关结构体

标准库中对定时器外设建立了四个初始化结构体,其中基本定时只用到一个,即TIM_TimeBaseInitTypeDef,该结构体成员用于设置定时器基本工作参数,并由定时器基本初始化配置函数TIM_TimeBaseInit调用。

TIM_TimeBaseInitTypeDef结构体定义在stm32f4xx_tim.h中,TIM_TimeBaseInit函数定义在stm32f4xx_tim.c中,首先我们先看一下TIM_TimeBaseInitTypeDef结构体定义:

typedef struct {
    uint16_t TIM_Prescaler; 			// 预分频器
    uint16_t TIM_CounterMode; 			// 计数模式
    uint32_t TIM_Period; 			    // 定时器周期
    uint16_t TIM_ClockDivision; 		// 时钟分频
    uint8_t TIM_RepetitionCounter; 		// 重复计算器
} TIM_TimeBaseInitTypeDef;

定时器预分频器TIM_Prescaler:时钟源经过该分频器之后输出的才是定时器时钟,该值设置的为TIM_PSC寄存器的值,可设置范围为065535,可实现165536分频。

定时器计数模式TIM_CounterMode:可视之为向上计数、向下计数以及三种中心对其模式,基本定时器只能为向上计数,即TIMx_CNT只能从0开始递增,并且无需初始化。

定时器周期TIM_Period:实际就是设置自定重载寄存器的值,当事件生成时更新到影子寄存器,可设置范围为0~65535。

时钟分频TIM_ClockDivision:设置定时器时钟CK_INT频率与数字滤波器采样时钟频率分频比。基本定时器没有此项功能,不用设置。

重复计数器TIM_RepetitionCounter:该项输入高级控制寄存器的专用寄存器位,利用它可以控制输出PWM的个数,基本寄存器中无需设置。

综上,虽然定时器初始化结构体由5个成员,但是对于基本定时器来说,只需要设置其中两个就可以,其余的暂时不涉及。

OK ,关于定时器的基本知识,这节就先学习这么些,下节使用基本定时器先写个小Dome来验证一下。

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

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

相关文章

[JS设计模式]Mixin Pattern

Mixin是一个对象,我们可以使用它来为另一个对象或类添加可重用的功能,而无需使用继承。我们不能单独使用mixins:它们的唯一目的是在没有继承的情况下向对象或类添加功能。 假设对于我们的应用程序,我们需要创建多个狗。然而,我们…

JavaWeb笔记之JSP

一、引言 现有问题 在之前学习Servlet时,服务端通过Servlet响应客户端页面,有什么不足之处? 开发方式麻烦:继承父类、覆盖方法、配置Web.xml或注解。 代码修改麻烦:重新编译、部署、重启服务。 显示方式麻烦&#x…

Linux创建macvlan 测试bridge、private和vepa模式

Linux创建macvlan,测试bridge、private和vepa模式 最近在看Docker的网络,看到关于macvlan网络的介绍。查阅了相关资料,记录如下。 参考 1.Linux Macvlan 2.图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN 环境 操…

[THUPC 2024 初赛] 二进制 (树状数组单点删除+单点查询)(双堆模拟set)

题解 题目本身不难想 首先注意到所有查询的序列长度都是小于logn级别的 我们可以枚举序列长度len,然后用类似滑动窗口的方法,一次性预处理出每种字串的所有出现位置,也就是开N个set去维护所有的位置。预处理会进行O(logn)轮,每…

Web前端复习

一、随堂练习 1.小题 margin vanish:border和inline-block都可以形成bfc二维数组转置:res[i] [];函数的不同声明定义: 有变量名字的函数,即便后面声明了同样的,以函数表达式为主;定义,运行。再…

智能优化算法应用:基于北方苍鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于北方苍鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于北方苍鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.北方苍鹰算法4.实验参数设定5.算法结果6.…

RocketMQ实践:确保消息不丢失与顺序性的高效策略

一、使用RocketMQ如何保证消息不丢失? 这个是在面试时,关于MQ,面试官最喜欢问的问题。这个问题是所有MQ都需要面对的一个共性问 题。大致的解决思路都是一致的,但是针对不同的MQ产品又有不同的解决方案。分析这个问题要从以 下几…

YOLOv5涨点技巧:一种新颖的多尺度滑窗注意力,助力小目标和遥感影像场景

💡💡💡本文全网独家改进:提出了一种新颖的多尺度滑窗注意力机制,有效的应用在遥感影像和小目标场景,实现涨点。 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合paper !!! �…

数据校园服务管理系统,教育平台可视化界面(教育资源信息化PS文件)

大屏组件可以让UI设计师的工作更加便捷,使其更高效快速的完成设计任务。现分享大数据校园服务管理系统、科技教育平台大数据可视化界面、教育资源信息化大数据分析等Photoshop源文件,文末提供完整资料,供UI设计师们工作使用。 若需其他 大屏…

Leetcod面试经典150题刷题记录 —— 哈希表篇

Leetcod面试经典150题刷题记录 —— 哈希表篇 1. 赎金信2. 同构字符串(按逻辑完整性,分次书写代码)3. 单词规律4. 有效的字母异位词4.1 进阶: 输入字符串包含 unicode 字符 5. 字母异位词分组6. 两数之和7. 快乐数hash集合检测循环隐式链表快慢指针(弗洛…

非线性约束的优化问题_序列二次规划算法代码

1. 理论部分 2. 序列二次规划算法代码及解析 3.完整代码 1.理论部分 a.约束优化问题的极值条件 库恩塔克条件(Kuhn-Tucker conditions,KT条件)是确定某点为极值点的必要条件。如果所讨论的规划是凸规划,那么库恩-塔克条件也是充分条件。 &#xff…

JBoss JMXInvokerServlet 反序列化漏洞 CVE-2015-7501 已亲自复现

JBoss JMXInvokerServlet 反序列化漏洞 CVE-2015-7501 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 漏洞名称 漏洞描述 在Oracle Rapid Planning 12.1/12.2.2中发现了一个被归类为“严重”的漏洞。受到影响的是一些未知的组件处理中间层。升…

SQL进阶理论篇(二十):什么是SQL注入

文章目录 简介SQL注入的原理SQL注入的实例搭建sqli-labs注入环境实例一:猜测where条件判断查询语句的字段数获取当前数据库和用户信息获取MySQL中的所有数据库名称查询wucai数据库中的所有数据表查询heros数据表中的所有字段参考文献 简介 这节是纯兴趣篇了。 web…

RocketMQ事务消息实现分布式事务

文章目录 简介实现原理实现逻辑 简介 RocketMQ事务消息 RocketMQ在4.3.0版中支持分布式事务消息,这里RocketMQ的事务消息是采用2PC(两段式协议) 补偿机制(消息回查)的分布式事务功能。提供消息发送与业务落库的一致性。 RocketMQ事务消息&am…

MicroPython的交互式解释器模式 REPL

MicroPython的交互式解释器模式又名REPL(read-eval-print-loop),就是一种命令输入交互模式,跟Python的REPL是类似的,就是在命令行直接输入Python代码或表达式执行并打印结果。关于MicroPython的REPL跟通常的Python类似…

电子病历编辑器源码,提供电子病历在线制作、管理和使用的一体化电子病历解决方案

概述: 电子病历是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图表、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的医疗记录,是病历的一种记录形式。 医院通过电子病历以电子化方式记录患者就诊的信息,包括&…

【常见的语法糖(详解)】

🟩 说几个常见的语法糖 🟢关于语法糖的典型解析🟢如何解语法糖?🟢糖块一、switch 支持 String 与枚举📙糖块二、泛型📝糖块三、自动装箱与拆箱🍁糖块四、方法变长参数🖥️…

Linux多线程:POSIX信号量,基于信号量的环形队列实现生产者消费者模型

目录 一、POSIX信号量1.1 初始化信号量1.2 销毁信号量1.3 等待信号量1.4 发布信号量1.5 基于环形队列的生产消费模型(用信号量控制生产者和消费者之间的同步互斥关系)1.5.1 makefile1.5.2 RingQueue.hpp1.5.3 Sem.hpp1.5.4 Task.hpp1.5.5 main.cc 二、信号量控制的环形队列原理…

.Net 访问电子邮箱-LumiSoft.Net,好用

序言: 网上找了很多关于.Net如何访问电子邮箱的方法,但是大多数都达不到想要的需求,只有一些 收发邮件。因此 花了很大功夫去看 LumiSoft.Net.dll 的源码,总算做出自己想要的结果了,果然学习诗人进步。 介绍&#xff…

Qt 开源项目

Qt 开源项目 Omniverse View链接技术介绍 QuickQanava链接技术介绍QField链接技术介绍 AtomicDEX链接技术介绍 Status-desktop链接技术介绍 Librum链接技术介绍 A Simple Cross-Platform ReaderQPrompt链接技术介绍 GCompris链接技术介绍 Scrite链接技术介绍 QSkinny链接技术介…