TIM定时器定时中断

522 阅读11分钟

1.TIM简介

  • 为什么在72MHz计数时钟下可以实现最大59.65s的定时? 72M/65536/65536,得到的是中断频率,然后取倒数,就是59.65秒多 如果嫌定时时间不够长,stm32还支持级联一个定时器的输出当作另一个定时器的输入

  • 核心部分:计数器,预分频器,自动重装寄存器,构成了最基本时基单元

    • 16位计数器:执行计数定时的寄存器,每来一个时钟,计时器+1;
    • 预分频器: 可以让计数更加灵活,对计数器的时钟进行分频
    • 自动重装寄存器 :计数的目标值,计时想要计多少个时钟申请中断

2.类型

只需要知道TIM1~TIM8即可

  • 高级计数器相比于通用定时器,多出来的功能都是为了驱动三项无刷电机
  • 每一个定时器都是向下兼容的

3.基本定时器结构

  • CK_PSC :基准计数时钟输入

image.png

  • 由于基本寄存器只能选择内部时钟,所以可以直接认为中间连接的线直接接到了内部时钟 。内部时钟来自于RCC的TIM X CLK,频率值一般为系统主频72MHz。 (RCC是Reset and Clock Control (复位和时钟控制)的缩写,它是STM32内部的一个重要外设,负责管理各种时钟源和时钟分频,以及为各个外设提供时钟使能。RCC模块可以通过寄存器操作或者库函数来配置。)

image.png

  • 注:图上向上的折线箭头叫做更新中断(当计数值等于自动重装值时触发)。这个更新中断之后会通往NVIC,在配置好NVIC通道,那定时器的中断就会的到CPU的响应

  • 向下的箭头表示是更新事件更新事件不会触发中断,但是可以触发其他内部电路的工作。

  • 计数器计数自增,同时不断地与自动重装寄存器进行比较,他俩值相等时,即计时时间到,这时会产生一个更新中断和更新事件,CPU响应更新中断,就完成定时中断任务了。


4.通用定时器

image.png

  • 对于通用定时器来说,CNT计数器的计数模式不止,一种向上计数

    • 向上计数模式:计数器从0开始,向上自增,计到重装值,清0同时申请中断,然后开始下一轮,依次循环。(最常用)
    • 向下计数模式:从重装值开始,向下自减,减到0之后,回到重装值同时申请中断,然后继续下一轮,依次循环。
    • 中央对齐的计数模式:从0开始,先向上自增,计到重装值,申请中断,然后在向下自减,减到0,在申请中断,然后继续下一轮,依次循环。

image.png 上半部分为 ,内外时钟源选择和主从触发模式

  • 外部时钟源:1.TIMx_ETR引脚,滤波后的电路,兵分两路,一个进入ETRF进入触发控制器,便可以选择作为时基单元的时钟了(叫做外部时钟模式2),第二种也可以作为时钟。还有TRGO可以做外部时钟,叫外部时钟模式1。TRGo可以通向其他定时器,就接上了其他定时器ITR引脚,实现了级联,具体连接方式

image.png

5. 高级定时器

高级定时器相对于通用定时器,多了

  • 一个重复计数器,可以实现,每隔几个周期申请一个中断,因此定时时间上限为59*65536.
  • 一个死区生成器,对于输出比较模块进行了升级,前三个输出引脚变为了一对互补的引脚,因此可以生成一对互补PWM波,驱 动三项无刷电机。为了防止互补输出驱动桥臂时,在开关切换瞬间,由于器件的不理想而造成短暂的直通现象,而使用DTG产生一定时间的死区
  • 一个刹车输入,给电机驱动提供安全保障,如果外部引脚BKIN产生刹车信号,或者内部时钟失效产生了故障,那么控制电路便会自动切断输出,防止意外发生

      主讲定时中断和内外时钟源选择      

6.定时中断基本结构

