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

【STM32F4】利用定时器实现最基本的定时功能(HAL)

程序员文章站 2022-06-11 18:04:43
...

定时器简介

STM32F429单片机有许多定时器Timer,主要分成三类,基本定时器;通用定时器和高级定时器。三种类型的定时器功能由少变多,高级定时器包含了低级定时器的功能。

  • 基本定时器:TIM6、TIM7
  • 通用定时器:TIM2、TIM3、TIM4、TIM5、TIM9~TIM14
  • 高级定时器:TIM1,TIM8
    【STM32F4】利用定时器实现最基本的定时功能(HAL)

注:图中的接口接口时钟就是总线时钟。

定时器最基本的功能就是定时,三种类型的定时器都包含定时功能,今天只讲述如何利用HAL库方法实现利用定时功能点亮LED灯。

定时功能主要有三种方式:

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

此处引用Z小旋的图片:

【STM32F4】利用定时器实现最基本的定时功能(HAL)

定时时间计算公式为:

【STM32F4】利用定时器实现最基本的定时功能(HAL)

arr为计数值,psc为定时器分频系数,Tclk一般设定为最大工作频率,其中psc和arr可以自己设定,tclk为定时器时钟,也就是第一个图的最后一列。

举个栗子:

以stm32f429为例,假如想利用TIM2定时500ms,TIM2位于APB2总线上,其定时器时钟为90Mhz,为了方便计算,psc一般设定为Tclk*100-1,也就是8999,这样arr的设定值为定时时间*10-1,也就是499,单位为ms。

假如使用103单片机,定时100ms,那么arr=999(1000-1),psc=7199(7200-1),tclk=72M。注意单位Tout为ms,tclk为Mhz

利用定时器点亮LED

  1. 打开stm32Cubemx,创建新工程,芯片型号选择STM32F429IG

  2. 配置RCC为外部高速时钟(HSE)。
    【STM32F4】利用定时器实现最基本的定时功能(HAL)

  3. 配置定时器TIM2,选择时钟源为内部时钟,配置计数方式,arr和psc以及是否重装载,并使能中断。

【STM32F4】利用定时器实现最基本的定时功能(HAL)

【STM32F4】利用定时器实现最基本的定时功能(HAL)

Clock Source:选择时钟源(Internal Source)

Prescaler:PSC定时器分频系数 (17999 )

Counter Mode:计数模式( UP:递增计数)

Counter Period:自动重装载值(4999)

auto-reload preload:是否开启重装载(Enable)

只需设置上述四个选项即可,其余设置和本程序无关,保持默认即可。

  1. 设置时钟树
    【STM32F4】利用定时器实现最基本的定时功能(HAL)

选择外部时钟HSE 8MHz
PLL锁相环倍频180倍
系统时钟来源选择为PLL
设置APB1分频器为 /2
这时候定时器的时钟频率为90Mhz

  1. 配置GPIO口
    我的板子LED连接的端口是PF6,找到PF6,并设置output模式
    【STM32F4】利用定时器实现最基本的定时功能(HAL)
    配置GPIO口的相关参数
    【STM32F4】利用定时器实现最基本的定时功能(HAL)

设置输出电平,参照自己板子的电路图,我的是低电平点亮
设置输出模式
设置上/下拉
设置输出速度
设置用户标签

  1. 生成程序
    【STM32F4】利用定时器实现最基本的定时功能(HAL)
    设置工程名称
    设置路径
    选择编译器
    设置库函数版本

【STM32F4】利用定时器实现最基本的定时功能(HAL)

其余设置保持默认
点击GENERATE CODE生成代码

  1. 开启TIM2中断

【STM32F4】利用定时器实现最基本的定时功能(HAL)
HAL_TIM_Base_Start函数在stm32f4xx_hal_tim.h文件中

  1. 在TIM.c中添加中断回调函数
 /* Includes ------------------------------------------------------------------*/
#include "tim.h"

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if (htim == (&htim2))
	HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_6);
}

/* USER CODE END 0 */

大功告成

相关标签: stm32 keil mdk