TIM基本定时器

news2024/11/15 12:30:48

TIM基本定时器

文章目录

  • TIM基本定时器
    • 1.定时器的分类
    • 2.定时器运行流程
    • 3.基本定时器的配置流程
    • 4.中断配置

1.定时器的分类

以STM32F1系列为例,它的定时器可以根据其特性和功能被分为三大类:

  1. 基本定时器

    • 包括:TIM6和TIM7。
    • 特点:基本定时器是16位,只能向上计数的定时器,通常用于简单的定时操作。它们没有外部触发输入和输出比较功能,因此不能直接生成PWM信号或用于输入捕获等复杂应用。基本定时器的时钟只能来源于内部时钟。
  2. 通用定时器

    • 包括:TIM2至TIM5。
    • 特点:通用定时器也是16位,但相比基本定时器,它们更加灵活,具有更多的功能,如可以向下计数、有多个外部触发输入和输出比较通道,能够用于生成PWM信号、输入捕获、输出比较等。这些定时器的时钟源既可以是内部时钟,也可以是外部时钟。
  3. 高级定时器

    • 包括:TIM1和TIM8。
    • 特点:高级定时器是最复杂且功能最丰富的定时器类型,在STM32F1系列中,它们能够提供更多的功能,如更多的输出比较通道(可达7路PWM输出),支持更复杂的定时器链路、死区生成、刹车输入等高级控制功能,非常适合电机控制、电源管理等需要精确控制的场合。这些定时器同样具有向上/向下计数能力,并且可以使用内部或外部时钟源。

    如下图:

    在这里插入图片描述

2.定时器运行流程

基本定时器的框图如下:
在这里插入图片描述

主要特性:

16位递增计数器(计数值:0~65535)

16位预分频器(分频系数:1~65536)

定时器主要分为时钟源,控制单元和计数部分,基本定时器的时钟源只能来自芯片内部时钟。其中在计数部分,预分频器和自动重装载寄存器具有影子寄存器,定时器的运行流程为:

  1. 初始化配置

    • 时钟使能:首先,需要通过系统时钟控制器(RCC)使能给定基本定时器的时钟。
    • 配置预分频器(PSC):设置预分频寄存器的值,以降低定时器时钟频率到所需范围。例如,若APB1总线时钟为72MHz,可以通过设置PSC来分频得到较低的计数频率。
    • 设置自动重载值(ARR):在自动重载寄存器中设置一个值,当计数器达到这个值时将产生更新事件并重置计数器。这决定了定时器的周期。
  2. 启动定时器

    • 控制寄存器设置:通过设置定时器控制寄存器(如TIMx_CR1),启用定时器的计数器(使能计数EN位)。
  3. 计数过程

    • 一旦定时器被启动,其计数器(CNT)从0开始递增,每次递增都是基于预分频后的时钟频率。
    • 当CNT的值与ARR中的预设值相匹配时,会发生一个更新事件(Update Event)。
    • 更新事件会自动将CNT寄存器复位为0,并且如果配置了中断或DMA请求,这些请求也会在此时被触发。
  4. 影子寄存器的作用

    • 我们通常配置的是“可见”的寄存器(预加载寄存器)ARR和PSC,这些配置在适当的时机(更新事件)才会反映到实际控制定时器运行的“不可见”寄存器,即影子寄存器中。影子寄存器确保了在计数过程中参数的平滑过渡,避免了在计数周期内因参数突变而引起的不连续或错误行为。
  5. 中断处理(可选):

    • 如果在控制寄存器中设置了中断允许位,那么在更新事件发生时,CPU会接收到中断请求,并执行对应的中断服务程序(ISR)。在ISR中,用户可以执行特定的任务,如数据处理、状态改变等。
  6. 关闭定时器(可选):

    • 如果不再需要定时器,可以通过清除控制寄存器中的使能位来停止定时器的计数。

3.基本定时器的配置流程

	TIM_TimeBaseInitTypeDef TIM_BaseInitStu;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 | RCC_APB1Periph_TIM7, ENABLE);	
	
	TIM_BaseInitStu.TIM_Prescaler =7200 - 1;    //预分频值  TIM_Period x TIM_Prescaler / 时钟频率
	TIM_BaseInitStu.TIM_Period = 10000 - 1;    //自动装载值
	TIM_TimeBaseInit(TIM6,&TIM_BaseInitStu);
	TIM_TimeBaseInit(TIM7,&TIM_BaseInitStu);
	TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
	TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);
	TIM_Cmd(TIM6, DISABLE);
	TIM_Cmd(TIM7, DISABLE);
  1. TIM_TimeBaseInitTypeDef TIM_BaseInitStu;
    定义了一个定时器基础初始化结构体变量,用于存储定时器初始化的相关配置。

  2. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 | RCC_APB1Periph_TIM7, ENABLE);
    通过RCC(Reset and Clock Control)外设时钟控制函数,使能了APB1总线下TIM6和TIM7定时器的时钟。这是配置任何外设之前必须的步骤。

