侧边栏壁纸
博主头像
thinkTV博主等级

喜爱动漫的二刺螈一枚,摩托车云爱好者(快要有车了)。 懂一点技术的在读生物医学工程研究生( •̀ ω •́ )✧,多多指教。

  • 累计撰写 127 篇文章
  • 累计创建 17 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

STM32-定时器

thinkTV
2023-07-01 / 0 评论 / 0 点赞 / 268 阅读 / 2,890 字 / 正在检测是否收录...

1. 定时器概述

1.1 软件定时原理

使用纯软件(CPU死等)的方式实现定时(延时)功能

void delay_us(uint32_t us)
{
    us *= 72;
    while(us--);
}

缺点:

  1. 延时不精准
  2. CPU死等

1.2 定时器定时原理

  • 使用精准的时基,通过硬件的方式,实现定时功能
  • 定时器核心就是计数器

图片

1.3 STM32定时器分类

图片-1688223764957

1.4 STM32定时器特性表

图片-1688223801434

1.5 STM32基本、通用、高级定时器的功能整体区别

图片-1688223859347

2. 基本定时器

2.1 基本定时器简介

  1. 基本定时器:TIM6/TIM7
  2. 主要特性:
    • 16位递增计数器(计数值:0~65535)
    • 16位预分频器(分频系数:1~65536)
    • 可用于触发DAC
    • 在更新事件(计数器溢出)时,会产生中断/DMA请求

2.2 基本定时器框图

图片-1688224802892

2.3 STM32定时器计数模式及溢出条件

图片-1688228492599

递增计数模式实例说明

  • PSC = 1 (分频系数=PSC+1)
  • ARR = 36

图片-1688228979053

2.4 定时器中断实验相关寄存器

TIM6 和TIM7 控制寄存器 1(TIMx_CR1)

图片-1688229226395

TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)

图片-1688229245182

TIM6 和TIM7 状态寄存器(TIMx_SR)

图片-1688229266343

TIM6 和TIM7 计数器(TIMx_CNT)

图片-1688229829583

计数器实时数值,可用于设置计时器初始值,范围:0~65535

TIM6 和TIM7 预分频器(TIMx_PSC)

图片-1688229850971

用于设置预分频系数,范围:0~65535,实际预分频系数等于PSC+1

TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)

图片-1688229874791

用于设置自动重装载值,范围:0~65535

2.5 定时器溢出时间计算方法

图片-1688229899877

  • 𝑇out是定时器溢出时间
  • 𝐹𝑡是定时器的时钟源频率
  • 𝐴𝑅𝑅是自动重装载寄存器的值
  • 𝑃𝑆𝐶是预分频器寄存器的值

2.6 定时器中断实验配置步骤

图片-1688230112380

相关HAL库函数介绍

图片-1688230126417

关键结构体介绍

typedef struct 
{ 
    TIM_TypeDef *Instance;            /* 外设寄存器基地址 */ 
    TIM_Base_InitTypeDef Init;     /* 定时器初始化结构体*/
     ...
}TIM_HandleTypeDef;

typedef struct 
{ 
    uint32_t Prescaler;                      /* 预分频系数 */ 
    uint32_t CounterMode;             /* 计数模式 */ 
    uint32_t Period;                           /* 自动重载值 ARR */ 
    uint32_t ClockDivision;             /* 时钟分频因子 */ 
    uint32_t RepetitionCounter;   /* 重复计数器寄存器的值 */ 
    uint32_t AutoReloadPreload; /* 自动重载预装载使能 */
} TIM_Base_InitTypeDef;

3. 通用定时器

3.1 通用定时器简介

  1. 通用定时器:TIM2/TIM3 /TIM4 /TIM5
  2. 主要特性:
    • 16位递增、递减、中心对齐计数器(计数值:0~65535)
    • 16位预分频器(分频系数:1~65536)
    • 可用于触发DAC、ADC
    • 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求
    • 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式
    • 使用外部信号控制定时器且可实现多个定时器互连的同步电路
    • 支持编码器和霍尔传感器电路等

3.2 通用定时器框图

图片-1688233920631

①时钟源
②控制器
③时基单元
④输入捕获
⑤捕获/比较(公共)
⑥输出比较

3.3 通用定时器时钟源

图片-1688236490429

①内部时钟(CK_INT),来自外设总线APB提供的时钟
②外部时钟模式1:外部输入引脚(TIx),来自定时器通道1或者通道2引脚的信号
③外部时钟模式2:外部触发输入(ETR),来自可以复用为TIMx_ETR的IO引脚
④内部触发输入(ITRx),用于与芯片内部其它通用/高级定时器级联

