「STM32入门」TIM定时中断

news2024/11/27 4:34:12

定时器的简介

  • 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断,在中断内可以执行中断事件
  • 不仅具备基本的定时中断功能,而且还包含内外时钟源选择,主从触发模式,输入捕获,输出捕获,编码器接口等多种功能。

定时器的分类 

注:不同型号的STM32所拥有的定时器数量是不同的 

基本定时器工作流程

         从上往下看,内部时钟一般都是系统的主频72MHz。PSC指的是预分频系数,比如我希望计数的频率就是72MHz,那么可以给PSC=0,意为一分频或者叫不分频。当希望以36MHz计数时,那么就给PSC=1,二分频,以此类推。

        CNT就是计数器,根据之前的分频系数,每个一段周期,CNT计数器接收到一段高电平脉冲,此时CNT+1,自动重装载寄存器就是目标值,比如该值为80,那么当CNT计数到80后,就会出发中断(UI更新中断/U更新事件),之后CNT值需要手动清0。

        计数器的计数频率:CK_CNT = CK_PSC / (PSC + 1) 

        计数器的溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)

        ARR就是自动重装载寄存器的值

通用定时器的结构 

         与基本定时器最大的区别就在于,通用定时器的时钟源不一定必须是系统内部时钟,也可以是外部时钟。如左上角TIMx_ETR。这有什么用呢?根据引脚定义表我们发现,TIM1_ETR的引脚是PA0,那么我们可以在PA0脚输出一个自定义周期和占空比的方波,这样就可以控制定时器的自增频率了。

定时中断的基本结构 

        我们发现这个框图里出现了两个之前没有介绍的东西,即最右边的中断控制和NVIC,那么他们是什么?首先,当计数器自增到自动重装载值后,中断信号会在状态寄存器里(图中未标出)置一个中断标志位,这个中断控制位会通过中断输出控制,到NVIC申请中断。那中断输出控制的作用是什么呢?因为这个定时器模块有很多地方要申请中断,那么中断输出控制就是用来控制这些中断执行或者不执行的。

NVIC基本结构 

        NVIC的主要作用是统一分配中断优先级和管理中断。NVIC根据每个中断的优先级,分配中断的顺序,之后通过右边的输出口,告诉CPU应该处理哪个中断。可以这样理解,所有的中断都是病人,而CPU是医生,NVIC则是叫号系统,当一堆病人来了,NVIC需要根据他们的紧急程度,安排他们有次序的见医生。


NVIC优先级分组

        为了处理不同形式的优先级,NVIC可以对优先级进行分组,分为抢占优先级和相应优先级。那他们有什么区别呢?

        还是以病人看病为例。

        第一种是,上一个病人在看病,外面排队了很多的病人,当上一个病人看完后,紧急的病人即使是最后来的,也会最先进去看病,这种相当于插队的优先级,就叫响应优先级。

        第二种是,当一个病人很紧急,尽管此时有人在看病且没看完,他也可以直接进医生屋里,让上一个病人靠边站,自己先看病。等他看完了,上一个病人继续,上一个病人结束了,叫号系统再看看有没有新的病人到来。这种优先级就叫抢占优先级。

 

        因此,当我们确定分组方式的时候,就要注意抢占优先级和响应优先级的取值范围,不能超过表里的取值范围。

定时器初始化代码示例 

#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);		//启用TIM3时钟

	TIM_InternalClockConfig(TIM3);								//设置TIM3使用内部时钟
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;			//定义结构体,配置定时器
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;	//设置1分频(不分频)
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//设置计数模式为向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;			//设置最大计数值,达到最大值触发更新事件,因为从0开始计数,所以计数10次是10-1,每10微秒触发一次
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;			//设置时钟预分频,72-1就是每 时钟频率(72Mhz)/72=1000000 个时钟周期计数器加1,每1微秒+1
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;		//重复计数器(高级定时器才有,所以设置0)
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);			//初始化TIM3定时器
	
	TIM_ClearFlag(TIM3, TIM_FLAG_Update);			//清除更新中断标志位
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);		//开启更新中断
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//设置中断优先级分组
	
	NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体,配置中断优先级
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;				//指定中断通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//中断使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//设置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;			//设置响应优先级
	NVIC_Init(&NVIC_InitStructure);								
	
	TIM_Cmd(TIM3, ENABLE);							//开启定时器
}

