STM32-定时器中断实验

article/2025/10/5 10:33:53

一、通用定时器基本原理

1-1 三种定时器区别

1.三种STM32定时器区别

定时器种类位数计数器模式产生DMA请求捕获/比较通道互补输出特殊应用场景
高级定时器(TIM1,TIM8)16向上,向下,向上/下可以4带死区控制盒紧急刹车,可应用于PWM电机控制
通用定时器(TIM2~TIM5)16向上,向下,向上/下可以4通用。定时计数,PWM输出,输入捕获,输出比较
基本定时器(TIM6,TIM7)16向上,向下,向上/下可以0主要应用于驱动DAC

2.通用定时器功能特点描述

  • 位于低速的APB1总线上
  • 16位向上、向下、向下/上(中心对齐)计数模式,自动重装载计数器(TIMx_CNT)
  • 16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为1~65535之间的任意数值。
  • 4个独立通道(TIMx_CH1~4),这些通道可以用来作为
    ①输入捕获
    ②输出比较
    ③PWM生成(边缘或中间对齐模式)
    ④单脉冲模式输出
  • 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用一个定时器控制另外一个定时器)的同步电路
  • 如下事件发生时可产生中断/DMA(6个独立的IRQ/DMA请求生成器)
    ①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    ③输入捕获
    ④输出比较
    ⑤支持针对定位的增量(正交)编码器和霍尔传感器电路触发输入作为外部时钟或者按周期的电流管理
  • STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。
  • 使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。

3.计数器模式

  • 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
  • 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
  • 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
    在这里插入图片描述

4.通用定时器工作过程
在这里插入图片描述
计数器时钟可以由下列时钟源提供:
①内部时钟(CK_INT)
在这里插入图片描述
默认调用Systemlnit函数情况下:
SYSCLK=72M
AHB时钟=72M
APB1时钟=36M
所以APB1的分频系数=AHB/APB1时钟=2。所以,通用定时器时钟CK_INT=2*36M=72M
②外部时钟模式1:外部输入脚(TIx)
③外部时钟模式2:外部触发输入(ETR)
④内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
5.定时器中断实验相关寄存器

  • 计数器当前值寄存器TIMx_CNT
    在这里插入图片描述

  • 预分频寄存器TIMx_PSC
    在这里插入图片描述

  • 自动重装载寄存器TIMx_ARR
    在这里插入图片描述

  • 控制寄存器TIMx_CR1
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • DMA中断使能寄存器
    在这里插入图片描述
    在这里插入图片描述

6.常用库函数

  • 定时器参数初始化