3-4.

  • TIM_BaseInitStu.TIM_Prescaler = 7200 - 1;
    设置TIM6和TIM7的预分频器值为7199(因为预分频值是从0开始计数,所以7200-1=7199)。这表示定时器时钟将被分频7199次,具体分频效果取决于TIM6和TIM7所连接的时钟频率。
  • TIM_BaseInitStu.TIM_Period = 10000 - 1;
    配置自动重载寄存器(ARR)的值为9999,意味着当计数器从0计数到9999时,将产生一个更新事件并重置计数器。

5-6.

  • TIM_TimeBaseInit(TIM6, &TIM_BaseInitStu);
    使用之前配置的结构体TIM_BaseInitStu来初始化TIM6定时器的基础计时功能。
  • TIM_TimeBaseInit(TIM7, &TIM_BaseInitStu);
    同样地,初始化TIM7定时器。

7-8.

  • TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
    允许TIM6在更新事件发生时产生中断(即计数器达到ARR值时)。
  • TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);
    同样为TIM7配置更新中断。

9-10.

  • TIM_Cmd(TIM6, DISABLE);
    禁止TIM6定时器开始计时。
  • TIM_Cmd(TIM7, DISABLE);
    同样禁止TIM7定时器开始计时。

我们把定时器设置自动重装载寄存器 ARR 的值为 10000,设置时钟预分频器为 7199, 则驱动计数器的时钟:CK_CNT = CK_INT / (7199+1)=0.01M, 则计数器计数一次的时间等于:1/CK_CNT=100us,当计数器计数到 ARR 的值 10000时, 产生一次中断,则中断一次的时间为:1/CK_CNT*ARR=1s。

4.中断配置

	NVIC_InitTypeDef NVIC_InitStu;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitStu.NVIC_IRQChannel = TIM6_IRQn | TIM7_IRQn;
	NVIC_InitStu.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStu.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStu.NVIC_IRQChannelSubPriority = 1;
	
	NVIC_Init(&NVIC_InitStu);
  1. NVIC_InitTypeDef NVIC_InitStu;
    定义了一个NVIC初始化结构体类型的变量NVIC_InitStu,用于存放中断相关的配置信息。

  2. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    调用此函数来配置中断优先级分组。这里选择了优先级分组1,STM32的中断优先级分为5个级别(0-4,0为最高),分组1意味着有1位用于抢占优先级,3位用于子优先级。这意味着最多可以配置8种不同的抢占优先级和8种子优先级组合。

3-7. 配置NVIC_InitStu结构体的成员:

  • NVIC_InitStu.NVIC_IRQChannel = TIM6_IRQn | TIM7_IRQn;
    设置需要配置的中断通道,这里同时配置了TIM6、TIM7的中断。
  • NVIC_InitStu.NVIC_IRQChannelCmd = ENABLE;
    启用上述指定的中断通道。
  • NVIC_InitStu.NVIC_IRQChannelPreemptionPriority = 1;
    设置抢占优先级为1(在分组1的情况下,范围是0-7,1表示较高中断优先级)。
  • NVIC_InitStu.NVIC_IRQChannelSubPriority = 1;
    设置子优先级也为1(在本分组中,范围同样是0-7,数值越小优先级越高)。
  1. NVIC_Init(&NVIC_InitStu);
    最后,使用NVIC_Init函数,根据NVIC_InitStu结构体中设定的参数来初始化指定的中断通道,完成中断优先级的配置。

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

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

相关文章

数据结构全部知识-----第一 关于数据结构的介绍

数据结构是计算机存储、组织数据的方式。它是计算机科学中的一个重要概念,主要目的是使数据的存储和访问更高效、更方便。常见的数据结构包括: 线性结构: 1. **数组(Array)** :一种基础的数据结构&#xf…

【BUG】已解决:AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘

AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘ 目录 AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘ 【常见模块错误】 【错误原因】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&…

C++中的多路转接技术之epoll

epoll 是干什么的?举个简单的例子 epoll的相关系统调用**epoll_create**和epoll_create1区别 epoll_ctl参数解释 **epoll_wait**参数说明返回值 epoll的使用 **epoll**工作原理epoll的优点(和 **select** 的缺点对应)epoll工作方式**水平触发**Level Triggered 工作…

针对汽车应用而设计的SCT4026D、SCT4062K、SCT3105K、SCT3080A、SCT3060A全新系列碳化硅 (SiC) MOSFET

全新系列碳化硅 (SiC) MOSFET SCT4026DWAHRTL SCT4062KWAHRTL SCT3105KRC15 SCT3080ALHRC11 SCT3080ARC15 SCT3060ARC15 ——明佳达 AEC-Q101 SiC功率MOSFETs是汽车和开关电源的理想选择。SiC功率MOSFETs可以提高开关频率,减少所需的电容、电抗器和其他元件的体积…

react开发-配置开发时候@指向SRC目录

