TIM 高级控制定时器是STM32系列比较复杂的外设。可以说是一个分水岭
通过阅读这个模块,你甚至可以窥探到IC的外设为何要如此设计,因为它是满足应用层的需求。
内部的信号流动和逻辑关系是TIM的关键。
面对如此复杂的外设,只能先从全局入手,再去看内部模块的构成。最后去看分解的子模块逻辑时序关系。


向下的箭头表示产生更新事件,向上的箭头代表 中断和DMA输出
TIM1 主要有几个部分组成
1.时钟输入
2.信号输入
3.一个16位向上/下计数器
4.输入处理单元(边沿检测,滤波,分频)
5.捕获比较
6,输出单元
时钟配置
1.时钟输入
来自时钟树总线的时钟CK_INT 内部时钟
来自外部输入引脚的ETR
来自内部的触发输入ITR->TRC
来自外部的TIx引脚输入

CNT 计数器的时钟来源还经过PSC分频器。
寄存器SMCR slave mode control register

从模式选择器SMS,为什么叫做从模式,主要是看框图,他是时钟输入的选择器。
直接由CK_INT提供计数器的时钟
下面代码按照分频系数7200
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_PrescalerConfig(TIM1, 7200, TIM_PSCReloadMode_Immediate);
TIM_Cmd(TIM1,ENABLE);
从模式寄存器默认为0.
TRGI信号都有SMS管理。CEN Counter Enable 。

上图最左边为输入TI2,下图可以可以看到它的来源。也就是说可以使用TIM 两个通道的输入信号来驱动CNT。
例如,要使递增计数器在 TI2 输入出现上升沿时计数,请执行以下步骤:
- 通过在 TIMx_CCMR1 寄存器中写入 CC2S =“01”来配置通道 2,使其能够检测 TI2输入的上升沿。
- 通过在 TIMx_CCMR1 寄存器中写入 IC2F[3:0] 位来配置输入滤波时间(如果不需要任何滤波,请保持 IC2F=0000)。
- 通过在 TIMx_CCER 寄存器中写入 CC2P=0 和 CC2NP=0 来选择上升沿极性。
- 通过在 TIMx_SMCR 寄存器中写入 SMS=111,使定时器在外部时钟模式 1 下工作。
- 通过在 TIMx_SMCR 寄存器中写入 TS=110 来选择 TI2 作为触发输入源。
- 通过在 TIMx_CR1 寄存器中写入 CEN=1 来使能计数器。
官方手册上对于时钟的配置步骤如上
.CCMR capture/compare mode register
-
通过在 TIMx_CCMR1 寄存器中写入 CC2S =“01”来配置通道 2,使其能够检测 TI2输入的上升沿。
CC2为输入模式

IC2 映射到TI2上,如下图所示

通过在 TIMx_CCER 寄存器中写入 CC2P=0 和 CC2NP=0 来选择上升沿极性。 -
刚才配置的是输入
所以OC1,OC1N都是高电平有效。



-
通过在 TIMx_SMCR 寄存器中写入 TS=110 来选择 TI2 作为触发输入源。

6。CEN=1 使能计数器

2.外部时钟模式



这种模式下的信号通路图。
该种方法比较简单在SMCR寄存器的几个控制位就可以配置完成。
1.配置使能 ECE=1
2.配置滤波器000
3.预分频配置
4.跳边沿记性配置
5.使能CNT
计数方式
向上
重点------------事件
在递增计数模式下,计数器从 0 计数到自动重载值( TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事件。
如果使用重复计数器,则当递增计数的重复次数达到重复计数器寄存器中编程的次数加一次(TIMx_RCR+1) 后,将生成更新事件
(UEV)。否则,将在每次计数器上溢时产生更新事件。
上溢事件 和 更新事件
通过软件将 TIMx_CR1 寄存器中的 UDIS 位置 1 可禁止 UEV 事件。
发生更新事件时,将更新所有寄存器且将更新标志( TIMx_SR 寄存器中的 UIF 位)置 1(取
决于 URS 位):
● 重复计数器中将重新装载 TIMx_RCR 寄存器的内容
● 自动重载影子寄存器将以预装载值 (TIMx_ARR) 进行更新
● 预分频器的缓冲区中将重新装载预装载值( TIMx_PSC 寄存器的内容)

重复计数器可以产生UI中断
递减计数模式
在递减计数模式下,计数器从自动重载值( TIMx_ARR 寄存器的内容)开始递减计数到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。
此外,如果 TIMx_CR1 寄存器中的 URS 位(更新请求选择)已置 1,则将 UG 位置 1 会生
成更新事件 UEV,但不会将 UIF 标志置 1(因此,不会发送任何中断或 DMA 请求)。这样
一来,如果在发生捕获事件时将计数器清零,将不会同时产生更新中断和捕获中断。
中心对齐模式(递增/递减计数)
在中心对齐模式下,计数器从 0 开始计数到自动重载值( TIMx_ARR 寄存器的内容) — 1,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从0 开始重新计数。
重复计数器
只有当重复计数器达到零时,才会生成更新事件。
重复计数器在下列情况下递减:
● 递增计数模式下的每个计数器上溢。
● 递减计数模式下的每个计数器下溢。
● 中心对齐模式下每个计数器上溢和计数器下溢。尽管这使得最大重复次数不超过 128 个
PWM 周期,但在每个 PWM 周期内可更新占空比两次。当在中心对齐模式下,每个
PWM 周期仅刷新一次比较寄存器时,由于模式的对称性,最大分辨率为 2xTck。
上溢事件,或者下溢事件产生后,重复计数器才会递减。上溢或者下溢事件的产生是应为ARR的开启
练习(1)
时钟分频,上溢事件,重复计数更新事件,中断产生
168M/50400 = 3333.33
void app_tim_train1(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel =TIM1_UP_TIM10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =3;
NVIC_InitStruct.NVIC_IRQChannelSubPriority =0;
NVIC_Init(&NVIC_InitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_PrescalerConfig(TIM1,50400,TIM_PSCReloadMode_Immediate);
TIM_SetAutoreload(TIM1,3333);
TIM1->RCR = 3;
TIM_ARRPreloadConfig(TIM1, ENABLE);
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
TIM

本文深入探讨STM32的TIM高级控制定时器模块,包括时钟配置、捕获/比较通道工作原理及PWM信号生成等内容。通过具体实例演示如何配置定时器实现不同功能。

5184

被折叠的 条评论
为什么被折叠?