计数器时钟源寄存器设置方法(F1为例)

图片-1688236688998

外部时钟模式1

图片-1688236741852

外部时钟模式2

图片-1688236770469

使用一个定时器作为另一个定时器的预分频器(F1为例)

图片-1688236788506

3.4 通用定时器PWM输出

3.4.1 通用定时器输出比较部分框图介绍

图片-1688238348456

捕获/比较通道1的主电路—输出部分

图片-1688238366479

捕获/比较通道的输出部分(通道1)

图片-1688238418626

3.4.2 通用定时器输出PWM原理

  • 假设:递增计数模式
  • ARR:自动重装载寄存器的值
  • CCRx:捕获/比较寄存器x的值
  • 当CNT < CCRx,IO输出0
  • 当CNT >= CCRx,IO输出1

图片-1688238761775

总结:PWM波周期或频率由ARR决定,PWM波占空比由CCRx决定

3.4.3 PWM模式

PWM模式1:
递增:

  • CNT < CCRx,输出有效电平
  • CNT >= CCRx,输出无效电平
    递减:
  • CNT > CCRx,输出无效电平
  • CNT <= CCRx,输出有效电平

PWM模式2:
递增:

  • CNT < CCRx,输出无效电平
  • CNT >= CCRx,输出有效电平
    递减:
  • CNT > CCRx,输出有效电平
  • CNT <= CCRx,输出无效电平

有/无效状态由TIMx_CCER决定

  • CCxP=0:OCx高电平有效
  • CCxP=1:Ocx低电平有效

图片-1688239058203

3.4.4 通用定时器PWM输出配置步骤

图片-1688239165395

相关HAL库函数介绍

图片-1688239179055

关键结构体介绍

typedef struct 
{ 
   uint32_t OCMode; 	  /* 输出比较模式选择 */
   uint32_t Pulse; 	            /* 设置比较值 */
   uint32_t OCPolarity;       /* 设置输出比较极性 */
   uint32_t OCNPolarity;    /* 设置互补输出比较极性 */
   uint32_t OCFastMode;   /* 使能或失能输出比较快速模式 */
   uint32_t OCIdleState;     /* 空闲状态下OC1输出 */
   uint32_t OCNIdleState;  /* 空闲状态下OC1N输出 */ 
} TIM_OC_InitTypeDef;

3.5 通用定时器输入捕获

3.5.1 通用定时器输入捕获部分框图介绍

图片-1688242207595

捕获/比较通道的输入部分(通道1)

图片-1688242232817

捕获/比较通道1的主电路—输入部分

图片-1688242327673

3.5.2 通用定时器输入捕获脉宽测量原理

  • 以捕获测量高电平脉宽为例
  • 假设:递增计数模式
  • ARR:自动重装载寄存器的值
  • CCRx1:t1时间点CCRx的值
  • CCRx2:t2时间点CCRx的值

图片-1688242748814

高电平期间,计时器计数的个数:N * (ARR+1) + CCRx2

3.5.3 通用定时器输入捕获实验配置步骤

图片-1688242830836

相关HAL库函数介绍

图片-1688244076717

关键结构体介绍

typedef struct
{ 
    uint32_t ICPolarity;    /* 输入捕获触发方式选择,比如上升、下降沿捕获 */ 
    uint32_t ICSelection; /* 输入捕获选择,用于设置映射关系 */ 
    uint32_t ICPrescaler; /* 输入捕获分频系数 */ 
    uint32_t ICFilter;         /* 输入捕获滤波器设置 */ 
} TIM_IC_InitTypeDef;

3.6 通用定时器脉冲计数

3.6.1 脉冲计数实验原理

图片-1688244411216

外部时钟模式1

图片-1688244435967

3.6.2 通用定时器脉冲计数配置步骤

图片-1688244459071

相关HAL库函数介绍

图片-1688244471793

关键结构体介绍

typedef struct 
{ 
    uint32_t SlaveMode;              /* 从模式选择 */ 
    uint32_t InputTrigger;           /* 输入触发源选择 */ 
    uint32_t TriggerPolarity;      /* 输入触发极性 */ 
    uint32_t TriggerPrescaler;   /* 输入触发预分频 */ 
    uint32_t TriggerFilter;           /* 输入滤波器设置 */ 
} TIM_SlaveConfigTypeDef;

4. 高级定时器

4.1 高级定时器简介

