STM32F103定时器中断详解

目录

目录

目录

前言

一.什么是定时器

1.1 STM32F103定时器概述

1.2基本定时器

1.2通用定时器

1.3高级定时器

1.4 三种定时器区别

基本定时器(Basic Timer)

通用定时器(General-Purpose Timer)

高级定时器(Advanced Timer)

二.时基单元结构(重点)

2.1重点掌握

2.2 PSC预分配器

2.3自动重装载寄存器

2.4 CNT 计数器

2.5计数模式

三.通用定时器中断配置步骤

四.相关代码

4.1 定时器中断初始化

4.2 主函数代码


前言

详细图解介绍:自动重装载寄存器,CNT计算器,PSC预分频器的工作原理。通用定时器通过PSC预分频器把接入的72MHZ的时钟进行分频。再通过CNT以分频后的时钟频率进行计数。定时器TIMx分为三种定时器:(基本定时器、通用定时器、高级定时器)接下来逐个介绍.....

一.什么是定时器

1.1 STM32F103定时器概述

定时器就是计数器:

定时器是一种电子设备或软件模块,用于测量时间间隔或生成周期性信号。它广泛应用于各

种电子系统和计算机程序中,用于控制时间相关的任务,如调度、测量、同步等。


定时器的工作原理:

定时器通常有一个计数器,它可以从预设的初始值开始递增或递减。当计数器达到特定的值时,可以触发一个事件或中断,通知系统进行特定的操作。

TIMx简介

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)。 使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个 毫秒间调整。 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。

定时器TIMx分为三种定时器:(基本定时器、通用定时器、高级定时器)接下来逐个介绍

1.2基本定时器

基本定时器:(TIM6和TIM7)

TIM6和TIM7定时器的主要功能包括:

● 16位自动重装载累加计数器

● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值 分频

● 触发DAC的同步电路

● 在更新事件(计数器溢出)时产生中断/DMA请求

1.2通用定时器

通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括:

● 16位向上、向下、向上/向下自动装载计数器

● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意 数值

● 4个独立通道:

─ 输入捕获

─ 输出比较

─ PWM生成(边缘或中间对齐模式)

─ 单脉冲模式输出

● 使用外部信号控制定时器和定时器互连的同步电路

● 如下事件发生时产生中断/DMA:

─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

─ 输入捕获

─ 输出比较

● 支持针对定位的增量(正交)编码器和霍尔传感器电路

● 触发输入作为外部时钟或者按周期的电流管

1.3高级定时器

TIM1和TIM8定时器的功能包括:

● 16位向上、向下、向上/下自动装载计数器

● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意 数值

● 多达4个独立通道:

─ 输入捕获

─ 输出比较

─ PWM生成(边缘或中间对齐模式)

─ 单脉冲模式输出

● 死区时间可编程的互补输出

● 使用外部信号控制定时器和定时器互联的同步电路

● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器

● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态

● 如下事件发生时产生中断/DMA:

─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)

─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

─ 输入捕获

─ 输出比较

─ 刹车信号输入

● 支持针对定位的增量(正交)编码器和霍尔传感器电路

● 触发输入作为外部时钟或者按周期的电流管理高级控制定时器(TIM1和TIM8)

1.4 三种定时器区别

在微控制器中,定时器通常根据其功能和复杂性被分为不同的类型,包括基本定时器、通用定时器和高级定时器。以下是这三种定时器的比较:

基本定时器(Basic Timer)
  • 功能:基本定时器通常提供最基本的计时功能,如计数器、简单的中断和事件触发。
  • 计数模式:一般只支持向上计数或向下计数。
  • 输入捕获:可能不支持输入捕获功能,即无法捕获外部信号的精确时间。
  • 输出比较:可能只支持简单的输出比较功能,用于生成单一的PWM信号或简单的定时事件。
  • 通道数量:通常只有一个通道或非常有限的通道数量。
  • 中断:可能只提供单一的中断源。
通用定时器(General-Purpose Timer)
  • 功能:通用定时器比基本定时器提供更多的功能,如更复杂的计数模式、多个输入/输出比较和捕获通道。
  • 计数模式:支持多种计数模式,包括向上计数、向下计数、中心对齐模式等。
  • 输入捕获:支持输入捕获功能,可以捕获外部事件的精确时间。
  • 输出比较:支持多个输出比较通道,可以用于生成多个PWM信号或控制多个定时事件。
  • 通道数量:通常有多个通道,可以进行更复杂的时间控制。
  • 中断:提供多个中断源,可以根据不同的事件触发中断。
