STM32: TIM定时器触发模式与时基发生器

STM 32 各种类型定时器一览表

定时器 作用
通用定时器 可用于输出比较(时序和延迟生成)单脉冲模式输入捕捉(用于测量外部信号频率)传感器接口(编码器和霍尔传感器)等各种场合。
高级定时器 此类定时器的功能最多。除通用功能外,它们还包含一些与电机控制数字能量转换应用相关的功能:三个带死区控制的互补信号以及紧急关断输入
单通道或双通道定时器 用作通用定时器,通道数有限。
带互补输出的单通道或双通道定时器 与上一类型相同,只是其中一个通道上具有死区发生器。这样可得到时基与高级定时器无关的互补信号
基本定时器 没有任何输入/输出,既可用作时基定时器,也可用于触发 DAC 外设

STM32: TIM定时器触发模式与时基发生器_第1张图片

基本定时器模式

STM32: TIM定时器触发模式与时基发生器_第2张图片

STM32: TIM定时器触发模式与时基发生器_第3张图片
STM32: TIM定时器触发模式与时基发生器_第4张图片
STM32: TIM定时器触发模式与时基发生器_第5张图片
通过查看关于TIM的文档,我们发现STM32f103基本定时器为TIM6和TIM7并且挂载在APB1上.

  1. 定时器时钟 TIMxCLK,即内部时钟 CK_INT,经 APB1 预分频器后分频提供,如果 APB1 预分频
    系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M,
    所以定时器时钟 TIMxCLK=36*2=72M。

  2. 计数器时钟
    定时器时钟经过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数。PSC 是一个 16 位的预
    分频器,可以对定时器时钟 TIMxCLK 进行 1~65536 之间的任何一个数进行分频。具体计算方式
    为:CK_CNT=TIMxCLK/(PSC+1)。

  3. 计数器
    计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装
    载寄存器的时候产生更新事件,并清零从头开始计数。

  4. 自动重装载寄存器
    自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到
    这个值的时候,如果使能了中断的话,定时器就产生溢出中断。

  5. 定时时间的计算
    定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 CK_CNT 的驱动下,计一
    个数的时间则是 CK_CLK 的倒数,等于:1/(TIMxCLK/(PSC+1)),产生一次中断的时间则等于:1/(CK_CLK * ARR)。如果在中断服务程序里面设置一个变量 time,用来记录中断的次数,那么就可以计算出我们需要的定时时间等于:1/CK_CLK* (ARR+1)*time。

TIM_TimeBaseInitTypeDef初始化结构体

typedef struct { 
 uint16_t TIM_Prescaler; // 预分频器
 uint16_t TIM_CounterMode; // 计数模式
 uint32_t TIM_Period; // 定时器周期
 uint16_t TIM_ClockDivision; // 时钟分频
 uint8_t TIM_RepetitionCounter; // 重复计算器
 } TIM_TimeBaseInitTypeDef;

(1) TIM_Prescaler:定时器预分频器设置,时钟源经该预分频器才是定时器时钟,它设定TIMx_PSC
寄存器的值。可设置范围为 0 至 65535,实现 1 至 65536 分频。
(2) TIM_CounterMode:定时器计数方式,可是在为向上计数、向下计数以及三种中心对齐模式。
基本定时器只能是向上计数,即 TIMx_CNT 只能从 0 开始递增,并且无需初始化。
(3) TIM_Period:定时器周期,实际就是设定自动重载寄存器的值,在事件生成时更新到影子寄
存器。可设置范围为 0 至 65535。
(4) TIM_ClockDivision:时钟分频,设置定时器时钟 CK_INT 频率与数字滤波器采样时钟频率分
频比,基本定时器没有此功能,不用设置。
(5) TIM_RepetitionCounter:重复计数器,属于高级控制寄存器专用寄存器位,利用它可以非常容
易控制输出 PWM 的个数。这里不用设置。

时钟输入源

定时器可同时与多个时钟同步:

内部时钟 :
默认情况下,定时器由 RCC 提供的内部时钟驱动。要选择该时钟源,应该将 SMCR_SMS
(如果存在)位复位。

外部时钟

外部时钟模式 1(TI1 或 TI2 引脚)
外部时钟模式 2(ETR 引脚)
内部触发时钟 (ITRx)

外部时钟将施加到定时器的输入引脚 TI1 或 TI2 上

当外部时钟将施加到定时器的输入引脚 TI1 或 TI2 上,配置定时器将 TIx 引脚用作输入:

a) 通过对 TIMx_CCMR1 寄存器中的 CCxS 位执行写操作,选择要使用的引脚。
b) 选择输入的极性:
对于 STM32F10x 系列:通过对 TIMx_CCER 寄存器中的 CCxP 位执行写操作,选择上升沿触发或下降沿触发;选择上升/下降沿触发,或者边沿触发。
c) 根据需要,通过对 TIMx_CCMR1 寄存器中的 ICxF[3:0] 位执行写操作配置滤波器和预分频器:
通过对 TIMx_SMCR 寄存器的 TS 位执行写操作,将定时器 TIx 选为触发输入源。
通过对 TIMx_SMCR 寄存器写入 SMS=111 选择外部时钟模式 1。
通过将TIMx_CCER 寄存器中的 CCEx 位置 1 使能相应的通道。

