TIM(Timer)简介

news2024/12/25 9:17:48

TIM(Timer)定时器介绍

  1. 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
  2. 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
  3. 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
  4. 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

定时器分类

在这里插入图片描述

基本定时器

在这里插入图片描述
时基单元为下图的预分频器、计数器、自动重装寄存器。

内部时钟CK-INT

预分频器之前连接的是基准计数时钟的输入(由于基本定时器只能选择内部时钟、输入端可以直接认为内部时钟CK-INT、所以通向时基单元的计数频率就是72M)

预分频器

预分频系数实际分频系数=预分频器的值+1(预分频值0:就是不分频72M 、数值1: 就是2分频就是36M)预分频是16位的也就是0X0000~0XFFFF所以最大值是65535,也就是65536分频(预分频器的值+1)

计数器

作用是对输入的预分频后的计数时钟(CK_CNT)进行计数,计数时钟(CK_CNT)每来一个上升沿,计数器值就+1
计数器也是16位的也就是0X0000~0XFFFF所以最大值是65535,如果再加的话计数器就会回到0,当运行到目标值时就会产生UI更新中断U更新事件

自动重装寄存器

作用就是存储我们写入的计数目标,也是16位的也就是0X0000~0XFFFF所以最大值是65535,到达目标值后就会产生UI更新中断U更新事件,中断就会通向NIVC,配置好NVIC的定时器通道,定时器的事件信息就能得到CPU的相应了
在这里插入图片描述

主从模式触发DAC

用途时使用DAC输出一段波形,那就需要每隔一段时间触发一次DAC,让他输出下一个电压点。中断容易打断主程序运行,所以提供主模式下可以把定时器的U更新事件 映射到触发TRGO(Trigger Out)的位置,TRGO直接接到DAC的触发引脚上。实现了硬件的自动化

通用定时器

在这里插入图片描述
基本定时器只有向上计时的功能。通用定时器和高级定时器有三种计时功能:向上(0到目标值)、向下(目标值到0)、中央对其计时(0到目标值再从目标值到0,完成一次计时就触发一次事件)

基准定时器输入

对于基本定时器只能选择内部时钟也是72MHZ,通用和高级不仅可以使用内部时钟,还可以使用外部时钟TIMx-ETR

外部时钟模式2——外部时钟TIMx-ETR- ETR极性选择…-输入滤波-EFRF-基准时钟选择

外部时钟模式1——TRGI主要是触发输入来使用的

  1. ETR

  2. ITR0
    定时器的级联
    在这里插入图片描述
    在这里插入图片描述

  3. TI1FP1、TI2FP2

编码器接口
可以读取正交编码器的输出波形

输出比较电路

在这里插入图片描述
可以用于输出PWM波形,驱动电机。对应四个通道CH1、CH2、CH3、CH4

输入捕获电路

在这里插入图片描述
可以用于测量输入方波的频率和占空比。
输入捕获电路也对应四个通道CH1、CH2、CH3、CH4。

捕获/比较寄存器

在这里插入图片描述
捕获/比较寄存器,是输入和输出比较电路公用的

高级定时器

在这里插入图片描述

与通用定时器不相同的只有下面部分不一样,

  1. 申请中断的地方增加了一个重复的计数器

    可以实现每隔几个计数周期,才发发生一个更新事件和更新中断事件,原来是每个计数周期都会发生更新

  2. 高级定时器对输出比较模块的升级(前三路互补波形,第四路CH4没什么变化)

    DTG(Dead Time Generate)是死区生成电路(避免开关切换的瞬间,由于器件的不理想造成短暂的直通现象,让桥臂的上下管全都关断。防止直通现象),输出引脚由原来的一个,变为了两互补的输出,可以输出一对互补的PWM波。这些电路可以驱动三相无刷电机比较常用。比如四轴飞行器、电动车后轮、电钻等
    在这里插入图片描述
    图左边是产生短暂的直通现象,图右边是桥臂的上下管全都关断

  3. 刹车输入
    在这里插入图片描述
    给电机驱动提高安全保障。

实例

内部时钟

1、开启RCC时钟,定时器的基准时钟和整个外设的工作时钟就会同时打开了。

2、选择时基单元的时钟源,对于定时中断就选择内部时钟源。TIM_InternalClockConfig(TIM2);

3、时基单元初始化。
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元

4、配置输出中断控制,允许更新中断输出到NVIC。
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除定时器更新标志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开启TIM2的更新中断

5、配置NVIC,在NVIC中打开定时器中断通道,并分配一个优先级。
NVIC_Init(&NVIC_InitStructure);
6、允许控制,使能定时器。
TIM_Cmd(TIM2, ENABLE); //使能TIM2,定时器开始运行

#include "stm32f10x.h"                  // Device header
 