高级定时器(Advanced Timer)
  • 功能:高级定时器提供最复杂的功能,包括高级计数模式、多个高级输入/输出比较和捕获通道,以及通信接口同步等。
  • 计数模式:支持所有通用定时器的计数模式,可能还包括编码器模式、霍尔传感器接口等。
  • 输入捕获:支持高级输入捕获功能,可以进行时间间隔测量、脉冲计数等。
  • 输出比较:支持多个高级输出比较通道,可以生成复杂的PWM信号或控制多个高级定时事件。
  • 通信接口同步:可以与其他定时器或通信接口同步,实现复杂的同步操作。
  • 死区控制:在PWM信号生成中,支持死区时间设置,用于提高电机控制的稳定性。
  • 中断:提供丰富的中断源,可以根据多种事件触发中断。

总结来说,基本定时器通常功能较为简单,适用于不需要复杂控制的应用。通用定时器和高级定时器则提供了更多的功能和灵活性,适用于更复杂的定时和控制任务。

二.时基单元结构(重点)

2.1重点掌握

时基单元结构:接下来会逐个介绍:PSC(预分频器) 、自动重装载寄存器、CNT(计数器)

2.2 PSC预分配器

这里大多数人都有个疑惑,为什么STM32通用定时器的时钟来源是72MHZ,是因为在APB1中已经倍频率了。

系统结构如下:

时钟树:

通用定时器结构

因为APB1总线的时钟频率是32MHZ(在系统结构图那里),但是给定时器的频率是乘以2倍的(在时钟树图哪里),所以预分频器是给72MHZ进行分频,

2.3自动重装载寄存器

自动重装载寄存器(Auto-Reload Register)是一种特殊的寄存器,通常在微处理器或计算机系统中用于存储某些需要周期性重置或更新的值。这种寄存器的主要用途包括:

  1. 定时器控制:在定时器或计数器中,自动重装载寄存器可以存储定时器的初始值,当计数器达到零时,自动重装载寄存器的值会被重新加载到计数器中,从而实现周期性的操作。

  2. 中断管理:在中断系统中,自动重装载寄存器可以用于设置中断服务程序的执行周期,确保中断服务能够定期执行。

  3. 性能监控:在性能监控中,自动重装载寄存器可以用于设置性能计数器的阈值,当计数器达到这个阈值时,自动重装载寄存器的值会被重新加载,从而实现性能计数器的周期性监控。

  4. 电源管理:在电源管理系统中,自动重装载寄存器可以用于设置电源状态的切换周期,以实现节能和性能的平衡。

  5. DMA(直接内存访问)控制:在DMA传输中,自动重装载寄存器可以用于设置DMA传输的块大小,当DMA传输完成一个块后,自动重装载寄存器的值会被重新加载,以继续下一个块的传输。

自动重装载寄存器通过减少软件干预,提高了系统的效率和可靠性,使得某些周期性任务可以更加自动化和精确地执行。

2.4 CNT 计数器

CNT计数器,通常指的是在计算机硬件或软件中使用的计数器,它用于跟踪和控制事件或操作的次数。CNT计数器的用途非常广泛,包括但不限于以下几个方面:

  1. 定时和计数:在硬件定时器中,CNT计数器可以用于生成精确的时间间隔或周期性事件。

  2. 性能监控:在软件或硬件的性能分析中,CNT计数器可以用来统计特定操作或事件的发生次数,以评估系统性能。

  3. 数据采样:在数据采集系统中,CNT计数器可以用于控制采样频率,确保数据以均匀的时间间隔被采集。

  4. 事件调度:在操作系统或任务调度中,CNT计数器可以用来跟踪任务执行的次数或时间,以实现任务的周期性调度。

  5. 循环控制:在编程中,CNT计数器常用于控制循环结构的迭代次数,确保循环按照预定的次数执行。

  6. 资源管理:在资源有限的系统中,CNT计数器可以用于跟踪资源的使用情况,以避免资源耗尽。

  7. 状态机控制:在状态机设计中,CNT计数器可以用于跟踪状态转换的次数或时间,以控制状态机的流程。

  8. 通信协议:在通信系统中,CNT计数器可以用于实现协议规定的重传机制,确保数据的可靠传输。

  9. 硬件测试:在硬件测试中,CNT计数器可以用于模拟特定的操作次数,以测试硬件的耐久性和稳定性。

  10. 用户界面:在用户界面设计中,CNT计数器可以用于跟踪用户操作的次数,以实现动态的用户反馈或交互效果。

2.5计数模式

上升沿触发的:向上计数、和向下计数、中心对齐计数

三.通用定时器中断配置步骤

1. 使能定时器时钟。

       RCC_APB1PeriphClockCmd();// TIM4 是挂载在 APB1 之下

2.初始化定时器,配置ARR自动重装载寄存器,PSC预分频器)。

      TIM_TimeBaseInit();

3.开启定时器中断,TIM4 的更新中断  void TIM_ITConfig();

   配置NVIC,在主函数设置优先级。

     NVIC_Init();