高级定时器: TIM1/TIM8
主要特性:

  • 16位递增、递减、中心对齐计数器(计数值:0~65535)
  • 16位预分频器(分频系数:1~65536)
  • 可用于触发DAC、ADC
  • 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求
  • 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式
  • 使用外部信号控制定时器且可实现多个定时器互连的同步电路
  • 支持编码器和霍尔传感器电路等
  • 重复计数器
  • 死区时间带可编程的互补输出
  • 断路输入,用于将定时器的输出信号置于用户可选的安全配置中

4.2 高级定时器框图

图片-1688288482231

4.3 高级定时器输出指定个数PWM

4.3.1 重复计数器特性

  • 计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件
  • 如果设置RCR为N,更新事件将在N+1次溢出时发生

图片-1688295988563

4.3.2 高级定时器输出指定个数PWM原理

图片-1688296477047

  1. 配置边沿对齐模式输出PWM
  2. 指定输出N个PWM,则把N-1写入RCR
  3. 在更新中断内,关闭计数器

注意:高级定时器通道输出必须把MOE位置1

4.3.3 高级定时器输出指定个数PWM配置步骤

图片-1688296629481

相关HAL库函数介绍

图片-1688296649341

关键结构体介绍

typedef struct 
{ 
   uint32_t OCMode; 	  /* 输出比较模式选择 */
   uint32_t Pulse; 	            /* 设置比较值 */
   uint32_t OCPolarity;       /* 设置输出比较极性 */
   uint32_t OCNPolarity;    /* 设置互补输出比较极性 */
   uint32_t OCFastMode;   /* 使能或失能输出比较快速模式 */
   uint32_t OCIdleState;     /* 空闲状态下OC1输出 */
   uint32_t OCNIdleState;  /* 空闲状态下OC1N输出 */ 
} TIM_OC_InitTypeDef;

4.4 高级定时器输出比较模式实验

4.4.1 高级定时器输出比较模式原理

图片-1688296835714

  • 输出比较模式:翻转
  • 当CNT = CCRx,OCxREF电平翻转
  • 总结:PWM波周期或频率由ARR决定,占空比固定50%,相位由CCRx决定

4.4.2 高级定时器输出比较模式配置步骤

图片-1688296910371

相关HAL库函数介绍

图片-1688296921866

关键结构体介绍

typedef struct 
{ 
   uint32_t OCMode; 	  /* 输出比较模式选择 */
   uint32_t Pulse; 	            /* 设置比较值 */
   uint32_t OCPolarity;       /* 设置输出比较极性 */
   uint32_t OCNPolarity;    /* 设置互补输出比较极性 */
   uint32_t OCFastMode;   /* 使能或失能输出比较快速模式 */
   uint32_t OCIdleState;     /* 空闲状态下OC1输出 */
   uint32_t OCNIdleState;  /* 空闲状态下OC1N输出 */ 
} TIM_OC_InitTypeDef;

4.5 高级定时器互补输出带死区控制

4.5.1 互补输出与死区控制介绍

图片-1688297078515

4.5.2 带死区控制的互补输出应用之H桥

图片-1688297937677

4.5.3 捕获/比较通道的输出部分(通道1至3)

图片-1688297966863

4.5.4 死区时间计算

图片-1688298011922

图片-1688298753949

  • 举个栗子(F1为例):DTG[7:0]=250
  • 250,即二进制:1111 1010,选第四条
  • DT = (32+26)1655.56 ns=51.55968us

4.5.5 刹车(断路)功能

  • 使能刹车功能:将TIMx_BDTR的BKE位置1,刹车输入信号极性由BKP位设置
  • 使能刹车功能后:由TIMx_BDTR的MOE、OSSI、OSSR位,
  • TIMx_CR2的OISx、OISxN位,TIMx_CCER的CCxE、CCxNE位控制OCx和OCxN输出状态
  • 无论何时,OCx和OCxN输出都不能同时处在有效电平

图片-1688298378732

发生刹车后,会怎么样

  1. MOE位被清零,OCx和OCxN为无效、空闲或复位状态(OSSI位选择)
  2. OCx和OCxN的状态:由相关控制位状态决定,当使用互补输出时:根据情况自动控制输出电平,参考参考手册使用刹车(断路)功能小节
  3. BIF位置1,如果使能了BIE位,还会产生刹车中断;如果使能了TDE位,会产生DMA请求
  4. 如果AOE位置 1,在下一个 更新事件UEV时,MOE位被自动置 1

4.6 高级定时器PWM输入模式

4.6.1 PWM输入模式工作原理

图片-1688298792515

4.6.2 PWM输入模式时序

图片-1688298817250

4.6.3 高级定时器PWM输入模式配置步骤

图片-1688298847157

0

评论区