1. 1. - Date:2023-07-18
    1. 1.1. 软件定时原理
    2. 1.2. 定时器定时原理
    3. 1.3. STM32 定时器分类
    4. 1.4. 定时器特性表
      1. 1.4.1. F1
    5. 1.5. STM32 基本,通用,高级功能整体区
    6. 1.6. - Date:2023-07-18
    7. 1.7. 基本定时器简介(了解)
    8. 1.8. 基本定时器框图(熟悉)
    9. 1.9. 定时器计数模式及溢出条件(熟悉)
      1. 1.9.1. 实例
      2. 1.9.2. 递增模式
      3. 1.9.3. 递减模式
      4. 1.9.4. 中心对齐模式
    10. 1.10. 定时器中断实验相关寄存器(了解)
      1. 1.10.1. TIM6 和 TIM7 控制寄存器 1(TIMx_CR1)
      2. 1.10.2. TIM6 和 TIM7 DMA/中断使能寄存器(TIMx_DIER)
      3. 1.10.3. TIM6 和 TIM7 状态寄存器(TIMx_SR)
      4. 1.10.4. TIM6 和 TIM7 计数器(TIMx_CNT)
      5. 1.10.5. TIM6 和 TIM7 预分频器(TIMx_PSC)
      6. 1.10.6. TIM6 和 TIM7 自动重装载寄存器(TIMx_ARR)
    11. 1.11. 定时器溢出时间计算方法(掌握)
    12. 1.12. 定时器中断实验配置步骤(掌握)
      1. 1.12.1. 关键结构体介绍
    13. 1.13. 编程实战:定时器中断实验(掌握)
  2. 2. - Date:2023-07-19
    1. 2.1. 通用定时器简介
    2. 2.2. 通用定时器框图
    3. 2.3. 计数器时钟源
    4. 2.4. 通用定时器 PWM 输出
      1. 2.4.1. 通用定时器输出比较部分框图介绍
        1. 2.4.1.1. 捕获/比较通道 1 的主电路—输出部分
        2. 2.4.1.2. 捕获/比较通道的输出部分(通道 1)
      2. 2.4.2. 通用定时器输出 PWM 原理
      3. 2.4.3. PWM 模式
        1. 2.4.3.1. PWM 模式 1
        2. 2.4.3.2. PWM 模式 2
        3. 2.4.3.3. 坐标图
      4. 2.4.4. 通用定时器 PWM 输出实验配置步骤
    5. 2.5. 通用定时器输入捕获实验
      1. 2.5.1. 通用定时器输入捕获部分框图介绍(熟悉)
        1. 2.5.1.1. 捕获/比较通道的输入部分(通道 1)
        2. 2.5.1.2. 捕获/比较通道 1 的主电路—输入部分
      2. 2.5.2. 通用定时器输入捕获脉宽测量原理
      3. 2.5.3. 通用定时器输入捕获实验配置步骤
        1. 2.5.3.1. 相关 HAL 库函数介绍
        2. 2.5.3.2. 关键结构体(HAL_TIM_IC_ConfigChannel)

stm32-定时器

- Date:2023-07-18

  • Time:19:32
  • Subject: none
  • Tags: #stm32 #定时器
    [[2023-07]]

软件定时原理

Pasted image 20230718193416|500

定时器定时原理

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

STM32 定时器分类

Pasted image 20230718193851|500

定时器特性表

F1

Pasted image 20230718193908|500
8 个定时器,可以计数 0-65535 数,

STM32 基本,通用,高级功能整体区

Pasted image 20230718194641|500

- Date:2023-07-18

  • Time:19:47
  • Subject: none
  • Tags: #stm32 #定时器
    [[2023-07]]

基本定时器简介(了解)

  1. 基本定时器 TIM6 TIM7
  2. 16 位递增计数器(计数值:0~65535)
  3. 16 位预分频器(分频系数:1~65536)
    1. 因此设置为 0 的时候为 1 分频,1 为 2 分频
  4. 可用于触发 DAC
  5. 在更新事件(计数器溢出)时,会产生中断/DMA 请求

基本定时器框图(熟悉)

Pasted image 20230718195107|500
经过 psc 得到计数器的工作频率,来一个时钟就加一
溢出条件,计数到影子寄存器里面的数字,psc 和自动重转载寄存器都有影子,不能直接访问影子,但是起作用的就是影子,得产生一个事件的时候会把重装载值放到影子里面
u 事件:update,更新事件,可以产生中断和 mda(需要配置,默认不产生),默认产生更新事件,将预装载的寄存器值(psc,自动重装载寄存器)加载到影子,然后起作用

定时器计数模式及溢出条件(熟悉)

