欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32L051使用HAL库操作实例(8)-(TIM)定时器中断实验

程序员文章站 2022-03-16 11:03:15
...

一、前言

STM32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等。也是日常使用最频繁的外设之一,所以一定要掌握好,本章节记录下个人的简单配置过程;

二、定时器介绍

STM32L051C8T6有5个定时器
通用定时器(TIM2、TIM21、TIM22、),基本定时器(TIM6),低功耗定时器(LPTIM1)。

通用定时器功能

  •  16位向上、向下、向上/下自动装载计数器
  • 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
  • 4 个独立通道(TIMx_CH1~4)可以用作:
  •  测量输入信号的脉冲长度( 输入捕获)
  •  输出比较
  •  单脉冲模式输出
  • PWM输出(边缘或中间对齐模式)
  • 支持针对定位的增量(正交)编码器和霍尔传感器电路
  • 如下事件发生时产生中断/DMA:
  •  更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
  •  触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
  • 输入捕获  
  • 输出比较

基本定时器功能

  • 16位向上、向下、向上/下自动装载计数器
  • 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
  • 触发DAC的同步电路 注:此项是TIM6/7独有功能.

低功耗定时器功能

  • LPTIM 是一个 16 位定时器,得益于其定时器的低功耗;
  • 由于 LPTIM 的时钟源具有多样性,因此 LPTIM 能够在所有电源模式(待机模式除外)下保持运行状态
  • 即使没有内部时钟源, LPTIM 也能运行,鉴于这一点,可将其用作“脉冲计数器”,这种脉冲计数器在某些应用中十分有用。

    此外, LPTIM 还能将系统从低功耗模式唤醒,因此非常适合实现“超时功能”,而且功耗极低。

  • LPTIM 引入了一个灵活的时钟方案,该方案能够提供所需的功能和性能,同时还能最大程度地降低功耗

三、定时器计数模式

通用定时器可以向上计数、向下计数、向上向下双向计数模式。

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

STM32L051使用HAL库操作实例(8)-(TIM)定时器中断实验

四、STM32CubeMX配置(本文使用的STM32CubeMX版本为5.6.0)
思路:每进入定时器中断时翻转一次LED状态。
1.MCU选型
本例程使用的为STM32L051C8T6型号
2.使能时钟
STM32L051使用HAL库操作实例(8)-(TIM)定时器中断实验
3.设置GPIO口
STM32L051使用HAL库操作实例(8)-(TIM)定时器中断实验
4.定时器配置
①定时器配置
STM32L051使用HAL库操作实例(8)-(TIM)定时器中断实验

定时器溢出时间计算

STM32L051使用HAL库操作实例(8)-(TIM)定时器中断实验
这里我们 arr=4999  psc=3199 Tclk=32Mhz        Tout = (5000*3200)/32  us  = 500ms

②LED引脚配置部分可参看前面的文章(1)点亮LED章节

5.配置STM32CubeMX生成工程文件
STM32L051使用HAL库操作实例(8)-(TIM)定时器中断实验
STM32L051使用HAL库操作实例(8)-(TIM)定时器中断实验
6.点击GENERATE CODE生成工程文件

五、KEIL程序
1.相关函数:

初始化定时器函数,此函数初始化了在STM32CubeMX内设置的参数,系统已经处理好了,并已经添加在了main函数内;

MX_TIM2_Init();  //初始化定时器配置

开启定时器中断函数,这个需要自行添加到main函数内,不然无法进入中断;

HAL_TIM_Base_Start_IT(&htim2);

当定时器开始计数后,到达计数值时回进入TIM2_IRQHandler中断,然后时器会调用HAL_TIM_IRQHandler(&htim2)函数中断,进入回调中断函数后会发现函数的原型会调用一个预设的HAL_TIM_PeriodElapsedCallback()函数,这个是空的,需要我们自己重新定义,此函数随便放在哪里都可以,本例是放在tim.C内;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);  //每次进入中断后LED状态进行翻转
}

本例程的main.c

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start_IT(&htim2);  //启动定时器中断
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

2.编译文件,下载。即可,实现效果如下:

STM32L051使用HAL库操作实例(8)-(TIM)定时器中断实验