定时中断配置基本步骤

  • RCC开启时钟,定时器的基准时钟和整个外设的工作时钟
  • 选择时基单元的时钟源,定时中断选择内部时钟模式
  • 配置时基单元,包括PSC,ARR,CNT,以及计数模式等等
  • 配置输出中断控制,允许更新中断输出到NVIC
  • 配置NVIC,在NVIC中打开定时中断的通道,并分配优先级
  • 运行控制

1.预分频器(PSC)

  • 当预分频器=0时,也即不分频,或者1分频,输出频率=输入频率=72MHz.
  • 当预分频器=1时,也即2分频,输出频率=输入频率/2=36MHz.
  • 当预分频器=2时,也即3分频,输出频率=输入频率/3=24MHz. 因此,实际分频次数=预分频系数+1.(最大为65535)
  • CK\_CNT=CK\_PSC/(PSC+1)(CK_CNT=72MHz)

    定时器时钟=定时器时钟源+(预分频值+1) 由图可知,预分频器有两个,预分频控制寄存器由我们来读写,并不直接决定预分频系数;另外一个为预分频缓冲器(影子寄存器) 为真正起作用的寄存器,防止了在一个计数周期内,计数频率发生改变,

  • CK_PSC预分频器的输入时钟,内部时钟一般是72MHZ CNT_EN计数器使能,高电平计数器正常运行,低电平计数器停止。 CK_CNT计数器时钟,即是预分频器的时钟输出,也是计数器时钟输入。当计数值计到和重装值相等时,并下一个时钟来临时,计数值才清0,同时产生一个更新事件,这是一个计数周期的工作流程。

  • 预分频器为了防止计数中途更改数值造成错误,设计了缓冲寄存器,计数器同理。

2.计数器(CNT)

  • 计数器可以对预分频后的时钟进行计数,每来一个上升沿 计数+1.(最大为65535)

  • CK\_PSC:内部时钟72MHZ
    CNT\_EN:时钟使能,高电平启动

  • 计数器也有缓冲寄存器的,但用和不用可以自己设置,无预装时序是没有缓冲寄存器的,通过使用ARPE,可以选择是否使用预装功能

    • ARPE:自动重装载预装载允许位 (Auto-reload preload enable)
      0: TIMx_ARR寄存器没有缓冲;
      1: TIMx_ARR寄存器被装入缓冲器。

3. 自动重装寄存器(ARR)

CK\_CNT:计数器时钟频率;CK\_PSC:预分频器时钟;PSC:预分频值

  • 自动重装寄存器 计数器由预分频输出CK_CNT驱动,设置TIMx_CR1寄存器中的计数器使能位(CEN)使能计数器计数存储计数目标,当达到目标,产生中断信号,计数器清零。
    • ARR(Auto-Reload Register,自动重装载寄存器)的主要作用是设定定时器的周期,即定时器计数器达到预定值时重载并产生中断或其他事件。
      • 1.auto-reload precload=Disable自动重装载寄存器写入新值后,计数器立即产生计数溢出,然后开始新的计数周期
        1. auto-reload precload=Enable自动重装载寄存器写入新值后,计数器完成当前旧的计数后,再开始新的计数周期

  • 更新中断:计数值等于自动重装计数值产生的中断,之后通往NVIC的定时器通道,配置到NVIC通道,那么定时器的中断便可以得到,CPU的响应了。(向上的箭头UI)
  • 更新事件:不会触发中断,但会触发其他内部电路的工作。

输出比较电路右边输出比较电路。可以用于输出PWM波形,驱动电机 输入捕获电路左边输入捕获电路。4个通道,可以用于测量输入方波频率。 捕获/比较寄存器中间为捕获/比较寄存器。输出比较电路和输入捕获电路共用,因为输出比较和输入捕获不能同时使用,因此这个里的寄存器共用,引脚也共用

8.定时器配置基本步骤

image.png

7.RCC时钟树

