STM32 HAL库 STM32CubeMX -- TIM(定时器中断)

这篇具有很好参考价值的文章主要介绍了STM32 HAL库 STM32CubeMX -- TIM(定时器中断)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、定时器分类

STM32F1 系列中,除了一些特殊的型号,大部分F1有8 个定时器,分为基本定时器,通用定时器和高级定时器

基本定时器TIM6 和TIM7 是一个16 位的只能向上计数的定时器,只能定时,没有外部IO。

通用定时器TIM2/3/4/5 是一个16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部IO。

高级定时器TIM1/8 是一个16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有8 个外部IO。

定时器 计数器 计数器类型 预分频系数 产生DMA 捕获/比较通道 互补通道
高级定时器 TIM1 16位 向上/向下 1 ~ 65535 可以 4
高级定时器 TIM8 16位 向上/向下 1 ~ 65535 可以 4
通用定时器 TIM2 16位 向上/向下 1 ~ 65535 可以 4 没有
通用定时器 TIM3 16位 向上/向下 1 ~ 65535 可以 4 没有
通用定时器 TIM4 16位 向上/向下 1 ~ 65535 可以 4 没有
通用定时器 TIM5 16位 向上/向下 1 ~ 65535 可以 4 没有
基本定时器 TIM6 16位 向上 1 ~ 65535 可以 0 没有
基本定时器 TIM7 16位 向上 1 ~ 65535 可以 0 没有

二、基本定时器功能框图

stm32cubemx tim,stm32,单片机,嵌入式硬件

时钟源

定时器时钟TIMxCLK,即内部时钟CK_INT,经APB1 预分频器后分频提供,如果APB1 预分频系数等于1,则频率不变,否则频率乘以2,库函数中APB1 预分频的系数是2,即PCLK1=36M,所以定时器时钟TIMxCLK=36*2=72M

计数器时钟

定时器时钟经过PSC 预分频器之后,即计数器时钟CK_CNT,用来驱动计数器计数。PSC 是一个16 位的预分频器,可以对定时器时钟TIMxCLK 进行1~65536 之间的任何一个数进行分频。具体计算方式为:CK_CNT=TIMxCLK/(PSC+1)

计数器

计数器CNT 是一个16 位的计数器,只能往上计数,最大计数值为65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。

自动重装载寄存器

自动重装载寄存器ARR 是一个16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。

定时时间的计算

定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在CK_CNT 的驱动下,计一个数的时间则是CK_CNT 的倒数,等于:1/(TIMxCLK/(PSC+1)),产生一次中断的时间则等于:(1/CK_CNT) * (ARR+1)。如果在中断服务程序里面设置一个变量time,用来记录中
断的次数,那么就可以计算出我们需要的定时时间等于:(1/CK_CNT) * (ARR+1) *(PSC+1)

Time = (ARR+1) * (PSC+1) / Tclk

ARR为自动装载值
PSC:预分频系数
Tclk:定时器的APB时钟,通常等于系统时钟

例如:
Tclk为72M、PSC(预分频系数)为7199、ARR(自动重装载值)为9999

Time = (ARR+1) * (PSC+1) / Tclk = (9999+1) * (7199+1) / 72 000 000 = 1s

定时器的计数模式

向上计数

计数器从0向上计数(递增)到自动装载值,然后再次回到0开始计数,并产生一个计数溢出事件

stm32cubemx tim,stm32,单片机,嵌入式硬件

向下计数

计数器从自动装载值向下计数(递减)到0,然后再次回到自动装载值开始计数,并产生一个计数器向下溢出事件

stm32cubemx tim,stm32,单片机,嵌入式硬件

中央对齐模式(向上/向下计数)

计数器从0开始计数到自动装载值-1,并产生一个计数器溢出事件,然后再向下计数到0+1,并产生一个计数溢出事件,然后再向上计数。

stm32cubemx tim,stm32,单片机,嵌入式硬件

三、STM32Cube MX配置

基本的STM32Cube MX的配置可以参考这篇博客:STM32 CubeMx教程 – 基础知识及配置使用教程

配置RCC 时钟,配置为外部晶振模式

stm32cubemx tim,stm32,单片机,嵌入式硬件

配置SYS Debug 设置为 Serial Wire

stm32cubemx tim,stm32,单片机,嵌入式硬件
配置一个GPIO,用于LED

stm32cubemx tim,stm32,单片机,嵌入式硬件

配置一个串口,用来输出调试信息

stm32cubemx tim,stm32,单片机,嵌入式硬件

配置 TIM2 ,TIM2是通用定时器,配置时钟源为内部时钟 其余设置目前用不到,暂时不配置

stm32cubemx tim,stm32,单片机,嵌入式硬件