Pasted image 20230718205238|500

实例

递增模式

Pasted image 20230718222029|500
psc=1,arr=36

递减模式

Pasted image 20230718223659|500

中心对齐模式

Pasted image 20230718223715|500
psc=0,arr=6
CNT=ARR-1=5、CNT=1
类似斯密特触发器的感觉
递增时溢出,上溢
递减时溢出,下溢

定时器中断实验相关寄存器(了解)

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

Pasted image 20230718233653|500
没有缓存,直接就改(减少操作寄存器的误差,需要一些时间)
有缓存,当触发事件的时候才会更改

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

Pasted image 20230718234437|500
用于使能更新中断

TIM6 和 TIM7 状态寄存器(TIMx_SR)

Pasted image 20230718234511|500
用于判断是否发生了更新中断,由硬件置 1,软件清零

TIM6 和 TIM7 计数器(TIMx_CNT)

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

TIM6 和 TIM7 预分频器(TIMx_PSC)

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

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

Pasted image 20230718234613|500
用于设置自动重装载值,范围:0~65535

定时器溢出时间计算方法(掌握)

Pasted image 20230718234751|500
Tout是定时器溢出时间
Ft是定时器的时钟源频率(未分频)
ARR 是自动重装载寄存器的值
PSC 是预分频器寄存器的值

定时器中断实验配置步骤(掌握)

#配置

  1. 配置定时器基础工作参数
    1. HAL_TIM_Base_Init()
  2. 定时器基础 MSP 初始化
    1. HAL_TIM_Base_MspInit()     配置 NVIC、CLOCK 等
  3. 使能更新中断并启动计数器
    1. HAL_TIM_Base_Start_IT()放在 init 里面
  4. 设置优先级,使能中断(msp_init 里面写)
    1. HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
  5. 编写中断服务函数
    1. TIMx_IRQHandler() (.s 文件里面找到)等->HAL_TIM_IRQHandler()
  6. 编写定时器更新中断回调函数 1. HAL_TIM_PeriodElapsedCallback()(空函数,自己去重定义)
    Pasted image 20230719090532|500

关键结构体介绍

1
2
3
4
5
6
typedef struct
{
    TIM_TypeDef *Instance;            /* 外设寄存器基地址 */
    TIM_Base_InitTypeDef Init;     /* 定时器初始化结构体*/
     ...
}TIM_HandleTypeDef;
1
2
3
4
5
6
7
8
9
typedef struct
{
    uint32_t Prescaler;                      /* 预分频系数PSC */
    uint32_t CounterMode;             /* 计数模式(基本定时器无效) */
    uint32_t Period;                           /* 自动重载值 ARR */
    uint32_t ClockDivision;             /* 时钟分频因子(基本定时器无效) */
    uint32_t RepetitionCounter;   /* 重复计数器寄存器的值(高级才用用) */
    uint32_t AutoReloadPreload; /* 自动重载预装载使能 */
} TIM_Base_InitTypeDef;

编程实战:定时器中断实验(掌握)

- Date:2023-07-19

  • Time:10:06
  • Subject: none
  • Tags: #stm32#定时器
    [[2023-07]]

通用定时器简介

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

通用定时器框图

Pasted image 20230719105107|500
触发时可到 itr0 的地方作为其他时钟的时钟源(级联)
输入捕获可以用于测量脉冲时间
写入比较值,计数器的值和影子的比较后,产生比较事件 occ1l(也会有比较中断)
左右两边的 ch 通道是分时复用

计数器时钟源

#时钟
Pasted image 20230720095902|500
通道一是双边沿检测,上升和下降沿都检测,检测两个
TI1FP1/2 经过边沿检测器,只能选择上升或者下降的,记一个数
ITR 用于级联,其他触发的事件进而作为时钟源
Pasted image 20230720103046|500
Pasted image 20230720103054|500
Pasted image 20230720103103|500
Pasted image 20230720103257|500

通用定时器 PWM 输出

#pwm

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

Pasted image 20230720111001|500

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

Pasted image 20230720111039|500

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

Pasted image 20230720111101|500
不同的通道,可以输出不同占空比的 pwm 波,可以配置某个 io 口为通道 1/2/3/4 的输出输入口,从而达到效果

通用定时器输出 PWM 原理

Pasted image 20230720111133|500
假设:递增计数模式
ARR:自动重装载寄存器的值
CCRx:捕获/比较寄存器 x 的值
当 CNT < CCRx,IO 输出 0
当 CNT >= CCRx,IO 输出 1
PWM 波周期或频率由 ARR 决定,PWM 波占空比由 CCRx 决定

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 低电平有效