2. 通过对 TIMx_SMCR 寄存器中的 TS 位执行写操作,将定时器 TIx 选为触发输入源。
3. 通过对 TIMx_SMCR 寄存器写入 SMS=111 选择外部时钟模式 1。

外部时钟模式 2(ETR 引脚)

外部时钟模式 2 将 ETR 引脚用作定时器输入时钟。要使用该功能:

  1. 通过对 TIMx_SMCR 寄存器写入 ECE = 1 选择外部时钟模式 2。
  2. 根据需要,通过对 TIMx_SMCR 寄存器中的 ETPS [1:0]、ETF [3:0] 和 ETP 位执行写操
    作配置预分频器、滤波器和极性。

内部触发时钟 (ITRx)

这是一个特殊的定时器同步模式。当将一个定时器用作另一个定时器的预分频器时,第一个
定时器的更新事件或输出比较信号将用作第二个定时器的时钟。

时基发生器

TIM可用作时基发生器。根据时钟、预分频器和自动重载、以及重复计数器(如果存在)的参数,16 位定时器可生成 1 纳秒到数分钟的更新事件。对于 32 位定时器,时间范围则更大。

更新事件周期

更新事件周期按如下公式计算:

Update_event = TIM_CLK/((PSC + 1)(ARR + 1)(RCR + 1))

TIM_CLK = 定时器时钟输入
PSC = 16 位预分频器寄存器(Prepare separate frequency control register)
ARR = 16/32 位自动重载寄存器 (Auto reload register)
RCR = 16 位重复计数器(Repeat count register)

TIM_CLK = 72 MHz
预分频比 = 1
自动重载值 = 65535
无重复计数器 RCR = 0
Update_event = 72*106/((1 + 1)*(65535 + 1)*(1))
Update_event = 549.3 Hz

外部时钟模式

外部时钟模式 2
在此模式下,更新事件周期按如下公式计算:

Update_event = ETR_CLK/((ETR_PSC)(PSC + 1)(ARR + 1)*(RCR + 1))

其中:ETR_CLK = 连接到 ETR 引脚的外部时钟频率。
ETR_CLK = 100 kHz
预分频比 = 1
ETR_PSC = 2
自动重载值 = 255
重复计数器 = 2
Update_event= 100103/((2 + 1) (1+ 1)((255 + 1)(2 + 1))
Update_event = 21.7 Hz

外部时钟模式 1
在此模式下,更新事件周期按如下公式计算:

Update_event = TIx_CLK/((PSC + 1)(ARR + 1)(RCR +1))

其中:TIx_CLK = 连接到 TI1 引脚或 TI2 引脚的外部时钟频率。
TIx_CLK = 50 kHz
预分频比 = 1
自动重载值 = 255
重复计数器 = 2
Update_event = 50 000/((1+ 1)((255 + 1)(2 + 1))
Update_event = 32.55 Hz

内部触发时钟 (ITRx) 模式 1

在此模式下,更新事件周期按如下公式计算:

Update_event = ITRx_CLK/((PSC + 1)(ARR + 1)(RCR + 1))

其中 ITRx_CLK = 映射到定时器触发输入 (TRGI) 的内部触发频率
ITRx_CLK = 8 kHz
预分频比 = 1
自动重载值 = 255
重复计数器 = 1
Update_event = 8000/((1+ 1)((255 + 1)(1 + 1))
Update_event = 7.8 Hz

根据计数器模式的不同,更新事件通常在以下情况产生:
● 每次上溢(如果使用递增计数模式):TIMx_CR1 寄存器中的 DIR 位复位
● 每次下溢(如果使用递减计数模式):TIMx_CR1 寄存器中的 DIR 位置 1
● 每次上溢和下溢(如果使用中心对齐模式):CMS 位不为零

生成更新事件:

● 通过软件生成更新事件(如果 TIM_EGR 寄存器中的 UG(更新生成)位置 1)。
● 通过从模式控制器生成更新事件
因为缓冲的寄存器(ARR、PSC 和 CCRx)需要一个装载预装载值的更新事件,因此将
URS(更新请求源)置 1 可避免每次装载这些值时触发更新标志位。这样,只有当计数器发
生上溢/下溢时才会生成更新事件。
此外,可以通过将 CR1 寄存器中的 UDIS(更新禁止)位置 1 以禁止更新事件。这样,便不
会生成更新事件,而各影子寄存器(ARR、PSC 和 CCRx)的值会保持不变。但如果将 UG
位置 1,或者从从模式控制器接收到硬件复位,则会重新初始化计数器和预分频器。
当 DIER 寄存器中的 UIE 位或/和 UDE 位置 1 时,会产生中断或/和 DMA 请求。

你可能感兴趣的:(STM32嵌入式,stm32,单片机,arm)