目录
1.三种定时器的区别
2.通用定时器的特点描述
3.计数器模式
4.通用定时器工作过程
5.计数器时钟计算方法、
5.1定时器的输入时钟频率 - TimeClockFren
5.2计数器时钟计算方法
6.定时器相关寄存器
7.定时器库函数结构体
8.通用定时器函数
9.定时器中断配置过程
10.项目实战 - 通用定时器中断闪烁灯
1.三种定时器的区别
STM32F1xxx系列总共有8个定时器:分别是2个高级定时器 + 4个通用定时器 + 2个基本定时器。
2.通用定时器的特点描述
- 位于APB1低速总线上
- 16位向下,向上/向下(中间对齐模式)计数模式,自动重装载计数器(TIMx_CNT)
- 16位可编程(可以实现修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为1-65535任意数值
- 四个独立通道(TIMx_CH1-4),通道用来支持:
- 输入捕获
- 输出比较
- PWM生成
- 单脉冲模式输出
- 可使用外部信号(TIM_EIR)控制定时器和定时器互联的同步电路。
- 定时器中断/事件产生:六个独立的IRQ/MDA请求生成器
- 更新:计数器 向上/向下溢出,计数器初始化(软件或者外部/内部触发)
- 触发事件:计数器的启动,停止,初始化或者由内部/外部触发计数
- 输入捕获
- 输出比较
- 支持针对定位的增量编码器或者霍尔传感器电路
- 触发输入作为外部时钟或者按周期的电流管理
STM32通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获),或者产生输入波形(输出比较和PWM)等。
定时器的预分频器和RCC时钟控制预分频器,脉冲长度和波形周期可以在us到ms之间调整,每个通用定时器都是完全独立,没有互相共享任何内存。
3.计数器模式
- STM32通用定时器可以 向上、向下、向上/向下双向计数模式
- 向上计数模式:计数值从0计数到自动加载值(TIM_ARR),产生一个计数溢出事件,然后重新从0开始计数
- 向下计数方式:计数器从自动载入的值(TIM_ARR)开始向下计数到0,产生一个计数溢出事件,然后从计数装入值重新开始
- 中央对齐模式:计数器从0开始到(自动载入值-1),产生计数溢出事件,然后向下计数到1,产生定时器溢出事件,然后从0开始计数。
4.通用定时器工作过程
- 时钟部分:(时钟来源)
- 内部时钟APB1倍频器
- 外部引脚,通用定时器2,3,4
- 其他定时器
- 外部通道
- 时基单元:
- 预分频(除法)
- 计数器时钟
- 自动重装载值
- 输入部分:
- 输入引脚
- 边缘检测
- 输出部分:
- 输出比较寄存器(周期 ---- 重装载值、占空比 ---- 比较值)
5.计数器时钟计算方法、
5.1定时器的输入时钟频率 - TimeClockFren
除非APB1分频系数为1,否则通用定时器时钟为APB1的两倍.
举例:
AHB = 72M
APB1 = 36M(分频系数为2)
通用定时器时钟为 36 * 2 = 72M
5.2计数器时钟计算方法
TimeOut = ((Prescaler + 1) * (Period + 1) ) / TimeClockFren;
- TimeOut:定时器溢出时间(单位为us),多少触发(进入)一次TIM中断。
- Prescaler:分频TIM时钟的预分频器值。
- Period:计数重载值,TIM计数当超过这个值,则重新计数。
- TimeClockFren:定时器的输入时钟频率(单位MHZ),也就是当前使用的TIM所用的CLOK的时钟频率。如果不清楚,可通过相关参数得到。
例如:
Tout = 1s = 10 000 (9999 + 1)*7200(分频系数 7199+1)/72M(72000 000)
6.定时器相关寄存器
- 控制寄存器:控制计数方向
- 预分频寄存器:分频系数 (PSC+1)/ N = CNT
- 计数器寄存器CNT:当前计数值
- 自动重装载寄存器:重装载值
7.定时器库函数结构体
typedef struct
{
uint16_t TIM_Prescaler; //分割TIM时钟的预分频值。
uint16_t TIM_CounterMode; //设置计数模式
uint16_t TIM_Period; //自动重装载值
uint16_t TIM_ClockDivision; //时钟分频
uint8_t TIM_RepetitionCounter; //高级定时器使用
} TIM_TimeBaseInitTypeDef;
8.通用定时器函数
//定时器初始化
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//定时器使能
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
//定时器状态标志位
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
//定时器清除标志位
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
//定时器中断标志位
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
//定时器清除中断标志位
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
9.定时器中断配置过程
- 使能时钟,定时器时钟
- 配置定时器结构体
- 开启定时器中断,配置中断结构体
- 中断服务函数
定时器配置LED每秒闪烁一次
Tout = [自动重装载值(ARR+1)* 分频系数(PSC+1)]/Tclk(分频器时钟)
Tout = 10 000 (9999 + 1)*7200(分频系数 7199+1)/72M(72000 000)
10.项目实战 - 通用定时器中断闪烁灯
9-通用定时器中断闪烁灯 · 宋小康/stm32f103c8t6 - 码云 - 开源中国 (gitee.com)