TIM定时器主要有四个功能 这篇文章阐述第一个功能
- 基本定时功能 用在 时钟 秒表 程序算法
- 输出比较 用途:产生PWM波形,用于驱动电机等设备
- 定时器输入捕获
- 编码器 读取正交编码器的输出波形
01.TIM的介绍
TIM是英文Timer的缩写,能干嘛呢? 可以对输入的时钟进行计数,在计数值达到设定值时触发中断。这 这这不纯纯计数器吗?答案是肯定的,当这个计数器的输入是基准时钟时,在计数的过程中,就是计时的过程。
想象一下,如果对stm32的基准时钟频率72MHZ,计72个数,那么就用掉了,这个式子什么意思呢简单来说就是在72MHZ频率的下计72个数所用的时间是,同理,如果在同样主频下计72000个数,那就是1ms的时间。
在stm32中有16位计数器、预分频器、自动重装寄存器单元,在主频下最大可以实现的定时。
计数器是用来执行计数定时的一个寄存器,每来一个时钟,计数器就。
预分频器,对计数器的时钟进行分频。
自动重装寄存器就是计数的目标值 ,也就是想要多少个时钟申请一下中断。
还有一个问题 这个定时器的最大定时时间是怎么来的呢?
因为在stm32中 计数器 预分频器 和自动重装寄存器 都是位的即,我们将它们都设置为最大即,得到中断频率,再取倒数就是时间值。
02.定时器类型
注意 定时器的编号 和它对应所属于的总线 在开启时钟的时候要用
定时器结构图
基本定时器
预分频器 计数器 和自动重装寄存器构成了 时基单元。
基本定时器有定时中断,主动触发DAC的功能。预分频器之前,连接都是基准计数时钟的输入为,首先经过预分频器,对时钟进行预分配,若PSC写0 表示不分频 输出则为,如果预分频器写则是分频 输出为,以此类推 即 实际分频系数=预分频器值+1,最大值为65535。
计数值=自动重装值 产生中断,产生的中断称为 更新中断(Update interrupt)。更新中断后通往NVIC,进而得到CPU的响应。
基本定时器工作流程:从基准时钟,到预分频器,再到计数器,计数器自增同时不断和自动重装寄存器进行比较,计时相等时产生更新中断中断和更新事件
通用定时器
通用定时器和基本定时器相比
1.定时器模式不同 通用定时器支持向上计数,向下计数,中央对齐等三种模式
2.时钟源选择不同,通用可以选择 内部时钟和外部时钟
03.定时中断基本结构图
根据基本结构图定时器中断开启的步骤如下:
- RCC开启时钟,定时器基准时钟和外设的工作时钟都会同时打开
- 选择时基单元的时钟源,对于定时中断就选择内部时钟源
- 配置时基单元
- 配置输出中断控制,运行更新中断输出到NVIC
- 配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
- 运行控制 使能计数器,使能之后 计数器开始计数
- 定时器更新触发中断
04.预分频器时序
计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)
05.计数器时序
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1) = CK_PSC / (PSC + 1) / (ARR + 1)
06.RCC时钟树
三种不同的时钟源可被用来驱动系统时钟(SYSCLK):
● HSI振荡器时钟
● HSE振荡器时钟
● PLL时钟
这些设备有以下2种二级时钟源:
● 40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。
● 32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。
用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。AHB和APB2域的最大频率是72MHz。APB1域的最大允许频率是36MHz。SDIO接口的时钟频率固定为HCLK/2。
RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。ADC时钟由高速APB2时钟经2、4、6或8分频后获得。
定时器时钟频率分配由硬件按以下2种情况自动设置:
1.如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。
2.否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。