stm32通过hal库使用定时器

文章目录

  • 实验目的
  • 实验材料
    • 硬件
    • 软件
  • 原理
  • 项目制作
    • CubeMX配置
      • 1、时钟配置
      • 2、配置GPIO
      • 3、配置定时器
      • 4、配置串口
      • 5、按图配置好路径,生成项目
    • 代码编写
      • 1、开启定时器
      • 2、编写中断函数
  • 实验现象
  • 总结
  • 参考资料

实验目的

设置定时器,每隔5秒向串口助手发送Hello World,每隔两秒闪烁LED灯。

实验材料

硬件

  • 面包板一块
  • CH340模块
  • STM32F103C8T6最小开发版
  • 杜邦线若干
  • LED灯一个

软件

  • KEIL5
  • STM32CubeMX

原理

在STM32芯片中不同数量的定时器,分为系统定时器,高级定时器,通用定时器以及基本定时器。

本实验使用到的是通用定时器。通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可

以定时,可以输出比较,可以输入捕捉。

下面是野火的零基础玩转STM32中的资料,介绍了定时器的原理:

stm32通过hal库使用定时器_第1张图片

stm32通过hal库使用定时器_第2张图片

项目制作

CubeMX配置

1、时钟配置

点击SystemCore -> RCC,配置HSE。

stm32通过hal库使用定时器_第3张图片

再点击Clock Configuration,按下图进行操作,将APB2频率配置为72MHz。

stm32通过hal库使用定时器_第4张图片

2、配置GPIO

根据实验要求,需要使用定时器控制LED灯,因此要使用一个GPIO口来控制LED灯。

按下图进行配置即可,有什么不懂的可以看看这篇文章。

stm32通过hal库使用定时器_第5张图片

3、配置定时器

C8T6板子里面有高级定时器TIM1以及通用定时器TIM2-4,这里使用基本定时器即可。

因为既要控制LED,又要发数据,为了区分功能,我使用两个定时器来实现。

点击Timers -> TIM2,将Clock Source设定为Internal Source。

stm32通过hal库使用定时器_第6张图片

下面Prescaler设定为71,计数设置为2000,启动自动重载。

分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,记一次数是0.001ms,这里写成2000就是2ms触发一次中断。软件层面再通过代码,每触发1000次中断闪烁一次LED灯,也就是2s。

记得点击NVIC Setting开启中断,以及点击SystemCore -> NVIC ->Code Generation生成优先级函数,这里忘了截图。

再用同样的方法配置Tim3用于串口通信,因为频率是5s,所以计数要设置为5000,也是每触发1000次中断才发送数据。

4、配置串口

按图配置即可,有不懂的可以看看这里。

stm32通过hal库使用定时器_第7张图片

5、按图配置好路径,生成项目

stm32通过hal库使用定时器_第8张图片

stm32通过hal库使用定时器_第9张图片

代码编写

1、开启定时器

HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);

stm32通过hal库使用定时器_第10张图片

2、编写中断函数

stm32通过hal库使用定时器_第11张图片

无论是哪个定时器触发中断都会执行HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)函数,这个函数的参数表示是哪一个定时器触发了中断。

写两个静态变量记录两个定时器触发中断的次数。前面已经说过,TIM2每2ms触发一次中断,因为LED闪烁时间间隔要求是2s;TIM3是5ms触发一次中断,因为发送数据的时间间隔是5s。每触发一次中断,根据定时器的不同来把不同的变量+1。

当某个变量达到1000时,就执行对应的操作。

实验现象

烧录到单片机后,LED每2s闪烁一次,串口助手每5s收到数据:

stm32通过hal库使用定时器_第12张图片

总结

定时器在被启动后,会根据设置的计数个数开始计数,并且计数完毕后触发中断。用户可以在中断内编写想要执行的操作。

最经典的定时器案例,其实应该是控制蜂鸣器播放音乐。笔者以前使用51单片机实现过,但是实现过程比较复杂,要考虑音调的频率,延音与抬手,以及bpm设置。因此在stm32还没有尝试过。日后笔者会尝试。

参考资料

《零基础玩转STM32F103指南者》

http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/

你可能感兴趣的:(stm32,单片机,arm)