- 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;