)
文章目录主要内容和实验定时器TIM介绍定时器分类基本定时器结构主模式触发DAC通用定时器多种计数模式多种时钟选择TRGO定时器的主模式输出输入和输出引脚电路高级定时器定时器结构总览STM32中功能最强大结构最复杂的外设摘要本文系统梳理 STM32 定时器TIM的核心原理与分类。首先介绍定时器的本质——一个对时钟进行计数的 16 位时基单元并给出最大定时时间的计算公式随后按功能强弱将定时器分为基本、通用、高级三类逐一讲解其结构差异基本定时器仅支持内部时钟与定时中断通用定时器扩展了多种计数模式、内外时钟源选择、输入捕获、输出比较与编码器接口高级定时器则额外具备重复计数、死区生成、互补输出与刹车输入等面向三相无刷电机的特性最后通过结构总览图串联三类定时器的共性与差异为后续代码实践打下基础。主要内容和实验基本定时功能每隔一定时间定时器产生一个中断定时器用内部时钟产生定时中断外部时钟驱动定时器定时器输出比较功能产生PWM波输入捕获功能以及主从触发模式测量方波频率定时器的编码器接口方便读取正交编码器的输出波形主要用于编码电机测速定时器TIM介绍定时器可以对输入的时钟内部时钟/外部时钟进行计数并在计数值达到设定值时触发中断。TIM的本质就是一个计数器。当这个计数器的输入是一个准确可靠的基准时钟的时候对这个时钟进行计数的过程就是一个计时的过程。STM32定时器拥有下面这些16位的时基单元计数器是一个寄存器。每来一个时钟计数器1预分频器对计数器用的时钟进行分频自动重装寄存器计数的目标值就是要计多少个时钟后申请中断在72MHz计数时钟下可以实现最大59.65s的定时。这个最大值的计算可以通过这个公式来做T m a x ( P S C m a x 1 ) × ( A R R m a x 1 ) f C K T_{max} \frac{(PSC_{max} 1)\times(ARR_{max} 1)}{f_{CK}}TmaxfCK(PSCmax1)×(ARRmax1)P S C m a x PSC_{max}PSCmax最大预分频值 65535实际分频数是PSC1A R R m a x ARR_{max}ARRmax最大自动重装寄存器值 65535 实际计数是 ARR1f C K f_{CK}fCK72MHz直观理解要知道最大的定时数值也就是要把分频数设置到最大让计数器加1最长的实际以及把重装的数值报中断的值设置到最大。最大预分频器把72MHz分成了72 ∗ 10 6 65536 ≈ 1098.63 H z \frac{72*10^6}{65536} \approx 1098.63Hz6553672∗106≈1098.63Hz也就是1/1098.63秒计数器加1。一共要 65536个计数之后产生中断也就是65536/1098.63 ~ 59.65s。简单来算其实是72 ∗ 10 6 ∗ 65536 2 72*10^6 * 65536^272∗106∗655362视频中有一段不得不记一下对于单个定时器最大定时时间只有一分钟左右但是STM32支持定时器级联可以把这个定时器作为下一个定时器的输入这样定时器就是72 ∗ 10 6 ∗ 65536 4 72*10^6 * 65536^472∗106∗655364八千多年报一次。。。如果还嫌短可以再级联一个那么就是72 ∗ 10 6 ∗ 65536 6 72*10^6 * 65536^672∗106∗655366这是一个大到可以丈量宇宙年龄的值指数爆炸的威力定时器分类定时器分类编号外设名总线说明高级定时器TIM1, TIM8APB2性能更高拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能位三相无刷电机设计通用定时器TIM2,TIM3,TIM4,TIM5APB1拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能基本定时器TIM6,TIM7APB1定时中断主模式触发DAC后面主要学习的是通用定时器定时器三个级别向下兼容STM32F103C8T6支持TIM1~TIM4也就是一个高级定时器和3个通用定时器基本定时器结构绿框部分是定时器的基本电路这一部分也称作“时基单元”。预分频器之前是时钟输入。基本定时器只能选择内部时钟所以这里可以认为红色的线直接连在了输入端也就是内部时钟CK_INT就是来自RCC_TIMxCLK这里的主频一般都是72MHz。所以通向时基单元的就是72MHz。实际分频系数是PSC寄存器的值1自动重装值ARR值是一个固定值。当CNT计数器等于ARR的值时就会产生中断并且CNT会被置0.输出向上箭头表示中断计数值自动重装值产生的中断被称作“更新中断”。这个信号会被MCU的NVIC接收。向下的箭头表示事件这里的事件被称作“更新事件”。事件不会触发中断但可以触发其他内部电路的工作。主模式触发DAC在RM中对于基本定时器有这样一段They may be used as generic timers for time-base generation but they are also specifically used to drive the digital-to-analog converter (DAC). In fact, the timers are internally connected to the DAC and are able to drive it through their trigger outputs.也就是说基本定时器有定时器的基本功能但它们其实时特别位DAC服务的。主从触发模式让内部硬件在不受程序的控制下实现自动运行。在有要用DAC输出一段波形的需求时没有主模式触发DAC的时候一般是用定时器中断定时器中断来了后在中断函数中触发一次DAC。这大概率可以工作但是会导致频繁进中断影响其他任务。而“主模式”的出现可以一定程度上解决这个问题利用把定时器的更新事件映射到TRGOtrigger output的位置而这个TRGO是直接连到DAC的这样就不需要通过频繁中断来触发DAC。通用定时器多种计数模式绿框部分还是时基单元基本定时器的计数只有增加而通用定时器和高级定时器的计数可以减小或者中央对齐自增模式计数器从0开始向上增长达到ARR的值之后产生中断并且计数器重置为0自减模式计数器从ARR的值开始向下自减减到0之后产生中断并且计数器重置为ARR中央对齐模式先从0开始向上自增达到ARR后产生中断然后开始自减减到0之后再产生中断。为什么要这三种模式只是定时产生中断似乎第一个就够了啊。确实如果只是定时中断的作用那一种就够了。TIM还有输出PWM的功能这个应用场景中就需要另外两种模式了。自增模式可以满足我们大部分的应用场景需求但是有的时候有些应用要求在周期开始的时候输出有效电平或者与其他事件同步这时候就需要自减模式了。自减模式提供了一种边沿对齐的方式让定时器更加灵活。中央对齐模式其实更加重要。用中央对齐模式产生的PWM波关于周期中心对称这带来很多边沿触发没有的优点谐波成分少、死区插入自然等等。而这具体会带来什么优势后面用到了再仔细研究。多种时钟选择红框是内外时钟源选择和主从触发模式的结构。红框是内外时钟源选择和主从触发模式的结构。 和基本定时器只能选择内部时钟源系统频率不同通用定时器还支持选择外部时钟。 复杂警告。。。 下图中的圆圈都是时钟源。其中最上面的圆圈标有72MHz的地方就是连到内部时钟源最常用。TIM_ETR其中ETR的意思是 external trigger它其实是一个pin脚。可以看引脚定义表格来找到哪些引脚可以作为TIM_ETR。这些引脚可以作连上一个时钟源产生定时脉冲。框图中被蓝绿色highlight的部分就是对外部时钟的处理极性选择、边沿检测和预分频电路以及滤波外部输入的时钟有时候有毛刺这些电路时对外部输入信号的整形。之后这个信号会被分成两路TIM_ETR可以作为任何一路被使用。一路ETRF直接进入触发控制器trigger controller这个时钟信号就直接被时基单元使用了这一路电路叫“外部时钟模式2”框图中总体用蓝色标注另一路进入一个选择器最为TRGI的一个选择。TRGI 触发输入这一路的作用是“触发输入”可以触发定时器的从模式如TRGI的右边这个部分应该后面会说。这里主要介绍的是它的左边。TRGI有多个来源ETR就是上面的TIM_ETR。ITR来自其他定时器。每个定时器可以通向TRGOTRGO可以被另一个定时器通过这个ITR来使用。这样实现定时器级联。如下是TIM2~TIM5的内部触发连接表格。其实高级和通用定时器都有这个表格在它们描述“slave control mode register”的章节中级联模式举例比如选择TIM3和TIM2级联用TIM3的更新事件驱动TIM2的时基单元a. 初始化TIM3,把它设置成主模式把它的更新事件U映射到TRGO上b. 初始化TIM2,选择ITR2,也就是TIM3的TRGO(如上面的表格所示Slave是TIM2)把它的时钟选择为“外部时钟模式1”TI1F_ED(Timer Input 1 Filtered Edge Detector)连接的是输入捕获单元的CH1引脚或是TIMx_CH1,TIMx_CH2,TIMx_CH3的XOR结果用于和无刷电机的应用中通过这三个channel的值来估计无刷电机的转速和位置。然后基于此来得到控制BLDC的信号。ED是“edge边沿”的意思也就是multiplexer输出的信号的上升沿或者下降沿都是“时钟信号”。TI1FP1和TI2FP2FP是filtered and plolarity 的意思其实这两路信号都是从TIM的CH1和CH2的 input filter edge detector模块输出的。这个模块的输出也有两个通道FP1和FP2。而TRGI只取了各自两个通道的其中之一。TI1FP1和TI1F_ED选择CH1引脚的不同就是前者可以选择边沿触发或者电平触发有极性选择后者是双边沿触发不能选择极性。总结外部时钟1模式的输入ETR引脚其他定时器CH1引脚边沿CH1和CH2引脚TRGO定时器的主模式输出把一些事件映射到TRGO上用于触发其他定时器、ADC和DAC输入和输出引脚电路电路总共分为两个部分有一部分电路是输入捕获电路和输出比较电路共用的。输入捕获和输出比较不能同时工作。高级定时器下图中的红色部分和通用定时器是一样的。重复次数计数器通过它可以实现隔多个周期之后才发生一次中断或者事件更新其他定时器没有这个模块每个周期都会产生一次中断或者事件更新。这就类似对每个输出的信号又做了一次分频。以下这些都是为了驱动三相无刷电机而设计的TIMx_CHy和TIMx_CHyN一对互补的输出。可以输出一对互补的PWM波。三项无刷电机只需要三路所以CH1~3是由互补的输出CH4没有。DTG(Dead Time Generator)死区生成电路。在开关切换的时候可能因为器件不理想导致短暂的直通现象桥臂上下都打开为了防止这个现象用死区生成电路产生一定时间的死区让峭壁上下管都关断防止直通现象。刹车输入给电机驱动提供安全保障。如果外部引脚BKINbreak in产生了刹车信号或者内部时钟失效等故障产生那么这一部分电路就会自动切断电机的输出防止意外发生。定时器结构总览上面已经基于RM里的内容把3种定时器的结构比较细致的说了一下。下面的图片是老师的PPT里的去掉了一些细节部分体现了通用定时器电路结构的骨架。不得不说这PPT和里面的内容真的是很好。运行控制寄存器操作这些寄存器就可以控制时基单元的运行时钟选择体现了4种时钟选择通用和高级定时器后面的代码会用到内部时钟和外部时钟模式2.编码器模式给编码器用的普通时钟用不到这个模式。中断输出控制中断信号会在状态寄存器里置一个标志位这个标志位会通过中断输出控制中断输出允许位再到NVIC申请中断。因为定时器中会产生很多事件比如计数器溢出/下溢/归零时产生的更新事件UEV从模式触发/外部触发捕获从CH1 ~ 4 输入的边沿输出比较刹车事件高级定时器编码器事件等它们各有自己的标志位。中断输出控制就是使能/禁止某些事件产生中断汇总多个事件上报给NVIC。由于一般一个定时器只有一个中断向量所以进入ISR后需要用TIM_GetITStatus 判断是哪个事件产生的中断。TIM_ITConfig这个function就是在配置中断输出控制。