void Timer_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);           //打开定时器
	
	/*配置时钟源*/
	TIM_InternalClockConfig(TIM2);//选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	//时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	
	//计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
	//计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
	//预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	//重复计数器,高级定时器才会用到
	
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元	
	
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
		/*中断输出配置*/
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);						
	//清除定时器更新标志位
	//TIM_TimeBaseInit函数末尾,手动产生了更新事件
	//若不清除此标志位,则开启中断后,会立刻进入一次中断
	//如果不介意此问题,则不清除此标志位也可	
	
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);					
	//开启TIM2的更新中断
	
	/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				
	//配置NVIC为分组2
	//即抢占优先级范围:0~3,响应优先级范围:0~3
	//此分组配置在整个工程中仅需调用一次
	//若有多个中断,可以把此代码放在main函数内,while循环之前
	//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						
	//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				
	//选择配置NVIC的TIM2线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				
	//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	
	//指定NVIC线路的抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			
	//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);								
	//将结构体变量交给NVIC_Init,配置NVIC外设
	
	/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);				                           //启动定时器
}
 
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)               //获取中断标志位
	{
		
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                //清除标志位
	}
}
 

外部时钟

0、开启GPIO口,配置GPIO。

1、开启RCC时钟,定时器的基准时钟和整个外设的工作时钟就会同时打开了。

2、选择时基单元的时钟源,对于定时中断就选择内部时钟源。

3、配置时基单元。

4、配置输出中断控制,允许更新中断输出到NVIC。

5、配置NVIC,在NVIC中打开定时器中断通道,并分配一个优先级。

6、允许控制,使能定时器。

(这里是用对射红外线做的,挡光10次,计数器加一)

void Timer_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			
	//开启TIM2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			
	//开启GPIOA的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//将PA0引脚初始化为上拉输入
	
	/*外部时钟配置*/
	TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);
	//选择外部时钟模式2,时钟从TIM_ETR引脚输入
	//注意TIM2的ETR引脚固定为PA0,无法随意更改
	//最后一个滤波器参数加到最大0x0F,可滤除时钟信号抖动
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				
	//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		
	//时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	
	//计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;					
	//计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;				
	//预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;			
	//重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	//将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元	
	
	/*中断输出配置*/
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);						
	//清除定时器更新标志位
	//TIM_TimeBaseInit函数末尾,手动产生了更新事件
	//若不清除此标志位,则开启中断后,会立刻进入一次中断
	//如果不介意此问题,则不清除此标志位也可
																
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);			
	//开启TIM2的更新中断
	
	/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				
	//配置NVIC为分组2
	//即抢占优先级范围:0~3,响应优先级范围:0~3
	//此分组配置在整个工程中仅需调用一次
	//若有多个中断,可以把此代码放在main函数内,while循环之前
	//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						
	//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				
	//选择配置NVIC的TIM2线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				
	//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	
	//指定NVIC线路的抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			
	//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);//将结构体变量交给NVIC_Init,配置NVIC外设
	
	/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行
}

/**
  * 函    数:返回定时器CNT的值
  * 参    数:无
  * 返 回 值:定时器CNT的值,范围:0~65535
  */
uint16_t Timer_GetCounter(void)
{
	return TIM_GetCounter(TIM2);	//返回定时器TIM2的CNT
}

/* 定时器中断函数,可以复制到使用它的地方
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}
*/

函数说明

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

基于香橙派 Ai Pro的ROS Qt人机交互软件部署指南

一,前言 最近收到了CSDN的邀请,对香橙派新出的Ai Pro进行测评: 说来也巧,其实香橙派本人对其映像挺深刻的,在2017年左右,本人刚上大学,当时是在淘宝购买树莓派,发现有个叫香橙派的国产板子,性能跟树莓派差不多吧,但是…

不是从APP store下载的APP在mac上一直提示有损坏,打不开怎么办?

1.点击设置 2.安全与隐私 3.通用看看允许从以下位置下载的APP是否有任何来源 4.如果没有,mac桌面点击🔍输入终端或Terminal 命令行输入下述代码: sudo spctl --master-disable 5.回车,输入mac开机密码。注意:此时密…

探索循环逻辑:for逻辑分支与容器遍历的深度剖析

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:for逻辑与循环体的奥秘 二、for逻辑与循环体的结合使用 1. 函数与循环…

Spring-Cloud-OpenFeign源码解析-04-调用流程分析

在Spring-Cloud-OpenFeign源码解析-03-FeignClientFactoryBean分析到,通过Autowired或者Resource注入FeignClient实例的时候,实际上返回的是JDK动态代理对象,具体的实现逻辑在InvocationHandler的invoke方法中 回看ReflectiveFeign.newInsta…

Tower for Mac——高效版本控制的得力助手

