九、STM32定时器讲解 - 通用定时器实战

目录

1.三种定时器的区别

2.通用定时器的特点描述

3.计数器模式

4.通用定时器工作过程

5.计数器时钟计算方法、

5.1定时器的输入时钟频率 - TimeClockFren

5.2计数器时钟计算方法

6.定时器相关寄存器

7.定时器库函数结构体

8.通用定时器函数

9.定时器中断配置过程

10.项目实战 - 通用定时器中断闪烁灯


1.三种定时器的区别

STM32F1xxx系列总共有8个定时器:分别是2个高级定时器 + 4个通用定时器 + 2个基本定时器。 

 

2.通用定时器的特点描述

  1. 位于APB1低速总线上
  2. 16位向下,向上/向下(中间对齐模式)计数模式,自动重装载计数器(TIMx_CNT)
  3. 16位可编程(可以实现修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为1-65535任意数值
  4. 四个独立通道(TIMx_CH1-4),通道用来支持:
    1. 输入捕获
    2. 输出比较
    3. PWM生成
    4. 单脉冲模式输出
  5. 可使用外部信号(TIM_EIR)控制定时器和定时器互联的同步电路。
  6. 定时器中断/事件产生:六个独立的IRQ/MDA请求生成器
    1. 更新:计数器 向上/向下溢出,计数器初始化(软件或者外部/内部触发)
    2. 触发事件:计数器的启动,停止,初始化或者由内部/外部触发计数
    3. 输入捕获
    4. 输出比较
    5. 支持针对定位的增量编码器或者霍尔传感器电路
    6. 触发输入作为外部时钟或者按周期的电流管理

        STM32通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获),或者产生输入波形(输出比较和PWM)等。

        定时器的预分频器和RCC时钟控制预分频器,脉冲长度和波形周期可以在us到ms之间调整,每个通用定时器都是完全独立,没有互相共享任何内存。

3.计数器模式

  1. STM32通用定时器可以 向上、向下、向上/向下双向计数模式
    1. 向上计数模式:计数值从0计数到自动加载值(TIM_ARR),产生一个计数溢出事件,然后重新从0开始计数
    2. 向下计数方式:计数器从自动载入的值(TIM_ARR)开始向下计数到0,产生一个计数溢出事件,然后从计数装入值重新开始
    3. 中央对齐模式:计数器从0开始到(自动载入值-1),产生计数溢出事件,然后向下计数到1,产生定时器溢出事件,然后从0开始计数。

4.通用定时器工作过程

  1.  时钟部分:(时钟来源)
    1. 内部时钟APB1倍频器
    2. 外部引脚,通用定时器2,3,4
    3. 其他定时器
    4. 外部通道
  2. 时基单元:
    1. 预分频(除法)
    2. 计数器时钟
    3. 自动重装载值
  3. 输入部分:
    1. 输入引脚
    2. 边缘检测
  4. 输出部分:
    1. 输出比较寄存器(周期 ---- 重装载值、占空比 ---- 比较值)

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.定时器相关寄存器

  1. 控制寄存器:控制计数方向
  2. 预分频寄存器:分频系数 (PSC+1)/ N = CNT
  3. 计数器寄存器CNT:当前计数值
  4. 自动重装载寄存器:重装载值

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.定时器中断配置过程

  1. 使能时钟,定时器时钟
  2. 配置定时器结构体
  3. 开启定时器中断,配置中断结构体
  4. 中断服务函数

定时器配置LED每秒闪烁一次

Tout = [自动重装载值(ARR+1)*  分频系数(PSC+1)]/Tclk(分频器时钟)

Tout = 10 000 (9999 + 1)*7200(分频系数 7199+1)/72M(72000 000)

10.项目实战 - 通用定时器中断闪烁灯

9-通用定时器中断闪烁灯 · 宋小康/stm32f103c8t6 - 码云 - 开源中国 (gitee.com)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值