void TIMx_TimeBaseInit(TIM_TypeDef*TIMx,TIMx_TimeBaseInitTypeDef*TIMx_TimeBaseInitStruct);
typedef struct
{
//预分频系数uint16_t TIM_Prescaler;         /*!< Specifies the prescaler value used to divide the TIM clock.This parameter can be a number between 0x0000 and 0xFFFF *///计数模式uint16_t TIM_CounterMode;       /*!< Specifies the counter mode.This parameter can be a value of @ref TIM_Counter_Mode *///自动装载值uint16_t TIM_Period;            /*!< Specifies the period value to be loaded into the activeAuto-Reload Register at the next update event.This parameter must be a number between 0x0000 and 0xFFFF.  */ uint16_t TIM_ClockDivision;     /*!< Specifies the clock division.This parameter can be a value of @ref TIM_Clock_Division_CKD */uint8_t TIM_RepetitionCounter;  /*!< Specifies the repetition counter value. Each time the RCR downcounterreaches zero, an update event is generated and counting restartsfrom the RCR value (N).This means in PWM mode that (N+1) corresponds to:- the number of PWM periods in edge-aligned mode- the number of half PWM period in center-aligned modeThis parameter must be a number between 0x00 and 0xFF. @note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef;       
  • 定时器使能函数
void TIM_Cmd(TIM_TypeDef*TIMx,FunctionalState NewState);
  • 定时器中断使能函数
void TIM_ITConfig(TIM_TypeDef*TIMx,unit_16 TIM_IT,FunctionalState NewState);
  • 状态标志位获取或清除
TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

7.定时器中断实现步骤

  • 使能定时器时钟
RCC_APB1PeiphClockCmd();
  • 初始化定时器,配置ARR,PSC
TIM_TimeBaseInit();
  • 开启定时器中断
void TIM_ITConfig();
NVIC_Init();
  • 使能定时器
TIM_Cmd();
  • 编写中断服务函数
TIMx_IRQHandler();

二、通用定时器PWM概述

1.STM32 PWM工作过程
在这里插入图片描述

在输出模式下,TIMx_CCRx寄存器的值与CNT的值比较,若CCRx的值大于CNT的值,则产生高电平,反之则为低电平,故通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽。
以通道1为例:
在这里插入图片描述
CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。CCMR1:OC1M[2:0]位:
对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】
在这里插入图片描述

CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。
CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

2.相关寄存器

PWM模式:脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。

在TIMx_CCRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。
void TIM_OC2PreloadConfig(TIM_TypeDefTIMx,uint16_t TIM_OCPreload);
void TIM_ARRPreloadConfig(TIM_TypeDef
TIMx,FunctionalState NewState);
TIMx_CR1寄存器的ARPE位1时,ARR立即生效,APRE=0时,ARR下个比较周期生效。
3.STM32定时器3输出通道引脚

复用功能TIM3_REMAP[1:0]=00(没有重映像)TIM3_REMAP[1:0]=10(部分重映像)TIM3_REMAP[1:0]=11(完全重映像)
TIM3_CH1PA6PB4PC6
TIM3_CH2PA7PB5PC7
TIM3_CH3PB0PB0PC8
TIM3_CH4PB1PB1PC9

(其他定时器的引脚通过查找Datasheet表格可知)
4.PWM输出库函数

//初始化
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
typedef struct
{uint16_t TIM_OCMode; //PWM模式1或者模式2      uint16_t TIM_OutputState; //输出使能uint16_t TIM_OutputNState; uint16_t TIM_Pulse;//比较值,写CCRx        uint16_t TIM_OCPolarity;//比较输出极   uint16_t TIM_OCNPolarity;    uint16_t TIM_OCIdleState;   uint16_t TIM_OCNIdleState;  
} TIM_OCInitTypeDef;
//设置比较值函数
void TIM_SetCompareX(TIM_TypeDef*TIMx,uint16_t Compare2);

5.PWM输出配置步骤

  • 使能定时器3和相关IO口时钟。
    使能定时器3时钟:RCC_APB1PeriphClockCmd();
    使能IO口时钟:RCC_APB2PeriphClockCmd();
  • 初始化IO口为复用功能输出。函数:GPIO_Init();
    GPIO_InitStructure GPIO_Mode=GPIO_Mode_AF_PP;
  • 这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,所以需要开启AFIO时钟。同时设置重映射。
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_PartiaRemap_TIM3,ENABLE);
  • 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
  • 初始化输出比较参数:TIM_OC2Init();
  • 使能预装载寄存器:TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
  • 使能定时器。TIM_Cmd();
  • 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

三、输入捕获实验

3-1 输入捕获工作过程

在这里插入图片描述
一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升浴下降沿)的时候,将当前太时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器 (TIMxCCRx)里面,完成一次捕获
1.设置输入捕获滤波器
在这里插入图片描述
输入捕获 1 滤波器 IC1F[3:0],这个用来设置输入采样频率和数字滤波器长度。其中, f C L K _ I N T f_{CLK\_INT} fCLK_INT是定时器的输入频率(TIMxCLK),一般为 72Mhz,而 f D T S f_{DTS} fDTS则是根据 TIMx_CR1 的 CKD[1:0]的设置来定的,如果 CKD[1:0]设置为 00,那么 f D T S = f C L K _ I N T f_{DTS}=f_{CLK\_INT} fDTS=fCLK_INT。N 值就是滤波长度,举个简单的例子:假设 IC1F[3:0]=0011,并设置 IC1 映射到通道 1 上,且为上升沿触发,那么在捕获到上升沿的时候,再以 f C L K _ I N T f_{CLK\_INT} fCLK_INT的频率,连续采样到 8 次通道 1 的电平,如果都是高电平,则说明却是一个有效的触发,就会触发输入捕获中断(如果开启了的话)。这样可以滤除那些高电平脉宽低于 8 个采样周期的脉冲信号,从而达到滤波的效果。
2.设置输入捕获极性(通道1为例)
在这里插入图片描述
CCER寄存器的位1
在这里插入图片描述
3.设置输入捕获映射通道(通道1为例)
在这里插入图片描述
CCMR1寄存器的位[1:0]
在这里插入图片描述
一般情况下通道1就映射到IC1,通道2映射到IC2。
4.设置输入捕获分频器(通道1为例)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.捕获到有效信号可以开启中断
在这里插入图片描述
在这里插入图片描述

