STM32配置定时器(库函数版本)

本文章以STM32F407ZGTx为例:
STM32F407一共有14个定时器,其中有两个基本定时器(TIM6和TIM7)、十二个通用定时器(TIM2 ~ TIM5,TIM9 ~ TIM14)、两个高级定时器(TIM1和TIM8)。由于定时器的功能比较繁多和复杂,这里就不介绍这些定时器的功能了。
接着我们开始配置我们的定时器,我这里以TIM2为例。
首先我们要开启TIM2的时钟
STM32配置定时器(库函数版本)
一般通用定时器的时钟都在APB1总线上。
接着我们对TIM2进行初始化
STM32配置定时器(库函数版本)
一般的通用定时器都是这样配置,通用定时器的配置主要是对通用定时器的初始化,这里使用的是stm32f4xx_tim.c文件里的TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)函数对通用定时器初始化,初始化的内容主要是对TIM_TimeBaseInitStruct里面的元素进行赋值,然后传递给该函数。当然我们要知道定时器溢出的时间 = (自动重转载值 + 1) × (分频系数 + 1) ÷ 定时器的时钟频率。
接着就是允许并打开TIM2的中断以及对NVIC的初始化
STM32配置定时器(库函数版本)
NVIC的配置主要是对NVIC的初始化,这里使用的是misc.c文件里的NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)函数对NVIC初始化,初始化的内容主要是对NVIC_InitStruct里面的元素进行赋值,然后传递给该函数。
最后就是编写中断服务函数啦
STM32配置定时器(库函数版本)
我们可以通过获取通用定时器2的中断标志位来判断是否为通用定时器2产生的中断,获取中断标志位的函数在stm32f4xx_tim.c文件中TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)或TTIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)我主要使用的第二个函数。每次进入中断后要对中断标志位进行软件清零。我这里通过stm32f4xx_tim.c文件中的TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)函数进行清零。我这里主要是通过通用定时器来实现LED的闪烁。
以上就已经将通用定时器配置完毕了,但这样配置的可移植性很差,所有我在其头文件中加了一些宏定义来扩展他的可移植性。
STM32配置定时器(库函数版本)
这样初始化函数就可以改成这样
STM32配置定时器(库函数版本)
定时器中断服务函数可以改成这样
STM32配置定时器(库函数版本)
这样就可以之间通过改变宏定义来更改初始化的通用定时器啦。
PS:其实这种方法也不是很完整,只是我比较懒并且这个方法我修改起来也比较熟练。