Slave Mode:从模式选择。
对应从模式控制寄存器(TIMx_SMCR)中的SMS[2:0]位。所有TIMx定时器在内部相连,用于定时器同步或链接。当一个定时器处于主模式时,可以对另一个处于从模式的定时器的计数器进行复位、启动、停止或提供时钟等操作。

000 - 关闭从模式,预分频器直接由内部时钟驱动。
001/010/011-编码器模式。
100 - 复位模式,选中的触发输入(TRGI)的上升沿重新初始化计数器,并产生一个更新寄存器的信号。
101 - 门控模式,当触发输入(TRGI)为高时,计数器的时钟开启;一旦触发输入变为低,则计数器停止(但不复位)。计数器的启动和停止受触发输入信号控制。
110 - 触发模式,计数器在触发输入(TRGI)的上升沿启动(但不复位),只有计数器的启动是受控的。
111 - 外部时钟模式1,选中的触发输入(TRGI)的上升沿驱动计数器。

Trigger Source:从模式触发选择。
对应从模式控制寄存器(TIMx_SMCR)中的TS[2:0]位。用于选择同步计数器的触发输入。

000 - 内部触发0(ITR0),TIM1
001 - 内部触发1(ITR1),TIM2
010 - 内部触发2(ITR2),TIM3
011 - 内部触发3(ITR3),TIM4
100 - TI1的边沿检测器(TI1F_ED)
101 - 滤波后的定时器输入1(TI1FP1)
110 - 滤波后的定时器输入2(TI2FP2)
111 - 外部触发输入(ETRF)

Clock Source:外部时钟源。
对应从模式控制寄存器(TIMx_SMCR)中的ECE位。Internal Clock 内部时钟 、ETR2 外部触发输入(ETR)(仅适用TIM2,3,4)

Channel1 ~ Channel4:输出比较 1 ~ 4 模式设置。
对应捕获/比较模式寄存器1和2中的)OCxM[2:0]位。包含输入捕获、输出比较、PWM生成、强制输出等。

Combined Channels:组合通道模式。
编码器模式下需要进行配置。

Use ETR as Clearing Source:输出比较清零使能。
对应捕获/比较模式寄存器1和2中的OCxCE位。一旦检测到ETR电平为高,清除OCxREF。

XOR activation:输入异或模式。 只在输入时有效。

One Pulse Mode:单脉冲模式。 对应控制寄存器1中的OPM位

配置TIM2 里面的详细参数,预分频系数设置为7199,重装载值设置为9999,使能自动重装载,从属模式基本不用,所以下面的参数默认就行;
定时时间: Time = (ARR+1) * (PSC+1) / Tclk = (重装载值+1)(预分频系数+1)/ 时钟频率 = (7199+1) (9999+1)/ 72 000 000 = 1s
设定定时器的定时时间为1s

stm32cubemx tim,stm32,单片机,嵌入式硬件

Prescaler:预分频系数;
对应预分频器(TIMx_PSC)的PSC[15:0]位。设置预分频器的值。

Counter Mode:计数模式;
对应控制寄存器1(TIMx_CR1)中的DIR位。up 向上、down 向下、Center Aligned mode 中心对齐模式

Counter Period:重装载值;
对应自动重装载寄存器(TIMx_ARR)中的ARR[15:0]。存储将要传送至实际的自动重装载寄存器的数值。

Internal Clock Division:内部时钟分频;
对应控制寄存器1(TIMx_CR1)中的CKD[1:0]位。时钟分频因子。定义在定时器时钟频率与数字滤波器使用的采样频率之间的分频比例。

auto-reload preload:自动重装载;
对应控制寄存器1(TIMx_CR1)中的ARPE位。自动重装载预装载允许位。定义在TIMx_ARR和实际的自动重装载寄存器之间是否设置缓冲器。

Master/Slave Mode: 对应从模式控制寄存器(TIMx_SMCR)中的MSM位。

Trigger Event Selection: 对应控制寄存器2(TIMx_CR2)中的MMS[2:0]位。用于选择在主模式下送到从定时器的同步信息(TRGO)。

配置中断

stm32cubemx tim,stm32,单片机,嵌入式硬件

配置时钟树

stm32cubemx tim,stm32,单片机,嵌入式硬件

四、代码讲解

如果使用串口发送信息,需要串口重定向,STM32 HAL库 使用printf函数 Use MicroLIB配置,在usart.c 里面进行串口重定向

HAL_TIM_Base_Start_IT(&htim2);		//开启中断

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); 	//中断回调函数

代码示例:

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start_IT(&htim2);	//开启定时器中断,在main函数里面初始化
  /* USER CODE END 2 */
/* USER CODE BEGIN 4 */

/* 在main.c 或者在 tim.c 里面都可以写 */
/* 定时器中断回调函数,达到定时器所设定的时间以后,进入中断 */
/* 在退出中断的时候就会调用中断回调函数 */
/* 一般在这里写要执行的操作 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == htim2.Instance)
    {
			HAL_GPIO_TogglePin(GPIOA ,GPIO_PIN_8); //翻转电平,LED翻转
      printf("Enter TIM interrupt \r\n");		 //输出执行信息
    }
}

/* USER CODE END 4 */

