汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

外设使用Tips之TIM定时器使用FAQ和使用经验

0
阅读(319) 评论(0)

内容提要

引言

1. TIM的时钟源和时基计数器

2. 如何使用TIM实现定时中断

3. 不同的part对应TIM模块的通道数可能是6个或者8个,只有具有8个通道的part其通道7才能正常输入脉冲累加

4. 正确的TIM通道中断标志清除方法

5. 配置做定时中断的TIM输出比较通道引脚为GPIO使用

6. 配置BDM调试暂停时,TIM定时器时基计数器停止计数,从而避免反复进入TIM输出比较或者时基计数器溢出中断

总结


引言


        TIM定时器是Freescale S12(X)和MagniV S12Z系列汽车级MCU最常见的定时器模块,其能够完成定时器常见的输入捕捉(Input Capture)、输出比较(Output Compare)、周期定时中断以及脉冲累加计数等功能。本文列举TIM定时器使用时的FAQ(常见问题)和使用经验,供大家参考学习。


1. TIM的时钟源和时基计数器


        TIM模块的时钟源只能是bus clock,不同的MCU系列其bus clock的最高频率有所差异。bus clock固定对PLL输出时钟频率(该时钟一般为CPU内核时钟--core clock)的二分频。

2.jpg

Tips:

  • TIM定时器能够分辨的最小时隙(tick), counter没记一次数的时间间隔为1/(bus clock)秒;由于TIM的计数器为16-bit宽,为了让TIM定时周期加大,可以通过设置其预分频器(Prescaler)来实现,但会牺牲最小时隙分辨率;


     

  • TIM模块具有6/8个通道,所有通道的输入捕捉和输出比较共用一个timer时基计数器;


  • 由于bus clock的STOP模式下是关闭的,所以在低功耗模式下TIM自动停止工作,因而其中断不能作为MCU的STOP低功耗模式的唤醒源;


  • 推荐使用word(16-bit)读的方式读取TIM模块的时基计数器寄存器以保证读取时间的准确,如果要按高低字节来读取,请先读取低字节再读高字节以保证一致性;


2. 如何使用TIM实现定时中断


由于TIM的所有通道共用一个16-bit的向上计数器作为时基(0 to 0xFFFF),该时基计数器寄存器在正常模式下写时无意义的,至于在特殊模式(special mode,也就是BDM模式)下可写。

3.jpg

所以不能使用修改时基计数器利用计数器溢出中断的方式来做定时中断,正确的方法是通过不断的修改输出比较寄存器利用某个通道的输出比较中断来实现周期性定时中断;


PS:如果使用使用修改时基计数器利用计数器溢出中断的方式来做定时中断,在debug时是可以正常工作的,一旦拔掉BDM调试器,让S12(X)系列MCU正常模式工作时,就不能正常产生预期的定时中断了;


Tips: 如果使用Processor Expert的话,只需要添加TinerInt组件:

4.jpg

然后,再设置周期中断源(Period interrupt source)为TIM定时器的某个通道(TC0~TC7),并设置中断周期(Interrupt period),即可完成使用TIM的输出比较功能实现周期中断定时功能:

5.jpg


3. 不同的part对应TIM模块的通道数可能是6个或者8个,只有具有8个通道的part其通道7才能正常输入脉冲累加


        比如S12G系列MCU的TIM通道数如下表,只有S12G96以上的part的TIM模块才有8个通道,可以支持脉冲累加:

6.jpg


4. 正确的TIM通道中断标志清除方法


TIM模块的每一个通道有一个中断标志位,当其产生输入捕捉或者输出比较事件是会将相应的中断标志位置位,如果使能相应的中断则会产生一个CPU中断。该中断标志位采用写1清除、写0无效的工作机制:

7.jpg

