6.1 TIM定时器中断

江科大stm32 P6.1 TIM定时器中断

一、TIM定时器

1、定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断

2、16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时(计72000次,是一秒)

59.65的计算:1/( 72000/65536/65536) 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

在定义了时钟的最高频率 ,我们就要去设置定时器的震荡频率,然后计算出每秒多少HZ,进而计算出每一HZ 所需要花费的时间,最后根据自动重装载的次数计算定时器的时间

如计算 500ms的定时器

TIM4_Init(1000-1,36000-1); //定时500ms

最大频率72Mhz 分频系数 36000-1(0是1分频,1是2分频,以此类推) 自动重装载数 1000

计算1秒多少HZ 就是最大频率除以分频系数

++72000000/(36000-1+1)=2000hz++ (3600-1+1) 计数是从零开始所以需要加一

1/2000=0.0005秒/HZ=0.5毫秒/HZ

自动重装载数 为(1000-1+1) (1000-1+1)计数是从零开始所以需要加一

定时器时间就是 0.5*1000=500毫秒 因此 就计算出了我们设置的定时器时间就是500ms进入一次定时器中断。

二、定时器类型

基本定时器

  • 时钟源为内部时钟
  • 实际分频系数=预分频器的值+1,预分频器是16位的最大可以写65535,也就是65536分频
    • 分频系数就是指频率除以几,不能除以0,所以分频系数等于预分频器的值加1,这样分频系数最小就为1.
  • 计数器也是16位的,最大可以加到65535,只支持向上计数
  • 自动重装载寄存器也是16位,存放技术目标,当计数器达到目标值时,就是计时时间到了,之后会产生信号,然后清零计数器
  • 图中向上的箭头表示中断,向下的箭头表示事件
    • 计数值等于自动重装值的中断一般叫更新中断,通向NVIC,配置好NVIC的定时器通道,更新中断就能得到CPU的响应了
    • 这里的事件叫更新事件,更新事件不会触发中断,但可以触发内部其他电路的工作
      • 中断出发DAC转换:每次定时器中断触发后在中断程序中调用代码手动触发DAC转换然后DAC输出。但是这样会使主程序处于频繁被中断的状态
      • 事件触发DAC转换:使用主模式可以把定时器的更新事件映射到触发输出TRGO(Trigger Out)的位置,然后TRGO直接接到DAC的触发转换引脚上。整个过程不需要软件的参与,实现了硬件的自动化

通用定时器

1.时基单元
  • 基本时基单元都差不多,通用定时器和高级定时器还支持向下计数和中央对齐模式
    • 向下计数:从重装值开始向下自减,减到0后回到重装值同时申请中断,然后继续下一轮,依次循环
    • 中央对齐:从0开始,先向上自增计到重装值,申请中断,然后再向下自减,减到0,再申请中断,然后继续下一轮,依次循环。
2.外部时钟源

通用定时器可以选择外部时钟,

TMx_ETR

比如下面所示的TIM2的ETR引脚

  • 也就是可以在PA0上接一个外部方波时钟,然后配置一下内部的极性选择、边沿检测和预分频器电路,再配置一下输入滤波电路,这两块电路对外部时钟进行一定的整型。滤波后的信号可以兵分两路
    • ETRF进入触发控制器,可以选择作为时基单元的时钟,如果想在ETR外部引脚提供时钟或者想对ETR时钟进行计数,就可以配置这一路电路,在stm32中这一路电路被叫做“外部时钟模式2”
    • TRGI,一般作为触发输入,可以触发定时器的的从模式,当TRGI作为外部时钟来使用的时候,一般叫“外部时钟模式1”。
    • ETR引脚可以通过ETRF和TRGI作为时钟时是等价的,只不过通过TRGI时会占用触发输入的通道
 ITR 

ITR信号来自其他定时器,在图中可以看出,主模式的TRGO可以通向其他定时器,这时候就接到了其他定时器的ITR引脚上了(如下图),可以实现定时器级联

TI1F_ED

连接输入捕获单元 的CH1引脚,ED就是Edge(边沿),通过这一路的时钟,上升沿下降沿均有效

3.输出比较,输入捕获

OCx是输出比较电路,共有四个通道。可以用于输出PWM波形,驱动电机

ICx是输入捕获的电路,可以用于测量方波的频率

因为输入捕获和输出比较不能同时使用,所以捕获/比较寄存器是共用的,引脚也是共用的,CH引脚

 高级定时器

重复次数计数器:可以实现每隔几个计数周期才发生一次更新事件和更新中断,相当于对输出信号又做了一次分频,提升最大定时时间

三、时序

预分频器时序

如下图,预分频缓冲器又叫影子寄存器,我们修改分频系数时,实际被修改的是预分频控制寄存器,他不会立即改变分频值,否则会出现计数到一半前后频率不一致的情况,等到本次计数周期结束时,产生了更新事件预分频计数器的值才会被传到缓冲器,之后才会生效

在图中像PSC一样下面有黑色阴影的寄存器都有缓冲机制,即影子寄存器

预分频器考预分频计数器工作,在计数器回到0时输出脉冲

计数器计数频率:CK_CNT = CK_PSC/(PSC+1 )

计数器时序

计数器溢出频率:CK_CNT_OV = CK_CKT/(ARR+1)                                                                                                                            =   CK_PSC/(PSC+1 )/(ARR+1)

ARR的缓冲寄存器可以设置使能或者失能

在上图中如果没有预装功能的情况下,ARR由F5改为36,但此时计数器已经大于36,所以计数器会一直加到最大值FFFF。

时钟树

四、定时中断基本结构

初始化定时器

  1. RCC开启时钟 定时器基本时钟和整个外设工作时钟会被打开
  2. 选择时基单元的时钟源 对于定时中断一般选择内部时钟源(TIM_InternalClockConfig)
  3. .配置时基单元 (TIM_TimeBaseInit 时基单元初始化) (TIM_Cmd使能计数器) 预分频器、自动重装器、计数模式等等(结构体) 这些初始化后还可以单独修改    

TIM_CounterModeConfig 计数器模式

TIM_ARRPreloadConfig 自动重装器预装功能

TIM_SetCounter 给计数器设置一个值

TIM_SetAutoreload 给自动重装器写一个值

TIM_GetCounter 获取当前计数器的值

TIM_GetPrescaler 获取当前预分频器的值

  1. 配置输出中断控制(TIM_ITConfig) 允许更新中断输出到NVIC

  2. 配置NVIC 在NVIC中打开定时器中断的通道,并分配一个优先级

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值