前言
本篇博客主要学习了解定时器的基本结构和工作原理,掌握定时器的驱动程序和设计。本篇博客大部分是自己收集和整理,如有侵权请联系我删除。
本次博客板子使用的是正点原子精英版,芯片是STM32F103ZET6,需要资料可以@我拿取。
本博客内容原创,创作不易,转载请注明
————————————————
一. TIM定时器介绍
- 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
- 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
- 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
- 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
本篇博客不介绍寄存器和时序,因为针对新手,首先得学会了解基本概念和使用即可,后期自己深入了再看手册了解难度也不是很大。
二. TIM定时器简介
主要是对输入的时钟进行计数,并在计数值达到设定值的时候触发中断(定时器触发中断)
在STM32中,定时器分为:高级定时器(TIM1,TIM8),通用定时器(TIM2/3/4/5),基本定时器(TIM6/TIM7)
本次博客我们主要针对基本和通用定时器进行介绍,高级定时器通过手册简略了解即可,如有不懂的需要自己去看看《STM32 参考手册》,定时器的介绍占了 1/5 的篇幅,足见其重要性。
三. 基本定时器(TIM6/TIM7)
1.TIM6和TIM7简介以及特性
1)基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。
2.TIM6和TIM7的主要特性
3.基本定时器框图和介绍
4.基本定时器时钟选择
- 计数器的时钟由内部时钟(CK_INT)提供。
- TIMx_CR1寄存器的CEN位和TIMx_EGR寄存器的UG位是实际的控制位,(除了UG位被自动清
- 除外)只能通过软件改变它们。一旦置CEN位为’1’,内部时钟即向预分频器提供时钟。
-
TIM6 /7 在APB1总线上,按工程默认时钟配置TIM6 /7的时钟是72M
除非APB1的分配系数是1,否则基本定时器和通用定时器的时钟都是等于APB1的2倍
5.基本定时器功能介绍
- 一般做定时中断使用,或者定时事件
- 主模式触发DAC的功能
-
主模式触发DAC:
让内部的硬件在不受控制的条件下实现自动运行,当我们需要DAC来测试电压点的时候,就可以通过更新事件来映射到TRGO的DAC上,实现定时触发DAC的功能,避免通过更新中断频繁触发DAC。还可以为模数转换器(DAC)提供时钟,即在芯片内部直接连接到ADC并通过触发输出直接驱动ADC
四 . 通用定时器(TIM2/3/4/5)
1.TIM2/3/4/5简介
- 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。
- 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和
- PWM)。
- 使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。
- 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。
2.TIM2/3/4/5主要功能
- ● 16位向上、向下、向上/向下自动装载计数器
- ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
- 数值
- ● 4个独立通道:
- ─ 输入捕获
- ─ 输出比较
- ─ PWM生成(边缘或中间对齐模式)
- ─ 单脉冲模式输出
- ● 使用外部信号控制定时器和定时器互连的同步电路
- ● 如下事件发生时产生中断/DMA:
- ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
- ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
- ─ 输入捕获
- ─ 输出比较
- ● 支持针对定位的增量(正交)编码器和霍尔传感器电路
- ● 触发输入作为外部时钟或者按周期的电流管理
3.通用定时器框图和介绍
4.通用定时器时钟选择
- 计数器时钟可由下列时钟源提供:
- 内部时钟(CK_INT)
- 外部时钟模式1:外部输入脚(TIx)
- 外部时钟模式2:外部触发输入(ETR)
- 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时 器Timer1而作为另一个定时器Timer2的预分频器。
5.通用定时器功能介绍
- 拥有基本定时器的所有功能,如定时中断,主模式触发DAC。
- 拥有内外时钟源选择,不了解系统时钟的可以看看我之前的博客:STM32+内部时钟树详解.
- 输入捕获:可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,通常用于测量输入信号的脉宽、测量 PWM 输入信号的频率及占空比。
- 输出比较:输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形 。
- 编码器接口:STM32提供的编码器接口模式主要针对的就是“正交编码器”,它可以利用定时器的“计数”功能,得出编码器计了多少个脉冲;同时,它可以根据编码器AB的相位得出编码器是正转,还是反转。一般和电机配合工作,了解即可
五 .高级定时器(TIM1,TIM8)
1.TIM1和TIM8简介
- 高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。
- 它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、 PWM、嵌入死区时间的互补PWM等)。
- 使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
- 高级控制定时器(TIM1和TIM8)和通用定时器(TIMx)是完全独立的,它们不共享任何资源。它们 可以同步操作,
2.TIM1和TIM8主要特性
- 16位向上、向下、向上/下自动装载计数器
- ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意
- 数值
- ● 多达4个独立通道:
- ─ 输入捕获
- ─ 输出比较
- ─ PWM生成(边缘或中间对齐模式)
- ─ 单脉冲模式输出
- ● 死区时间可编程的互补输出
- ● 使用外部信号控制定时器和定时器互联的同步电路
- ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器
- ● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
- ● 如下事件发生时产生中断/DMA:
- ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
- ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
- ─ 输入捕获
- ─ 输出比较
- ─ 刹车信号输入
- ● 支持针对定位的增量(正交)编码器和霍尔传感器电路
- ● 触发输入作为外部时钟或者按周期的电流管理
3.高级定时器框图和介绍
4.高级定时器时钟选择
- 计数器时钟可由下列时钟源提供:
- 内部时钟(CK_INT)
- 外部时钟模式1:外部输入脚(TIx)
- 外部时钟模式2:外部触发输入(ETR)
- 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时 器Timer1而作为另一个定时器Timer2的预分频器。
5.高级定时器功能介绍
- 拥有通用定时器的全部功能
- 有额外的重复计数器,在原本最大支持定时59S的基础上*65536(为三相无刷电机设计)
- 死区生成(互补的PWM波):系统框图中设计了DTG死区生成电路。主要目的是为了驱动三相无刷电机,因为驱动三相无刷电机需要三个桥臂*2个大功率开关控制。在通过开关切换的时候,可能由于硬件器件的限制,会造成短暂的直通现象,所以该设计是为了生成一定的死区时间,让桥臂上下管关闭,防止直通现象的发生。
- 刹车输入:为电机设计,主要是为了防止内部时钟死机或者刹车失效,对电机生成刹车型号,切断电机的输出,保护电机不受损坏。
- 为电机设计的了解即可,新手不用深究
六.定时器时基单元和时序:
● 预分频寄存器(TIMx_PSC):软件设置的分频系数+1 = 实际的分配系数
● 计数器寄存器(TIMx_CNT)
1)顾名思义,这就是一个计数的寄存器,在分频之后,每一个周期结束计数+1,因为也是一个16位的寄存器,所以它的范围也是在1-35536之间。
2)16位计数器从0累加计数到自动重装载数值(TIMx_ARR寄存器),然后重新从0开始计数并产生一个计数器溢出事件。
● 自动重装载寄存器(TIMx_ARR)
1)当计数器和自动重装载寄存器相等时,就会触发更新中断,该寄存器是一个16位的,最大65536。
2)当触发中断后,就会更新数值,重新进行下一次判断,依次循环
3)决定计数器一个周期计数的次数,即定时器的周期,它也有缓冲器,即影子寄存器
所以我们在使用定时器的时候,就需要设置预分频系数和重装载值来确定需要更新中断的时间
当开启影子寄存器时,只有在每次更新事件发生时,影子寄存器的值才更新为自动重装载寄存器中的值,重装载影子寄存器可以开,也可以关.但是,预分频寄存器的影子寄存器是不可以关掉的,它是一直开启的.
时钟选择详解:
外部时钟的作用基本就是通过检测外部的脉冲来进行计时,可根据实际应用来了解。例如编码器,按键次数执行对应操作都可以
内部时钟源(CK_INT):
来自RCC的TIMx_CLK,即定时器本身的驱动时钟。
通用定时器的内部时钟来源于APB1总线时钟,但是通用定时器的内部时钟是根据APB1总线时钟是否分频来决定的,如果APB1总线时钟预分频系数为1,则通用定时器的内部时钟就是APB1总线时钟;但是如果APB1总线时钟的分频系数为2,则通用定时器的内部时钟就是APB1总线时钟的2倍。
外部时钟模式1:外部输入引脚
来自定时器自身输入通道1或通道2的输入信号,经过极性选择和滤波以后生成的触发信号,连接到从模式控制器,进而控制计数器的工作;
来自通道1的输入信号经过上升沿、下降沿双沿检测而生成的脉冲信号进行逻辑相或以后的信号就是TI1F_ED信号,即TI1F_ED双沿脉冲信号。
外部时钟模式2:外部触发输入ETR
来自于 外部触发脚[ETR脚] 经过极性选择、分频、滤波以后的信号,经过触发输入选择器,连接到从模式控制器。当然分频和滤波不是必需的,可以根据外来信号频率高低及信号干净度来决定。
ETR功能较全可以完成T1的工作但仅限于CH1通道,可以进行分频
内部触发输入(ITRx):
一般跟定时器级联有关系,增加定时时间(了解即可)
时钟源:
预分频器时序
- 计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)
- 计数器从0累加计数到自动重装载数值(TIMx_ARR寄存器),然后重新从0开始计数并产生一个计数器溢出事件。
- CK_PSC=72M
计数器时序
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)= CK_PSC / (PSC + 1) / (ARR + 1)
计算中断时间:
定时器实现定时时间:
总结:
以上就是STM32定时器的简略教程,关于定时器的讲解手册讲了很多,但是对应入门的来说,我们得先了解他的作用和概念,学会使用为前提,所以如果需要更加深入就需要对照手册来了解了。接下来几篇博客将会介绍定时器中断,PWM和输入捕获,会教使用和代码,欢迎各位交流
点赞收藏关注双击博主,不定期分享单片机知识,互相学习交流。
————————————————