TIM的每个通道有自己独立的中断向量,对弈一个独立的中断ISR,在ISR中清除中断标志位时,请务必使用直接向相应位写1,其余为写0的方式清中断标志,即:


  • 如果是通道2产生中断,在其ISR中,使用TFLG1 = 0x04;

  • 如果是通道5产生中断,在其ISR中,使用TFLG1 = 0x20;


    而不能使用位操作方式,比如TFLG1_C2F = 1或者或等于的方式,比如TFLG1 |= 0x04;


因为虽然在S12(X)的CPU指令中有位操作指令来支持寄存器的位操作,但其操作往往不是真正的原子操作,它是先将该寄存器读出来,再通过位与或者位或的方式实现的。这样如果同时又两个或者多个通道使能且相应的中断事件产生的话(相应的通道中断标志位会被置位),则会将其他通道的中断标志圆通清除,从而导致中断丢失的情况。


PS:这种情况出现后的现象为,只单独使能某一个TIM通道中断的时候都能够正常工作,但同时使能多个听到没时就会出中断丢失;


Tips: S12(X)和MagniV S12Z系列MCU的其他外设中断也是一样的,但一个寄存器中有多个中断标志位时,一定采用直接往相应位写入1其他位写0的方式进行中断标志清除;


5. 配置做定时中断的TIM输出比较通道引脚为GPIO使用


在S12(X)系列MCU中,其端口功能复用没有专门的功能复用寄存器(比如Qorivva MPC56xx系列的SIUL的PCR寄存器),某个引脚上具体复用哪一个功能取决于其固定的优先级,比如S12G系列MCU的PE1管脚,但其作为TIM模块的IOC3使用时候,就不能作为PWM模块的输出通道PWM1、ADC的外部触发ETRIG1以及GPIO功能使用了:

8.jpg

然而,当TIM的某个通道配置为输出比较功能用作内部定时中断使用时, 其不用输出也无需输入(由于默认OCPD=0,所以一旦使能TIM的某一通道,则其相应的比较输出就会占用相应的管脚),因此对应的引脚没有用。

这时,可以通过配置输出比较引脚断开寄存器(OCPD)相应的位为1,将其对应的管脚与TIM模块通道断开连接,从而将该管脚用作其他复用的功能,比如GPIO:

9.jpg


6. 配置BDM调试暂停时,TIM定时器时基计数器停止计数,从而避免反复进入TIM输出比较或者时基计数器溢出中断


默认TIM模块的系统控制寄存器(TSRCR1)的TSFRZ位为0,在连接BDM调试时,即使程序运行至设置的断点停下来了,TIM的时基计数器依然还在计数,所以当你再次运行时就会直接进入TIM的输出比较或者时基计数器溢出中断,并不断反复(即使因为单步运行停下来的时候,TIM的时基计数器依然在工作),影响对其他程序的正常调试。


这个时候就可以在初始化TIM时,将TIM模块的系统控制寄存器(TSRCR1)的TSFRZ位置1来使能调试时冻结模式(Freeze Mode-即调试遇到断点的情况)下,时基计数器停止工作。这样只有点击运行时基计数器才会计数,从而避免不断反复的进入TIM的输出比较或者时基计数器溢出中断。

10.jpg


 Tips: 如果使用Processor Expert,使能该功能只需要在EXPERT模式下配置TimerInt组件的Stop in freeze mode选项为yes即可:

11.jpg


总结


如果正在使用S12(X)系列MCU,想使用TIM,则可以参考以上客户常见的FAQ。如果用户使用Processor Expert来配置TIM的话,很多设置都可以很方便地就可以通过图像化(GUI)配置完成,在其自动生成的中断ISR中就是使用的直接写1清零的方式清除TIM的通道中断标志位,避免中断丢失。

12.jpg

所以在S12(X)系列MCU的底层驱动开发时,我们推荐客户使用Processor Expert,既可以提高效率,有可以避免潜在的配置bug。

胡恩伟

NXP汽车电子FAE

若对本文观点有任何意见和建议欢迎留言指出。

如果喜欢,可以关注本人公众号,阅读更多精彩内容。