基本定时器---内/外部时钟中断

一、定时器的概念

        定时器(TIM),可以对输入的时钟信号进行计数,并在计数值达到设定值的时候触发中断。

        STM32的定时器系统有一个最为重要的结构是时基单元,它由一个16位计数器,预分频器,和自动重装寄存器构成。在时钟信号来临的时候,首先会由预分频器对该信号进行分流,使得一部分或者全部的信号进入计时器开始计数,当计数值达到自动重装寄存器的值时,由硬件触发中断,将中断信号递交给NVIC最后进入CPU运行中断服务函数。在72MHz的时钟下最大可以实现59.65s的定时。当然如果你觉得这个时间不够长,还可以利用STM32的定时器级联功能,将一个定时器的中断信号作为第二个定时器的时钟输入,这样定时时长可以呈现几何状的爆炸增长。

        STM32的定时器不仅仅具有基本的定时中断功能,还包含了:内外时钟源选择、输入捕获(用于测量输入信号的脉冲长度)、输出比较(用于产生输出波形,如PWM(脉冲宽度调制))、编码器接口(适用于读取正交编码器的位置信息)、主从触发模式等多种功能。根据复杂度和应用场景,上述功能被划分到了高级定时器、通用定时器、基本定时器三个类型的定时器中。

二、简单看看定时器电路图

1.基本定时器

        这里面有一个影子寄存器(方框下面有阴影的就是影子寄存器),它有助于确保定时器的准确性和同步性。

  • 预装载寄存器是程序员可以直接访问和修改的寄存器。
  • 影子寄存器是定时器内部实际使用的寄存器,它的值由预装载寄存器在特定条件下更新而来
  • 影子寄存器的存在,使得我们在修改一个定时器的自动重装寄存器的值来控制定时时长的时候,不会立即生效,而是在当前时钟中断已经完成,到了更新事件/更新中断的节点才会被修改,这样就保证了定时器的准确性和同步性。

2.通用定时器 

        在这里,我们只需要着重关心上面框出来的部分即可,下面的其他功能之后会有所涉猎

3.高级定时器

高级定时器是在通用定时器的基础上增加了框图部分,大家可以先看看电路图,也是在之后会讲到

三、定时器的基本结构

        上面我们已经看到了各种定时器的基本电路图,已经了解了其原理。下图是对上述的总结框图,我们只需要按照这个图就可以配置好。

  1. 打开定时器的时钟
    • 使用RCC_APB1PeriphClockCmd或RCC_APB2PeriphClockCmd函数打开相应的定时器资源。
  2. 配置时钟源
    • 将时钟资源设为内部时钟源或外部时钟源。
  3. 配置时基单元
    • 设置计数器模式(向上、向下或中央对齐)。
    • 配置预分频器(PSC)和自动重装载寄存器(ARR)。
  4. 配置中断
    • 清除定时器更新标志位。
    • 使能定时器的更新中断。
  5. 配置NVIC中断分组
    • 设置中断的优先级和使能中断线路。
  6. 使能定时器
    • 启动定时器开始运行。

四、示例代码

void TIM2_Init()
{
    //打开RCC的定时器2时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    
    //设置TIM2为内部时钟
    TIM_InternalClockConfig(TIM2);
    
    //配置时基单元
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
    TIM_TimeBaseInitStructure.TIM_Period = (10000 - 1); // 自动重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler = (7200 - 1); // 预分频值
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    //清除定时器标志位:因为配置好上面的定时器后,就被视作产生一次更新中断,
    //然后标志位就被置1了,如果不清除定时器就是从1开始定时
     TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    
    //打开TIM2的中断输出控制
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    
    //配置NVIC的分组和优先级
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
    
    //打开计数器,使能TIM2
    TIM_Cmd(TIM2, ENABLE);
}



//中断服务函数
void TIM2_IRQHandler(void)
{
    //检测是否由TIM2产生的中断
    if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    {
        //清除TIM2产生中断的标志位
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        
        //处理过程
        number++;
    }
}

五、外部时钟代码

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,定时器开始运行
}

外部时钟和内部时钟唯一的区别就是时钟的来源不同,不过配置都大同小异,只需要注意外部时钟是连接到哪一个GPIO口上的,然后把这个GPIO口配置成为上拉/下拉/浮空输入模式,并且把时钟设置为外部时钟即可

下图为时钟源的选择的不同

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt文件目录操作

文件目录操作相关类 Qt 为文件和目录操作提供了一些类,利用这些类可以方便地实现一些操作。Qt 提供的与文件和目录操作相关的类包括以下几个: QCoreApplication:用于提取应用程序路径,程序名等文件信息;QFile&#x…

.NET 通过模块和驱动收集本地EDR的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

css中的box-sizing,记录

border-box:最终高度为height,默认包含padding border等属性 content-box:box-sizing默认值,最终大小为heightpaddingborder 等

【AI绘画】Alpha-VLLM 的 Lumina-Next:新一代图像生成器

简介 Lumina-Next-T2I 是在 Lumina-T2I 成功基础上发展起来的尖端图像生成模型。它采用了带有 2B 参数模型的 Next-DiT 和 Gemma-2B 文本编码器,推理速度更快,生成样式更丰富,并增强了多语言支持。 模型架构 Lumina-Next-T2I 的生成模型建…

Redis学习 ——缓存

