摘要

  本章讲解STM32基本定时器中断的使用方法,实现通过定时器中断,定时500毫秒,让LED灯的状态每隔500ms改变一次。本章的工程可以从前一章节的工程中复制修改完成。

配置工程

  复制 STM32CubeMX系列教程0:创建工程 创建的工程目录GPIO_test,修改文件目录名称为TIM,双击打开GPIO_test.ioc。

配置定时器参数

使能定时器

打开Stm32Cubemx配置文件
在这里插入图片描述

①-②进入定时器设置
③使能定时器时钟源,选择内部时钟源Internal Clock。

配置定时器参数

  经过查看STM32单片机的数据手册,可知,TIM1挂载在APB2总线下,
在这里插入图片描述
  APB2的时钟为100MHz,如果想要使其500ms中断一次,那么可以通过10000分频后,使其速度降为10KHz,那么每计数5000次就是500ms。计算机中数字都是以0为第一位,所以参数都需要减一。
在这里插入图片描述

①定时器分频值,这里为10000分频。
②计数模式,默认向上计数。
③定时器重载值,这里设为5000。
④内部时钟分频,默认不分频即可。

打开自动重载,设置auto_reload prelode 为ENABLE。

开启定时器中断

启动定时器1的更新中断。
在这里插入图片描述

设置中断优先级,在实际工程项目中,当中断过多时,才需要设置中断优先级,测试工程无需设置。
在这里插入图片描述

生成工程

  配置好STM32CubeMX后,生成工程,打开工程。

编写用户程序

编写中断回调函数

   打开定时器HAL库,
在这里插入图片描述
  找到HAL_TIM_PeriodElapsedCallback函数,双击跳转。这个函数HAL为用户提供的定时器的回调函数,所有定时器中断都在此函数中处理。
  复制函数名称void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
在这里插入图片描述
  在main.c文件的末尾,在 USER CODE BEGIN 4 与 USER CODE END 4 之间重写中断回调函数。并在回调函数中写入用户代码。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){   if(htim == &htim1)  //判断中断是否来自于定时器1
   {
   	HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);  //翻转LED灯的状态
   }
}

在这里插入图片描述

启动定时器

  回到主函数mian.c,在USER CODE BEGIN 2与USER CODE END 2之间加入用户初始化函数,这里添加定时器的启动代码。

HAL_TIM_Base_Start_IT(&htim1);       //通过这行代码,以中断的方式启动定时器。  

在这里插入图片描述

定时器的启动方式还有两种:

  1. HAL_TIM_Base_Start_DMA();
    以DMA的方式启动,可以通过DMA直接访问定时器的计数值。
  2. HAL_TIM_Base_Start();
    以轮询的方式启动,不进入中断,仅计数。通过程序主动查询寄存器获取状态

编译下载程序

  程序编译完成并下载后,LED灯每隔500ms改变一次状态。

  STM32单片机程序下载方法有多种,有需要请跳转

STM32程序下载0:STM32CubeProgrammer安装
STM32程序下载1:通过keil-ST-Link方式下载
STM32程序下载2:通过STM32CubePro-ST-Link下载
STM32程序下载3:通过STM32CubePro-UART下载
STM32程序下载4:通过STM32CubePro-USB下载

  选择你所需要的程序下载方法。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