4.使能定时器。        

      TIM_Cmd();

5.编写中断服务函数。

      TIMx_IRQHandler();//向上(下)溢出,事件发生中断

四.相关代码

4.1 定时器中断初始化

#include "time.h"
#include "led.h"/*******************************************************************************
* 函 数 名         : TIM4_Init
* 函数功能		   : TIM4初始化函数
* 输    入         : per:重装载值psc:分频系数
* 输    出         : 无
*******************************************************************************/ 
void TIM4_Init(u16 per,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断TIM_ClearITPendingBit(TIM4,TIM_IT_Update);NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	TIM_Cmd(TIM4,ENABLE); //使能定时器	
}/*******************************************************************************
* 函 数 名         : TIM4_IRQHandler
* 函数功能		   : TIM4中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TIM4_IRQHandler(void)
{if(TIM_GetITStatus(TIM4,TIM_IT_Update)){LED0=!LED0;}TIM_ClearITPendingBit(TIM4,TIM_IT_Update);	
}

4.2 主函数代码

在定时器初始化函数TIM4_Init(2000,36000-1)中,需要对预分频器,计数器,自动重装载值寄存器进行初始化赋值。

72MHZ=7200KHZ

7200KHZ/36000=2KHZ=0.5ms

0.5ms*2000=1s

在定时器中断函数中每1s进行LED的亮灭

int main()
{delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组LED_Init();TIM4_Init(2000,36000-1);  //定时1000mswhile(1){}
}
void TIM4_IRQHandler(void)
{if(TIM_GetITStatus(TIM4,TIM_IT_Update)){LED0=!LED0;}TIM_ClearITPendingBit(TIM4,TIM_IT_Update);	
}

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

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

相关文章

ubuntu2204配置anacondacuda4090nvidia驱动

背景 某个机房的几台机器前段时间通过dnat暴露至公网后被入侵挖矿,为避免一些安全隐患将这几台机器执行重装系统操作; 这里主要记录配置nvidia驱动及cuda&anaconda。 步骤 大概分为几个步骤 禁用nouveau配置grub显示菜单install nvidia-driveri…

基于Python+Django,开发的一个在线教育系统

一、项目简介 使用Python的web框架Django进行开发的一个在线教育系统! 二、所需要的环境与组件 Python3.6 Django1.11.7 Pymysql Mysql pure_pagination DjangoUeditor captcha xadmin crispy_forms 三、安装 1. 下载项目后进入项目目录cd Online-educ…

配置RIPv2的认证

目录 一、配置IP地址、默认网关、启用端口 1. 路由器R1 2. 路由器R2 3. 路由器R3 4. Server1 5. Server2 二、搭建RIPv2网络 1. R1配置RIPv2 2. R2配置RIPv2 3. Server1 ping Server2 4. Server2 ping Server1 三、模拟网络攻击,为R3配置RIPv2 四、在R…

Linux:Linux权限

目录 1. Linux权限的概念 2. Linux权限管理 2.1 文件访问者的分类 2.2 文件类型和访问权限 2.2.1 文件类型 2.2.2 基本权限 2.3 文件权限值的表示方法 2.4 文件访问权限的相关设置方法 2.4.1 chmod 2.4.2 chown 2.4.3 chgrp 2.4.4 umask 3. file指令 4. Linux目…

base SAS programming学习笔记13(Array)

1.Array array-name{dimension} <elements> array-name&#xff1a;向量名称 dimension&#xff1a;向量长度&#xff0c;默认为1&#xff1b; elements:列出变量名&#xff0c;变量名要么全是数值变量或者全是字符变量 array-name和variable不能相同&#xff1b;也不能和…

C++面试题之判断一个变量是不是指针

对于变量其实对应的就是内存&#xff0c;而内存并没有表明一定是什么数据类型&#xff0c;所以判断变量是否是一个指针其实是一个参数类型匹配问题&#xff0c;在C中支持函数的重载&#xff0c;那么不同的函数因为参数的不同从而匹配不同函数调用过程。 编译器在进行函数匹配调…

JAVA周总结(集合) 0721day

一.Collection集合 集合:可以存放多种类型数据的容器。 集合和数组的区别 数组的长度是固定的,集合的长度根据存储的数据发生改变。 数组只能存同一种类型的数组,而集合可以存多种类型。 1.2 单列集合常用类的继承体系 java.util.List: 添加的元素是有序、可重复 ; Lis…

PostgreSQL简介和安装

一、Postgresql简介&#xff1a; 1、PostgreSql是功能强大的&#xff0c;开源的关系型数据库&#xff0c;底层基于C语言实现&#xff1b; 2、开源&#xff1a;允许对PostgreSql进行封装&#xff0c;用于商业收费&#xff1b; 3、版本迭代速度快&#xff0c;正式版本已经到15.R…

【轻松拿捏】java中为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?

java中为什么要使用克隆&#xff1f;如何实现对象克隆&#xff1f;深拷贝和浅拷贝区别是什么&#xff1f; 一、如何在Java中实现对象克隆 1.1 浅拷贝 1.2 深拷贝 1.3 区别总结 二、面试回答技巧 1. 定义克隆及其用途 2. 解释浅拷贝和深拷贝 3. 具体实现浅拷贝和深拷贝 …

【Python】使用库 -- 详解

库就是别人已经写好了的代码&#xff0c;可以让我们直接拿来用。 一个编程语言能不能流行起来&#xff0c;一方面取决于语法是否简单方便容易学习&#xff0c;一方面取决于生态是否完备。所谓的 “生态” 指的就是语言是否有足够丰富的库&#xff0c;来应对各种各样的场景。在…

LeetCode 188题: 买卖股票的最佳时机IV优化(原创)

之前完成了LeetCode 188题&#xff1a; 买卖股票的最佳时机IV&#xff08;原创&#xff09;-CSDN博客&#xff0c;虽然完成代码编写&#xff0c;并提交成功&#xff0c;但运行效率还未达到最优的1ms&#xff0c;见下图&#xff1a; 仔细检查代码&#xff0c;感觉还是有可优化的…

OpenCV中的GrabCut图像分割算法的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 GrabCut 算法是一种用于图像分割的技术&#xff0c;由 Carsten Rother、Vladimir Kolmogorov 和 Andrew Blake 在 2004 年 SIGGRAPH 会议的论文《…

AI多模态识别ALM大模型分享:Qwen-Audio

ALM (Large Audio Language Model) 1&#xff09;Qwen-Audio 声音音频对话 参考&#xff1a; https://qwen-audio.github.io/Qwen-Audio/ https://huggingface.co/Qwen/Qwen-Audio-Chat “Qwen-Audio 接受多种音频&#xff08;人类语音、自然声音、音乐和歌曲&#xff09;以及…

基于面向对象和递归的拦截器设计模式

1 定义 拦截器模式&#xff08;Interceptor Pattern&#xff09;&#xff0c;是指提供一种通用的扩展机制&#xff0c;可以在业务操作前后提供一些切面的&#xff08;Cross-Cutting&#xff09;的操作。这些切面操作通常是和业务无关的&#xff0c;比如日志记录、性能统计、安…

day2 单机并发缓存

文章目录 1 sync.Mutex2 支持并发读写3 主体结构 Group3.1 回调 Getter3.2 Group 的定义3.3 Group 的 Get 方法 4 测试 本文代码地址&#xff1a; https://gitee.com/lymgoforIT/gee-cache/tree/master/day2-single-node 本文是7天用Go从零实现分布式缓存GeeCache的第二篇。 …

【LeetCode】80.删除有序数组中的重复项II

1. 题目 2. 分析 3. 代码 class Solution:def removeDuplicates(self, nums: List[int]) -> int:if len(nums) < 3:return len(nums)i 0j 1k 2while(k < len(nums)):if (nums[i] nums[j]):while(k < len(nums) and nums[j] nums[k] ):k1if (k < len(nums…

校验deb、rpm、apt、yum安装文件完整性测试

简介&#xff1a;deb包在Linux操作系统中类似于windows中的软件包&#xff08;msi&#xff09;&#xff0c;几乎不需要什么复杂的编译即可通过鼠标点击安装使用。此外,deb广泛应用于越狱后iOS软件及MeeGo&#xff08;含Maemo软件&#xff09;中。deb 格式是 Debian 系统(包含 D…

StringBuilder和StringBuffer

目录 &#xff08;一&#xff09;为什么要引入StringBuilder和StringBuffer &#xff08;二&#xff09;StringBuilder和StringBuffer &#xff08;1&#xff09;底层数组长度 (2)StringBuilder与StringBuffer扩容机制 &#xff08;3&#xff09;StringBuilder和StringBuf…

并发编程面试题1

并发编程 1、线程池中提交一个任务的流程是怎样的&#xff1f; 1、提交任务&#xff1a;首先&#xff0c;一个任务被提交到线程池。这个任务通常是一个实现了Runnable或Callable接口的对象&#xff1b; 2、检测线程池状态&#xff1a;线程池会首先检测其运行状态。如果线程池…

javafx使用发现的问题

1.按钮的方法 如果在fxml按钮的方法报错&#xff0c;并且你已在lei中添加了它的按钮及其按钮方法&#xff0c;那么可能是FXML和控制器类未正确关联&#xff1a; 确保你的FXML文件通过 fx:controller 属性正确指定了与之关联的控制器类。例如&#xff0c;fx:controller"c…