/*
void TIM3_IRQHandler(void)			//更新中断函数
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)		//获取TIM3定时器的更新中断标志位
	{
		
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);			//清除更新中断标志位
	}
}*/

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

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

相关文章

MySQL调优笔记——慢SQL优化记录

上周,项目出现线上问题,在这家公司做的是一个SAAS平台,总用户量大约10万人; 经过排查,发现是SQL问题,导致数据库响应慢,进而拖垮了整体服务; 通常,查询耗时较长的SQL涉…

我在windows10下,使用CMake gui 编译krita源码,CMake gui报错:LibMyPaint_DIR-NOTFOUND

系列文章目录 文章目录系列文章目录前言一、原因二、解决1.引入库前言 我在windows10下,使用CMake gui 编译krita源码 where is the source code:E:/krita-dev/krita where to build the binaries:E:/krita-dev/krita_camke current generator:MinGW Makefiles 分别…

ios证书申请流程

mac电脑-钥匙串-请求证书-得到CertificateSigningRequest 2.创建Identifiers (1) (2) (3) (4) 如要接推送等 勾:Push Notifications 如要生成universal links 勾:Associated Domains 3.创建Certificates 注意:需…

银行数字化转型导师坚鹏:《银行保险监管统计管理办法》

《银行保险监管统计管理办法》 ——“监”听则明 护航银行高质量发展课程背景: 很多金融机构存在以下问题: 不清楚《银行保险监管统计管理办法》出台背景? 不知道如何理解《银行保险监管统计管理办法》相关规定? 不清楚如何落…

UI设计师都在用这5个网站,赶紧马住~

本期推荐5个UI设计师常用的素材、学习网站,设计师们赶紧收藏~ 1、菜鸟图库 https://www.sucai999.com/searchlist/UIsheji----all-0-0.html?vNTYxMjky 菜鸟图库提供了超多免费设计素材,在这里你可以找到平面、UI、电商等设计类素材,还有大…

4.2和4.3、MAC地址、IP地址、端口

计算机网络等相关知识可以去小林coding进行巩固(点击前往) 4.2和4.3、MAC地址、IP地址、端口1.MAC地址的简介2.IP地址①IP地址简介②IP地址编址方式③A类IP地址④B类IP地址⑤C类IP地址⑥D类IP地址⑧子网掩码3.端口①简介②端口类型1.MAC地址的简介 网卡…

面试如何脱引而出?Redis字符串底层原理你掌握了吗

今天我们讲解字符串的底层原理,属于进阶内容,能回答出来可以秒杀80%的面试者。‍大家都知道Redis有5种基本数据类型,但是你知道每种数据类型对应的底层编码或者数据结构是什么样的吗?这在面试中是一个有区分度的问题,如…

北京E4432B信号发生器

E4432B 安捷伦|Agilent E4432B ESG-D系列 3G高频数字信号源250KHz-3GHz 品  牌: Agilent简单介绍频率范围:E4430B 250K-1GHzE4431B 250K-2GHzE4432B 250K-3GHzE4433B 250K-4GHz 18320918653供单信道和多信道CDMA用的测量卡用于I和Q的20 MHz射频带宽…

搞懂 API :API 测试中常见的问题及处理办法

API测试是Web服务质量保证的重要环节之一。它可以有效地检查API是否符合预期,但在操作中也经常遇到各种问题。本文将介绍API测试中常见的问题以及如何解决它们。 接口错误码不清楚或无法处理 接口开发人员往往会为其API定义错误码来表示特定的错误类型,…