3-2 输入捕获关键库函数

1.输入捕获通道初始化函数

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
typedef struct
{uint16_t TIM_Channel;      //捕获通道1-4      uint16_t TIM_ICPolarity;   //捕获极性uint16_t TIM_ICSelection;  //映射关系uint16_t TIM_ICPrescaler;  //分频系数uint16_t TIM_ICFilter;     //滤波器
} TIM_ICInitTypeDef;

2.通道极性设置独立函数

void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

跟上面初始化函数中设置通道极性有什么区别呢?
3.获取通道捕获值

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);

4.输入捕获配置的一般步骤
①初始化定时器和通道对应IO的时钟
②初始化IO口,模式为输入:GPIO_Init();
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//PA0输入
③初始化定时器ARR,PSC
TIM_TimeBaseInit();
④初始化输入捕获通道
TIM_ICInit();
⑤如果要开启捕获中断
TIM_ITConfig();
NVC_Init();
⑥使能定时器:TIM_Cmd();
⑦编写中断服务函数:TIMx_IRQHandler();

考虑溢出


http://chatgpt.dhexx.cn/article/T85IBdhS.shtml

相关文章

CRC校验

一、CRC原理。 CRC校验的原理非常简单&#xff0c;如下图所示。 其中&#xff0c;生成多项式是利用抽象代数的一些规则推导出来的&#xff0c;而模2加&#xff08;也就是异或&#xff09;&#xff0c;是对应于有限域的除法。 二、CRC算法。 那么在FPGA当中&#xff0c;也有好…

CRC-16

文章目录 A.1 CRC16 算法A.1.1 CRC16 算法参数设置A.1.2 LengthA.1.3 CounterA.1.4 Data IDA.1.5 CRCA.1.6 CRC16 算法示例A.1.7 CRC16 算法推荐(查表法)A.1.8 CRC16 实例(查表法) A.1 CRC16 算法 A.1.1 CRC16 算法参数设置 CRC16 算法中要求了 Counter、Data ID、CRC 等参数…

CCR

不用任何与创建线程、资源互斥有关系的API写多线程程序 这次的例子&#xff0c;是一个很简单的控制台&#xff0c;她将面对瞬间提交的百万的数据&#xff0c;而面不改色&#xff08;CPU、内存非常平稳&#xff09;&#xff0c;队列中始终只保存最新的数据&#xff0c;每次只处理…

CRC16

CRC选择 当数据帧长度在8bits-128bits范围内时&#xff0c;推荐CRC-8(CRC-8能够减少额外比特的开销&#xff0c;且有更好的性能表现) 当数据帧长度在128bits-2048bits范围内时&#xff0c;推荐CRC-12&#xff0c;CRC-16&#xff0c;CRC-CCITT(CRC-12额外比特的开销更小&#x…

stm32cubemx HAL库之定时器

定时器原理简单说明&#xff1a; 如上图所示&#xff0c;定时器存在3个寄存器&#xff0c;分别是&#xff1a; 计数器寄存器&#xff08;CNT&#xff09; 预分频器寄存器&#xff08;PSC&#xff09; 自动重载寄存器&#xff08;ARR&#xff09; 预分频寄存器的输入频率是时钟…

CRC详解

CRC-知识解析 cyclic redundancy check 写在前面的话&#xff1a; 之前在做学校项目的时候用到了CRC 原理&#xff0c;但在网上查找的过程中&#xff0c;发现讲解CRC知识的资源很多&#xff0c;但是对新手比较友好的、讲的十分清楚的又很少&#xff0c;很多博主也不求甚解&am…

CCR(Condition Code Register:条件代码寄存器)的作用

CCR是一个显示执行指令后的结果和处理器的状态的8位寄存器。根据微型计算机的不同&#xff0c;名称也会不同&#xff0c;但是所有的微型计算机都有。在大多数微型计算机的情况下&#xff0c;用户不能直接读写&#xff0c;但有些微型计算机可以读写。您可以通过执行可以测试CCR位…

STM32定时器的预装寄存器及影子寄存器PSC—ARR-CCRx

在谈预装寄存器及影子寄存器的差别前&#xff0c;不妨先对STM32定时器的时基单元做个基本了解。STM32各系列的定时器结构和框架基本是一样的&#xff0c;时基单元也一样。 下面时基单元是以STM32F3系列为参考。 时基单元中的TIMx_PSC、 TIM_ARR两个寄存器加上捕捉比较模块中TIM…