在编程的世界里,版本控制是每一个开发者都离不开的工具。Tower for Mac,就是这样一款高效、易用的版本控制软件。 Tower for Mac拥有直观易用的界面,无论是提交代码、创建分支还是解决冲突,都能让开发者轻松应对。它支持多仓库管…

postman教程-5-发送put请求

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了postman发送post请求的方法,本小节我们讲解一下postman发送put请求的方法。 HTTP PUT 请求是一种用于传输数据的网络协议方法,它在客户端和服务器之间的通信中扮演着重…

EMQX 的初始IP改为自己的实际IP

分类 EMQX Dashboard(控制台): Dashboard提供了一个Web界面,用于管理和监控EMQX的运行状态。您可以通过配置dashboard.listeners.http.bind来设置Dashboard的监听地址和端口。例如,如果您想要Dashboard在所有网络接口上监听&#…

软件技术架构全面详解

软件架构全面详解 软件架构 这个与建筑设计架构类似,建筑设计架构师负责设计建筑物的整体结构、布局和功能分配。 而软件架构师,负责设计软件系统的整体组织结构、模块划分、和功能分配。 两者都需要考虑到业务功能、性能、可扩展性、安全性、以及用户体验等方面。 软件架…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt + uniapp 新闻资讯 的设计与实现

一.项目介绍 本系统分为 后端 和 小程序端 后端:点击登录按钮 设置个人中心、 管理员账号数据维护、 基础数据维护、 短视频信息维护(包括查看短视频留言、短视频收藏)、 论坛维护(增删改查帖子信息,包括查…

Windows远程桌面是什么?

Windows远程桌面是一种远程桌面协议,允许用户通过网络连接到远程Windows计算机,并在本地操作远程计算机。它为用户提供了访问远程计算机的便利性,可以在不同地区的电脑或设备之间进行信息远程通信。 天联解决方案 在远程桌面技术中&#xff…

phpmyadmin漏洞汇总

phpmyadmin是一个非常常用的框架,所以学习它的常见漏洞是非常必要的。 参考大佬的文章进行自学:最全phpmyadmin漏洞汇总_phpmyadmin弱口令-CSDN博客 目录 phpmyadmin简介 查看phpmyadmin版本 漏洞及利用 万能密码登入 影响版本 漏洞POC 远程代码…

Ubuntu 20.04 上安装和配置 VNC

先决条件 请确保以具有 sudo 权限的用户身份登录。建议使用具有 sudo 权限的普通用户进行处理,而不是直接使用 root 用户。创建用户并加入 sudoers 可自行百度。 安装桌面环境 大多数服务器没有安装桌面环境,因此我们首先要安装轻量级桌面环境。 Ubu…

PS系统教学01

在前面几节内容基本介绍了PS的基本作用,简单的对PS中的某些基础功能进行介绍应用。 接下来我们进行系统的分享。 本次分享内容 基础的视图操作 接下来我们是对于PS工作区域的每个图标工具进行详细的分享 抓手工具缩放工具 这个图标是将工具栏由一列变成两列 一…

OpenLayers6入门,OpenLayers实现在地图上拖拽编辑修改绘制图形

专栏目录: OpenLayers6入门教程汇总目录 前言 在前面一章中,我们已经学会了如何绘制基础的三种图形线段、圆形和多边形:《OpenLayers6入门,OpenLayers图形绘制功能,OpenLayers实现在地图上绘制线段、圆形和多边形》,那么本章将在此基础上实现图形的拖拽编辑功能,方便我…

stm32cubeMX简单使用(轻松配置时钟和中断等)ST图形代码生成器

大大加快代码编写速度的图形编译工具 需要的准备材料 需要注意的几点操作 1,管理固件库和软件,方便对应不同系列的硬件 2,新建工程 3,整体流程 这个软件的本质是用来生成代码,方便前期初始化操作 4,对引…

2024.05.27学习记录

1、面经复习: 实际工作经验章节 2、代码随想录刷题:动态规划剩下部分和单调栈 3、rosebush 组件库完成Input 和 AutoComplete部分内容

开机必启截图标注类神器Snipaste,基本使用及技巧

目录 一、软件简介二、基本安装三、自启设置四、快捷操作五、使用技巧 一、软件简介 Snipaste 是一款简单高效的截图工具。只需按下 F1 即可截图(可进行自主设置),再按 F3 即可将截图置顶显示(贴图功能)。你还可以将剪…

Pytorch深度学习实践笔记9(b站刘二大人)

🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:pytorch深度学习 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

【408】2009-20

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

基于51单片机的电压表-数码管显示

一.硬件方案 本设计基于STC89C52单片机的一种电压测量电路,该电路采用ADC0832A/D转换芯片,实现数字电压表的硬件电路与软件设计。该系统的数字电压表电路简单, 可以测量0~9V的电压值,并在四位LED数码管上显示电压值。 二.设计功能 (1&…