在新电脑上重启自己的django+vue项目遇到的数据库和Nodejs问题

数据库问题 今天在新电脑上重启自己备份的项目文件,迁移数据库的时候一直出现这个问题,运行代码也是这个问题。很奇怪,明明是不出错的代码做的备份怎么会出问题? 找了一下午,终于晚上把问题解决了。 问题 1、首先是这个问题 2、再往上追溯,发现是这里的问题 3、在原…

学习实践-Alpaca-Lora (羊驼-Lora)(部署+运行)

Alpaca-Lora模型GitHub代码地址 1、Alpaca-Lora内容简单介绍 三月中旬,斯坦福发布的 Alpaca (指令跟随语言模型)火了。其被认为是 ChatGPT 轻量级的开源版本,其训练数据集来源于text-davinci-003,并由 Meta 的 LLaMA …

11-FastDFS

一 为什么要使用分布式文件系统 单机时代 初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分…

Verilog | 轮询仲裁

仲裁 当多个源和用户需要共享同一资源时,需要某种仲裁形式,使得所有用户基于一定的规则或算法得到获取或访问共享资源的机会。 仲裁方案 严格优先级轮询 根据优先级的差异,用户访问共享资源的机会也不同。低优先级的用户可能时钟无法得到资…

数据智能服务商奇点云完成近亿元C2轮融资

奇点云集团宣布已于2022年底完成近亿元C2轮融资,余杭国投领投,中银渤海基金跟投。 截至目前,奇点云共获近3亿元C轮融资。C轮领投方包括泰康人寿(旗下泰康资产执行)、余杭国投,跟投方包括字节跳动、德同资本…

九龙证券|巴菲特又出手了!嗅到了什么?日本央行新行长发声

巴菲特或再发日元债,嗅到了什么? 有商场消息称,知情人士泄漏,沃伦巴菲特旗下伯克希尔哈撒韦已开端就出售日元债券向投资者征求意见。这似乎印证了稍早之前的信息,此前,据彭博报导,伯克希尔哈撒韦…

实验手册 - 第5周Pair RDD与分区

目录标题实验1实验2实验3实验4实验5import findspark findspark.init() from pyspark import SparkContextsc SparkContext()实验1 实验1:已知内存数据源 list01 [1, 2, 3, 4, 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54] …

redis数据结构底层原理及相关运用

Redis的数据结构 Redis的数据结构,可以在两个不同的层面来讨论它。 第一个层面,是从使用者的角度。比如:string、list、hash、set、zset(sorted set)五种数据类型 这一层面也是Redis暴露给外部的调用接口,也就是我们平时使用re…

多态-虚函数表

VS的对象内存分析: /d reportSingleClassLayout类名 使用方法:项目 -- 属性 -- C/C -- 命令行--其他选型(D) 添加命令.如图所示: Father类: class Father { public:virtual void Func1() { cout << "Father::Func1" << endl; }virtual void Func2() { c…

【Redis】亿级数据的收集+清洗+统计+展现

文章目录聚合统计(set->共同好友)排序统计(zset->评论排序)二值统计(bitmap->签到打卡)基数统计(hyperloglog->亿级UV统计方案)地理坐标(GEO)布隆过滤器面试题定义产生背景作用底层原理聚合统计(set->共同好友) 统计多个集合元素的聚合结果&#xff0c;就是前面…

DF竞赛平台助力首届“深水云脑杯”全国智慧水务数据创新大赛圆满落幕

首届“深水云脑杯”全国智慧水务数据创新大赛决赛现场 首届“深水云脑杯”全国智慧水务数据创新大赛已圆满落幕&#xff0c;DataFountain大数据竞赛平台&#xff08;简称DF平台&#xff09;作为官方竞赛平台为本次大赛提供办赛支持。该赛事以数字化创新模式为抓手&#xff0c;…