【学习笔记】stm32单片机定时器功能的使用及配置方法

我又回来写学习笔记了。
前面我写过一篇 stm32 的一些新名词的汇总，当时是刚学到定时器，现在定时器学完了，突然想来汇总一下定时器的用法，于是这篇博客诞生了。
文章出现的资料是江协视频下的：
https://www.bilibili.com/video/BV1th411z7sn/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=e836ee461d07a48f2161731d0ca031f0

（一）定时器中断

定时器中断，顾名思义就是通过定时器计数触发中断。

首先开启时钟，使用RCC_APB1PeriphClockCmd函数（无论做什么事情都要先开启时钟），如果用外部引脚记得用使用RCC_APB2PeriphClockCmd函数开启时钟并且用GPIO_Init初始化引脚才行。

定时器有四种模式：内部时钟模式、外部时钟模式 1 和 2、编码器模式。我们想配置定时器中断就要从这四种模式里挑一种出来用，其中外部中断模式 1 跟 2 区别在于模式 2 是事件中断，不中断程序正常运行。

配置内部时钟的函数为：TIM_InternalClockConfig，参数只需要配置的定时器名称。
配置外部时钟模式 2 的函数为：TIM_ETRClockMode2Config，参数需要定时器名称，定时器预分频，计数方式（高电平计数还是低电平），滤波。
配置外部时钟模式 1 的函数为：TIM_ETRClockMode1Config，这个没用过，上网搜索也含糊不清，就不讲了。
配置捕获通道的函数为：TIM_ICInit，参数需要定时器名称和输入捕获结构体的地址，结构体后面讲。

江科大视频中是教了内部时钟模式和外部时钟模式 2 两种模式使用。

然后我们配置时基单元，使用的函数是TIM_TimeBaseInit，需要定时器名称和时基单元结构体的地址作为参数。
时机单元结构体中主要包括分频、计数方式（一般用向上计数）、ARR 和 PSC 寄存器的值（这俩分别是计数周期和预分频），还有个重复计数器，我们学的是通用定时器，没有这个功能。

接下来我们使用TIM_ITConfig开启中断，在这之前还要用TIM_ClearFlag(TIMx, TIM_FLAG_Update)
清除更新标志位，因为TIM_TimeBaseInit函数末尾，手动产生了更新事件，若不清除此标志位，则开启中断后，会立刻进入一次中断。

最后我们配置 NVIC，使用NVIC_PriorityGroupConfig和NVIC_Init配置中断顺序即可，然后使用TIM_Cmd开启定时器即可。

（二）输出比较

输出比较其实就是输出一种 PWM 波（暴论），其中有很多模式选择，但一般直接用 PWM 模式 1 或者 2。

首先还是一样开启时钟，使用RCC_APB1PeriphClockCmd函数，记得用使用RCC_APB2PeriphClockCmd函数开启时钟并且用GPIO_Init初始化引脚才行。

然后用TIM_InternalClockConfig配置内部时钟（其实没必要，默认就是内部时钟。）

接着配置时基单元，跟前面一样。

然后我们需要使用TIM_OC1Init配置通道一的输出比较函数，这边提到一共有四个输出比较通道，每个通道都有特定的引脚与之相连，需要查看引脚定义图来选择，该函数需要的参数有定时器名称和输出比较结构体，结构体中包括配置的模式（选 PWM1 就行）、输出极性、CCR 的值，CCR 是输出比较寄存器，与计数器 CNT 比较发出高低电平。

最后用TIM_Cmd开启定时器即可。
需要提到的还有TIM_SetCompare1函数，这是用来更改 CCR 的值的。

（三）输入捕获

输入捕获就是使用定时器捕获电流中的高低电平计算输入频率用的。

前两步跟前面的一样，开启时钟并配置时基单元，不过这里要把 ARR 拉到最大，防止计数器溢出，就需要把它设为 65535.

然后我们调用TIM_ICInit配置输入捕获模式（PWMI 模式则用TIM_PWMIConfig），需要的参数有通道（这里跟输出比较一样有四个通道，每个通道对应不同引脚，需要查看引脚定义图选择）、滤波、输入极性、预分频、信号交叉（这个在 PWMI 模式中会用到，一般只需要选直连就可以了）

接下来用TIM_SelectInputTrigger和TIM_SelectSlaveMode选择触发源及从模式。

触发源中的 TI1FP1 和 TI1FP2 分别表示通道一和二（话说怎么没看到通道三和四的），从模式选择复位（Reset），即 TI1 产生上升沿时，会触发 CNT 归零。

最后TIM_Cmd开启定时器即可。
需要提到的函数还有TIM_GetCapture1和TIM_GetCapture2，这俩是对 CRR1 和 CRR2 进行读数，在普通模式下，二者都表示捕获的频率，而在 PWMI 模式下，CRR1 表示捕获频率，CRR2 表示低电平的频率，CRR2/CRR1 为占空比。

（四）编码器模式

编码器模式是专门用于测编码器输出频率的模式，只能用通道一二。

配置编码器模式跟配置输入捕获的方法大致相同，区别在于编码器模式需要两个引脚，捕获通道也要用TIM_ICInit配置俩。

接下来用TIM_EncoderInterfaceConfig配置编码器模式，需要的参数有定时器名称、在 TI1 和 TI2 哪里计数（选 TI12 就可以了，不知道设置另外的俩是干什么用的。）、俩极性（这里的极性的意思是是否反向，就是如果你觉得编码器旋转计数方向要改一下就把其中一个极性改一下就行）。

最后用TIM_Cmd开启定时器即可。
我们可以用TIM_GetCounter函数读取编码器的值。

那么学过的定时器用法就这么多，写博客前还觉得自己已经了解得差不多了，结果真来写了还是理解得太肤浅了，而且写得很匆忙，不知道有没有错误的地方。