image.png

  • 这个时钟树就是stm32用来产生和配置时钟,并把配置好的时钟发送到各个外设的系统
  • 左边的时钟是产生电路,右边的是时钟分配电路,中间SYSCLK是系统时钟,72MHZ。
  • 在时钟产生电路有4个震荡源
    • 分别是内部的8MHZ高速RC振荡器:
    • OSC,外部的4-16MHZ的高速石英晶体振荡器;
    • 外部的32.768KHZ低速晶振:LSE OSC,一般是提供给RTC时钟的;
    • 最后是内部的40KHZ低速RC振荡器:LSI RC,提供给开门狗的。

高速时钟是用来提供系统时钟的

1.在systemint()函数中,ST配置时钟方式,时钟产生电路:

image.png

  • 首先,启动内部时钟,选择内部8MHZ为系统时钟,暂时以8MHZ的时钟运行,然后启动外部时钟,进入PLL锁相环,倍频9倍,为72Mhz,等到锁相环稳定后,再选择锁相环输出为系统时钟,这样就将系统时钟由8MHz变为了72MHZ

2.时钟分配

image.png

  • 任何定时器的内部基本时钟都是72MHZ(再不修改RCCsystemInit函数的情况下)

8.输出比较

  • OC(output compare)输出比较 输出比较可以通过比较CNT和CCR寄存器值的关系,来对输出电平置1,置0,或反转的操作,用输出一定频率,占空比的PWM波形 每个高级定时器和通用定时器都有4个输出比较通道(高级定时器的前三个额外拥有死区生成和互补输出的功能)

  • PWM简介(脉冲宽度调制)   在具有惯性的系统中,可以对一系列的脉冲宽度进行调制,来等效的获得所需要的模拟变量常用于电机调速领域   参数:频率:1/Ts;占空比:Ton/Ts(Ton高电平时间,Ts总时间);分辨率,占空比变化步距。   配置步骤

    • 第一步:RCC开启时钟,把要用的TIM外设和GPIO外设时钟打开
    • 第二步:配置时基单元,包括时钟源选择
    • 第三步:配置输出比较单元
    • 第四步:配置输出GPIO口
    • 第五步:启动计数器   参数计算 ARR:自动重装值; CCR:捕获/比较值; PSC:预分频值   PWM频率:Freq=CK_PSC/(PSC+1)/(ARR+1)/   PWM占空比: Duty=CCR/(ARR+1)//50%   PWM分辨率: Reso=1/(ARR+1)//1%

  • 极性选择:即选择输出信号是否要反转

  • 输出比较通道(通用)

  • 输出比较模式(即REF的输出模式选择)

  • 舵机简介   舵机是一种根据PWM信号占空比来调整输出角度的装置   输出PWM信号要求,周期为20ms,高电平宽度为0.5~2.5ms

  • 直流电机简介   电极正接,电机正转,电机负接,电机反转   直流电机属于大功率电器,GPIO口无法直接驱动,需要配合电机驱动电路来配合使用   TB6612,是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机

  • 重映射   根据你所要重映射的引脚,在下图找到所需要的模式,比如:如果我们想把PAO改到PA15,就可以选择这个部分重映射式   1,或者完全重映射。 在但是PA15在引脚定义图里没有加粗,因为它上电后已经默认复用为了调试端口JTDI,所以如果想让他作为普通的GPIO或者复用定时器的通道。那还需要先关闭调试端回的复用,也是用这个GPIO PinRemapConfig函数,不过第一个参数用GPIO_Remap_SWJ_JTAGDisable

9.基本参数&计算

参数计算

  • ARR:自动重装值; CCR:捕获/比较值; PSC:预分频值,CK\_PSC:72MHZ

  • PWM频率:Freq=CK_PSC/(PSC+1)/(ARR+1)/

  • PWM占空比: Duty=CCR/(ARR+1)/

  • PWM分辨率: Reso=1/(ARR+1)/