这里写目录标题 配置开发时候指向SRC目录VScode编辑器给出提示总体1.配置react的 2.配置Vscode的1.配置react的2,配置VSCode的提示支持 配置开发时候指向SRC目录VScode编辑器给出提示 总体1.配置react的 2.配置Vscode的 1.配置react的 1. 我么需要下载一个webpack的插件 这样…

【闲谈】我的创作纪念日(CrowdStrike、无人驾驶)

感谢地心引力 ,有幸再次遇见你: 还记得 2020 年 07 月 22 日吗?你撰写了第 1 篇技术博客:《遗传算法实例解析》在这平凡的一天,你赋予了它不平凡的意义。也许是立志成为一名专业 IT 作者、也许是记录一段刚实践的经验。…

【iOS】——探究isKindOfClass和isMemberOfClass底层实现

isKindOfClass 判断该对象是否为传入的类或其子类的实例 // 类方法实现,用于检查一个类是否属于另一个类或其父类链上的任何类。(BOOL)isKindOfClass:(Class)cls {// 从当前类开始,tcls将沿着元类的继承链向上遍历。for (Class tcls self->ISA(); …

MySQL:库表操作

MySQL:库表操作 库操作查看创建字符编码集 删除修改备份 表操作创建查看删除修改 库操作 查看 查看存在哪些数据库: show databases;示例: 查看自己当前处于哪一个数据库: select database();示例: 此处由于我不处于任…

Unity UGUI 之 Input Field

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.Input Field是什么? 给玩家提供输入的输入框 2.重要参数 中英文对照着看…

JSONNode树形解析或流式解析

哈喽,大家好,我是木头左! 什么是JSONNode? JSONNode是一个用于处理JSON数据的数据结构,它提供了一种简单、灵活、高效的方式来操作JSON数据。JSONNode可以看作是一个树形结构,其中每个节点都可以包含一个值…

MongoDB自学笔记(四)

一、前文回顾 上一篇文章中我们学习了MongoDB中的更新方法&#xff0c;也学了一部分操作符。今天我们将学习最后一个操作“删除”。 二、删除 原始数据如下&#xff1a; 1、deleteOne 语法&#xff1a;db.collection.deleteOne(< query >,< options >) 具体参…

OpenCV 像素操作—证件照换底色详细原理 C++纯手写实现

文章目录 总体步骤1.RGB转HSV2.找出要换的底色3.取反&#xff0c;黑白颠倒4.将原图像的非背景部分复制到新背景上 完整代码1.C纯手写版2.官方API版本 总体步骤 1.RGB转HSV 为什么一定要转为HSV 颜色空间&#xff1f; 将图像从BGR颜色空间转换为HSV颜色空间是因为HSV颜色空间更…

vscode 文件颜色变绿色

解决&#xff1a;关闭git功能 在设置中搜索Git:Enabled&#xff0c;取消Decorations: Enabled的勾选

内网渗透隧道构建,使用github项目联动msf绕uac,使用简单的spp来进行操作icmp隧道

在我们需要木马上线的时候&#xff0c;发现上线不了&#xff0c;我们一般就想到建立隧道&#xff0c;来解决问题&#xff0c;或者是说我们直接还一种连接的操作来进行上线。比如说我们正向连接上不了&#xff0c;我们可以还成反向连接的操作。或者我们使用隧道直接硬刚waf来进行…

计算机毕业设计-程序论文文档-基于SSM的驾校管理系统

本系统开发采用技术为JSP、Bootstrap、Ajax、SSM、Java、Tomcat、Maven 此文章为本人亲自指导加编写&#xff0c;禁止任何人抄袭以及各类盈利性传播&#xff0c; 相关的代码部署论文ppt代码讲解答辩指导文件都有可私要 项目源码&#xff0c;请关注❥点赞收藏并私信博主&#x…

代码随想录 day 18 二叉树

第六章 二叉树part06 详细布置 530.二叉搜索树的最小绝对差 需要领悟一下二叉树遍历上双指针操作&#xff0c;优先掌握递归 题目链接/文章讲解&#xff1a;https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%B…

鸿蒙OpenHarmony Native API【HiLog】

HiLog Overview Description: HiLog模块实现日志打印功能。 开发者可以通过使用这些接口实现日志相关功能&#xff0c;输出日志时可以指定日志类型、所属业务领域、日志TAG标识、日志级别等。 syscap SystemCapability.HiviewDFX.HiLog Since: 8 Summary Files File …

甄选范文“论企业集成平台的理解与应用”,软考高级论文,系统架构设计师论文

论文真题 企业集成平台(Enterprise Imtcgation Plaform,EIP)是支特企业信息集成的像环境,其主要功能是为企业中的数据、系统和应用等多种对象的协同行提供各种公共服务及运行时的支撑环境。企业集成平台能够根据业务模型的变化快速地进行信息系统的配置和调整,保证不同系统…

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号3

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 堆内存申请(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…