输出比较功能中的pwm以及其他功能的区分

首先我们要知道的是pwm是输出比较的子集 PWM模式下&#xff1a; ARR 决定输出频率 &#xff0c;CCR决定输出占空比 输出比较模式下&#xff1a; ARR 决定输出频率 CCRx 决定每个通道的初始相位。 一般使用输出比较都是想要去输出一个频率可变的pwm信号&#xff0c;那怎么通过…

STM32 PWM输出

STM32 PWM输出 工作过程&#xff1a; 我们假定定时器工作在向上计数PWM 模式&#xff0c;且当 CNT<CCRx 时&#xff0c;输出 0&#xff0c;当 CNT>CCRx 时输出1。那么就可以得到如上的PWM 示意图&#xff1a; 当 CNT 值小于 CCRx 的时候&#xff0c;IO 输出低电平(0)&a…

简单明了的说明STM32的PWM原理以及实现方法

申明以下都是个人理解&#xff0c;仅供参考。如果错误欢迎指教。本文不讲底层&#xff0c;根据实际使用来逆向讲解。 1.什么是pwm&#xff1f; pwm最简单的理解就是“功率”&#xff0c;调节PWM的占空比就是调节功率。 2.如何调节占空比&#xff1f; 图1 根据图1很容易看出…

CCRX寄存器

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);// TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形&#xff0c;条件是未使用预装载寄存器(OCxPE’0’&#xff0c;否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。这里设置为Disable 就是为了…

JavaScript权威指南 第13章 异步JavaScript

JavaScript权威指南 第13章 异步JavaScript 13章 异步JavaScript13.1 使用回调的异步编程13.1.1 定时器13.1.2 事件13.1.3 网络事件13.1.4 Node中的回调与事件 13.2 期约13.2.1 使用期约使用期约处理错误 13.2.2 期约链13.2.2 解决期约13.2.4 再谈期约和错误catch和finally方法…

javascript权威指南(第四版)

Java Script是一种功能强大的基于对象的脚本语言。Java Script程序可以直接嵌入HTML页面。与Web浏览器定义的文档对象模型(DOM)一起使用时&#xff0c;JavaScript可以创建动态HTML(DHTML)内容&#xff0c;允许用户与客户端的Web应用程序交互。 JavaScript语法以流行的程序设计语…

《JavaScript权威指南》学习笔记(一)

跟着《JavaScript权威指南》整理的一些知识点和自己的小拓展。有不足之处请指正。 1、try catch 防止程序异常直接报错退出&#xff0c;而是能对异常进行一些处理&#xff0c;具体处理就在catch中。最好是在最外层函数使用。 2、HTML不区分大小写、XHTML区分大小写、JavaScri…

《javascript权威指南》精读笔记-持续更新

《javascript权威指南》 作用域链 表达式 原始表达式 对象和数组的初始化表达式 函数定义表达式 函数直接量 属性访问表达式 调用表达式 对象创建表达式 运算符 表达式计算 var function for in with debugger use strict 对象 创建对象 属性的查询和设置 作为关联数组的对象 继…

JavaScript权威指南(第6版)

JavaScript权威指南&#xff08;第6版&#xff09; JavaScript权威指南 第6版&#xff08;影印版&#xff09;上册 Beginning iOS Programming, 2014年 Gradle for Android (2016年3月 Finished)

JavaScript权威指南 第11章JavaScript标准库

JavaScript权威指南 第11章JavaScript标准库 第11章 JavaScript标准库11.1 集合与映射11.1.1 Set类11.1.2 Map类11.1.3 WeakMap和WeakSet 11.2 定型数组与二进制数据11.2.1 定型数组的类型11.2.2 创建定型数组11.2.3 使用定型数组11.2.4 定型数组的方法与属性11.2.5 DateView与…

JavaScript 权威指南-学习笔记(一)

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!JavaScript 权威指南-学习笔记 JavaScript是一门高级、动态、解释型变成语言,非常适合面向对象和函数式编…

JavaScript权威指南笔记-masaikk

JavaScript权威指南笔记-马赛柯柯 源代码位于masaikk/interviewAccess - Gitee.com 前五章笔记略 第六章 对象 防止某个对象被第三方库意外修改&#xff0c;建议使用Object.create()方法 ★ \bigstar ★ let o {foo: bar}; library.func(Object.create(o))解释Object.crea…