• 基于STM32的定时器--定时中断(HAL库)


    基于STM32的定时器--定时中断(HAL库)

    介绍

    引言

    本文旨在介绍如何使用STM32CubeMX配置+KEIL 5开发一个每10us定时器中断触发一次的项目。帮助初学者入门STM32的定时器使用。

    定时器介绍

    定时器是STM32微控制器中非常重要的功能模块之一,用于计时、生成精确的时间延迟、触发事件等。STM32微控制器通常具有多个定时器模块,包括通用定时器(General Purpose Timer)和高级定时器(Advanced Timer)。每个定时器模块都具有多个通道,每个通道都可以用于不同的定时和计数操作。

    以下是一些常见的STM32定时器的特点和功能:

    1. 通用定时器(General Purpose Timer):STM32中常见的通用定时器包括TIM2、TIM3、TIM4等。它们通常具有以下特点:
      • 可以选择不同的时钟源和分频因子,以获得所需的定时精度。
      • 支持输入捕获功能,用于测量外部信号的脉冲宽度、周期等。
      • 支持输出比较功能,可用于生成精确的脉冲、PWM信号等。
      • 支持定时中断,可以在达到指定的定时值时触发中断。
    2. 高级定时器(Advanced Timer):STM32中常见的高级定时器包括TIM1、TIM8等。它们通常具有以下特点:
      • 具有更多的定时通道,用于更复杂的定时和计数操作。
      • 支持更高的定时精度和频率。
      • 提供更多的功能选项,如编码器接口、PWM输入捕获等。
    3. 低功耗定时器(Low-Power Timer,LPTIM):STM32中的LPTIM模块是为低功耗应用设计的定时器,具有以下特点:
      • 在低功耗模式下仍能保持活动,以提供精确的时间计数。
      • 适用于节能需求高的应用,如电池供电的系统。

    使用STM32的定时器,您可以执行以下操作:

    • 计时和测量外部信号的时间参数,如脉冲宽度、周期等。
    • 生成精确的定时延迟,用于控制操作的时序。
    • 产生PWM信号,用于驱动电机、控制LED亮度等。
    • 触发中断,以响应特定的定时事件。

    实例

    项目介绍

    此项目为了讲解如何使用定时器,每10us触发一次定时器中断。我们可以通过这个实例,进行自己的开发。

    准备

    1. MCU:STM32F407(根据自己的需求选择即可,流程都一样)
    2. 库:HAL库
    3. 开发工具:STM32CubeMX
    4. 开发环境Keil 5

    设计流程

    1. 使用STM32CubeMX创建一个工程

    2. RCC选取外部时钟
      ![3

    3. 选择Debug(不选不能烧录和调试)

    在这里插入图片描述
    4. Clock Source:定时器时钟源,选择Internal Clock

    5. 然后开始配置时钟树,设置如下图所示,使定时器主频为168MHz。而TIM3是挂接在APB1上的,所以也就是要让APB1这儿最终为84MHz

    6. 实现时钟配置:设置定时器中断,每10us触发中断一次。(后续canopen的最小时间单位即为此处进入一次中断的时间),每次进入定时器中断的的时间计算公式为:
    t i m e = (( P r e s c a l e r + 1 )( P e r i o d + 1 )) / 定时器总线时钟源 time=((Prescaler+1)(Period+1))/定时器总线时钟源 time=((Prescaler+1)(Period+1))/定时器总线时钟源
    eg:当定时器总线时钟源为84MHz,Prescaler为83,Period为9.此时定时时间为:84*10/84000000=0.00001s=10us。


    7. 打开定时器中断

    8. 填写生成的工程信息(工程名称,存放位置等)
    在这里插入图片描述
    值得注意的是,MDK的最小版本千万不要选错
    9. 生成代码

    1. 成功的话会出现提示

    2. 进入工程,发现初始化代码都已经生成

    3. 进入Keil 5后,不要忘了配置debug,不然会烧录失败。
      在这里插入图片描述

    4. 我们需要开启定时器中断: HAL_TIM_Base_Start_IT(&htim3);

    5. 编写定时器中断回调函数

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	if(htim->Instance == htim3.Instance) 
    	{	
    	
    		//书写我们想要执行的功能
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 编译一下,无错误,项目完成,每10us进入中断回调函数一次。

  • 相关阅读:
    FPGA实现UDP传输视频,提供2套verilog工程源码和接收显示上位机程序
    【Vue项目复习笔记】Home离开时记录状态和位置
    SpringBoot+微信小程序实现的酒店预订小程序系统 附带详细运行指导视频
    Oracle VM VirtualBox安装CentOS 7系统
    启山智软/电商商城100%开源
    Flutter开发桌面应用的一些探索分享
    并发编程详解: 十三个工具类, 十大设计模式, 从理论基础到案例实战
    猿创征文|School StartsFirstProject~UnityVR(HTCVive设备开发)
    vertx学习总结5
    五、python Django CBV视图[基本视图、通用显示视图、通用编辑视图]
  • 原文地址:https://blog.csdn.net/qq_44629109/article/details/130891289