坐标图

Pasted image 20230720111824|500

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

#配置

  1. 配置定时器基础工作参数,初始化函数内(自己定义一个函数,然后把下面的函数放里面)
    1. HAL_TIM_PWM_Init()
  2. 定时器 PWM 输出 MSP 初始化
    1. HAL_TIM_PWM_MspInit()     配置 NVIC、CLOCK、GPIO 等
  3. 配置 PWM 模式/比较值等(这个主要来看)在初始化函数里面写
    1. HAL_TIM_PWM_ConfigChannel()
  4. 使能输出并启动计数器 在初始化函数里面写
    1. HAL_TIM_PWM_Start()
  5. 修改比较值控制占空比(可选)
    1. __ HAL_TIM_SET_COMPARE()(宏)
  6. 使能通道预装载(可选) 1. __ HAL_TIM_ENABLE_OCxPRELOAD()(宏)
    设置句柄,定义句柄钟的初始化结构体和基地址,看基本的定时器
    Pasted image 20230720112341|500
1
2
3
4
5
6
7
8
9
10
typedef struct
{
   uint32_t OCMode;     /* 输出比较模式选择 8钟 */
   uint32_t Pulse;               /* 设置比较值 CCRX */
   uint32_t OCPolarity;       /* 设置输出比较极性 CCXP*/
   uint32_t OCNPolarity;    /* 设置互补输出比较极性(高级定时器才有tim1 8) */
   uint32_t OCFastMode;   /* 使能或失能输出比较快速模式(少用) */
   uint32_t OCIdleState;     /* 空闲状态下OC1输出 (高级里的互补输出)*/
   uint32_t OCNIdleState;  /* 空闲状态下OC1N输出 (高级里的互补输出) */
} TIM_OC_InitTypeDef;

通用定时器输入捕获实验

通用定时器输入捕获部分框图介绍(熟悉)

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

Pasted image 20230722113040|500

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

Pasted image 20230722113108|500
cc1g 软件产生捕获
cc1e 硬件检测捕获

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

Pasted image 20230722113631|500
以捕获测量高电平脉宽为例,纵坐标为计数器的值,横坐标事件
假设:递增计数模式
ARR:自动重装载寄存器的值
CCRx1:t1 时间点 CCRx 的值(设置为上升沿,吧检测到的时间的计数存到 ccrx,接着清零,然后设置下降沿检测)
CCRx2:t2 时间点 CCRx 的值
高电平期间,计时器计数的个数:N * (ARR+1) + CCRx2
先算出计数频率是 Ft/(psc+1)再取倒数为记一个数的时间,然后乘以上面的总个数即可

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

#配置

  1. 配置定时器基础工作参数(在 gtim_timx_cap_chy_init 里,需要提前配置定时器句柄,外部设置
    1. HAL_TIM_IC_Init()
  2. 定时器输入捕获 MSP 初始化(重定义 HAL_TIM_IC_MspInit
    1. HAL_TIM_IC_MspInit()     配置 NVIC、CLOCK、GPIO 等
  3. 配置输入通道映射、捕获边沿等(在 gtim_timx_cap_chy_init 里,在内设置 ic 通道句柄
    1. HAL_TIM_IC_ConfigChannel()
  4. 设置优先级,使能中断(在 msp 里面
    1. HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
  5. 使能定时器更新中断(宏)(在自己定义的 gtim_timx_cap_chy_init 里
    1. __ HAL_TIM_ENABLE_IT()
  6. 使能捕获、捕获中断及计数器(在 gtim_timx_cap_chy_init
    1. HAL_TIM_IC_Start_IT()
  7. 编写中断服务函数(r 如 TIM5_IRQHandler(.s 里面找),再把它 define 为 GTIM_TIMX_CAP_IRQHandler
    1. TIMx_IRQHandler()等   -> HAL_TIM_IRQHandler()
  8. 编写更新中断和捕获回调函数(重新定义下面两个
    1. HAL_TIM_PeriodElapsedCallback() HAL_TIM_IC_CaptureCallback()

相关 HAL 库函数介绍

Pasted image 20230722115254|500

关键结构体(HAL_TIM_IC_ConfigChannel)

1
2
3
4
5
6
7
typedef struct
{
    uint32_t ICPolarity;    /* 输入捕获触发方式选择,比如上升、下降沿捕获 */
    uint32_t ICSelection; /* 输入捕获选择,用于设置映射关系 */
    uint32_t ICPrescaler; /* 输入捕获分频系数(几次上升沿触发一次捕获事件) */
    uint32_t ICFilter;         /* 输入捕获滤波器设置 */
} TIM_IC_InitTypeDef;