文章目录 一、Redis缓存的介绍二、Redis缓存问题2.1 缓存穿透2.2 缓存击穿2.3 缓存雪崩2.4 双写一致性2.5 缓存持久化RDBAOF 三、缓存数据管理3.1 数据过期策略3.2 数据淘汰策略 一、Redis缓存的介绍 我们在日常的代码编写中比较少使用到Redis,但是如果涉及到了比较…

【阅读记录-章节2】Build a Large Language Model (From Scratch)

目录 2.Working with text data2.1 Understanding word embeddings2.2 Tokenizing text通过一个简单的实验来理解文本的词元化概念关键概念 2.3 Converting tokens into token IDs实现分词器类(Tokenizer Class)应用分词器测试文本的编码与解码通过分词器…

etcd部署(基于v3.5.15)

etcd部署 单节点部署下载etcd,解压etcd二进制包,并进入解压后目录创建数据目录移动可执行文件到/usr/local/bin/目录测试版本配置systemd管理启动etcd,设置开机启动验证 集群部署(3节点)环境准备准备3台服务器配置3台服务器hosts配置3台服务器…

HTML5实现趣味飞船捡金币小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 游戏中界面1.2 飞船边界框效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143799554 HTML5实现趣味飞船捡金币小游戏(附源码)&…

ASP.NET Core Webapi 返回数据的三种方式

ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择&#xff1a; Specific type IActionResult ActionResult<T> 1. 返回指定类型&#xff08;Specific type&#xff09; 最简单的API会返回原生的或者复杂的数据类型&#xff08;比如&#xff0c;string 或者…

汽车资讯新动力:Spring Boot技术驱动

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Go语言跨平台桌面应用开发新纪元:LCL、CEF与Webview全解析

开篇寄语 在Go语言的广阔生态中&#xff0c;桌面应用开发一直是一个备受关注的领域。今天&#xff0c;我将为大家介绍三款基于Go语言的跨平台桌面应用开发框架——LCL、CEF与Webview&#xff0c;它们分别拥有独特的魅力和广泛的应用场景。通过这三款框架&#xff0c;你将能够轻…

如何确保爬取的数据准确性和完整性?

在数据驱动的业务环境中&#xff0c;爬虫程序的准确性和完整性至关重要。本文将探讨如何使用Java编写爬虫程序&#xff0c;并确保其在爬取数据时的准确性和完整性。 1. 精确的HTML解析 确保数据准确性的第一步是精确地解析HTML。Jsoup是Java中常用的HTML解析库&#xff0c;它提…

【linux】如何扩展磁盘容量(VMware虚拟机)-转载

如何扩展磁盘容量(VMware虚拟机) 一、前置准备工作 扩展虚拟机磁盘前&#xff0c;需要先把虚拟机关机才能进行扩展磁盘操作 1.选择虚拟机设置&#xff0c;如下图所示 2.输入你想扩展的磁盘容量&#xff0c;以本次实操为例&#xff0c;我这里输入的30G&#xff08;具体按照实…

esp32学习:windows下idf离线安装(最简单)

很多朋友学习esp32时发现&#xff0c;安装idf很麻烦&#xff0c;需要很多依赖&#xff0c;那有没有简单的方法呢&#xff0c;答案是肯定的. 乐鑫Windows 平台工具链的标准设置 - ESP32-S3 - — ESP-IDF 编程指南 release-v5.0 文档编程指南里提供了windows下离线安装包 dl.espr…

tensorflow案例6--基于VGG16的猫狗识别(准确率99.8%+),以及tqdm、train_on_batch的简介

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 本次还是学习API和如何搭建神经网络为主&#xff0c;这一次用VGG16去对猫狗分类&#xff0c;效果还是很好的&#xff0c;达到了99.8% 文章目录 1、tqdm…

Amazon Web Services (AWS)

一、Amazon Web Services (AWS)介绍 1、简介 2、产品 AWS 提供了各种云计算服务&#xff0c;包括 DynamoDB、S3、EC2、Lambda 等等。 登录aws后点击所有服务也可以看到amazon的所有服务&#xff1a; 3、免费试用产品 除了免费的Amazon Step Functions、Amazon Lambda&#…

Quartus+Nios II for eclipse问题合集

由于对于FPGANIOS II 的工作需要&#xff0c;对工作过程中遇到的问题进行记录&#xff0c;持续更新。 1、BSP directory does not exist: . Stop.Nios II使用过程中遇到的一些问题2_error executing nios2-bsp-generate-files --bsp-di-CSDN博客https://blog.csdn.net/qq_39485…

Java项目:校园宿舍管理系统(优质版)(Springboot3+Maven+Mybatis Plus+Vue3+ Element Plus+Mysql)

项目介绍 : Springboot3MavenMybatis PlusVue3 Element PlusMysql 开发的前后端分离的校园宿舍管理系统 项目演示: https://www.bilibili.com/video/BV16UmoYWEVR/ 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#x…

RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)

文章目录 RabbitMQ教程&#xff1a;发布/订阅模式&#xff08;Publish/Subscribe&#xff09;&#xff08;三&#xff09;一、引言二、简介三、准备工作3.1 说明3.2 生成项目 四、实战4.1 交换机&#xff08;Exchanges&#xff09;4.2 临时队列&#xff08;Temporary Queues&am…

SpringBoot(6)-Shiro

目录 一、是什么 二、准备工作 2.1 环境搭建 2.2 自定义Realm配置类 2.3 自定义shiro配置类 三、实践 3.1 请求拦截 3.2 用户认证 3.3 用户授权 3.4 shiro和thymeleaf整合 一、是什么 是java的一个安全框架 核心三大对象&#xff1a; 1、Subject【用户】 2、Secur…