附录

本文中所使用的程序:STM32 HAL库 定时器外部中断文章来源地址https://www.toymoban.com/news/detail-574633.html

到了这里,关于STM32 HAL库 STM32CubeMX -- TIM(定时器中断)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 HAL库 通用定时器介绍及相关应用例程 定时器中断 输出PWM (点亮LED呼吸灯、输出PWM、输入捕获) CubeMX

    (部分图引自于ATK) 前情提要(基本定时器) 点此进入 通用定时器类别 通用定时器和基本定时器相比大致的工作方式是相似的,不过通用定时器比基本定时器多了一些很好用的功能,比如: 外部输入捕获 输出比较 输出PWM 时钟源 CubeMX为我们提供了配置时钟的非常方便的工

    2024年04月15日
    浏览(48)
  • STM32CubeMX教程5 TIM 定时器概述及基本定时器

    开发板(STM32F407G-DISC1) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 逻辑分析仪nanoDLA 使用STM32CubeMX软件配置STM32F407开发板 使用基本定时器TIM6实现每500ms控制绿灯状态变化一次,基本定时器TIM7实现每1s控制红灯状态变化一次 STM32F407拥有2个基础定时器、

    2024年02月03日
    浏览(24)
  • STM32单片机(六)TIM定时器 -> 第二节:TIM定时中断练习(定时器定时中断和定时器外部时钟)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(18)
  • STM32标准库开发——TIM定时器中断

    定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型 不仅具备基本的定时中断功能

    2024年01月18日
    浏览(19)
  • STM32CubeMX教程8 TIM 通用定时器 - 输出比较

    开发板(STM32F407G-DISC1) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 逻辑分析仪nanoDLA 使用STM32CubeMX软件配置STM32F407 通用定时器的输出比较通道 ,并将其输出到四个LED灯引脚实现LED灯流水灯效果 STM32F407的定时器通道均可以实现输出比较功能, 输出比较功

    2024年02月03日
    浏览(33)
  • 【STM32笔记】STM32的定时器开发基础(二)(基于STM32CubeMX实现定时器中断)

      传统STM32外部中断 的设计步骤:  (1)将GPIO初始化为输入端口。  (2)配置相关I/O引脚与中断线的映射关系。  (3)设置该I/O引脚对印的中断触发条件。  (4)配置NVIC,并使能中断。  (5)编写中断服务函数。   基于STM32CubeMX的外部中断 设计步骤  (1)在STM3

    2024年02月20日
    浏览(20)
  • 江科大stm32视频学习笔记——TIM定时中断&定时器外部时钟

    目录 一、TIM(Timer)定时器简介  1.1 定时器类型 摘要 1.1.1 基本定时器 1.1.2 通用定时器 1.1.3 高级定时器  1.2 定时中断基本结构 1.2.1 结构框图 1.2.2 时序图 二、定时器定时中断定时器外部时钟 2.1 内部时钟闹钟代码 2.1.1 Timer.c 2.1.2 Buzzer.c加入间隔发声函数 2.1.3 main.c 2.1.4 实验视频

    2024年01月23日
    浏览(26)
  • STM32CubeMX教程6 TIM 通用定时器 - 生成PWM波

    开发板(STM32F407G-DISC1) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 逻辑分析仪nanoDLA 使用STM32CubeMX软件配置STM32F407 通用定时器生成可变占空比PWM波形,并将其输出到LED灯引脚实现呼吸灯效果 STM32F407有10个通用定时器,其中TIM2、TIM3、TIM4和TIM5有4个捕获

    2024年02月03日
    浏览(17)
  • 野火STM32电机系列(五)Cubemx配置高级定时器TIM1

    鸽了一段时间,放心不会断的哈,目前仅仅是显示屏坏了,不影响后面项目 前文已经配置了GPIO、编码器 本节讲解CubeMX高级定时器TIM1配置带死区的6路互补的PWM 同时配置信号触发后续ADC采集 板子引角的原理图如下 对应的: Motor1--U+--PA8--TIM1_CH1 Motor1--U---PB13--TIM1_CH1N Motor1--V+--

    2024年02月15日
    浏览(38)
  • STM32 HAL库-定时器中断

    关闭或开启所有中断;代码如下: STM32F407 有众多的定时器,其中包括 2 个基本定时器(TIM6 和 TIM7)、10 个通用定时 器(TIM2 ~ TIM5、TIM9 ~TIM14)、2 个高级控制定时器(TIM1 和 TIM8),这些定时器彼此完 全独立,不共享任何资源。 选择定时器,配置时钟源,设置预分频系数,计

    2024年01月25日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包