内容提要
引言
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)的二分频。
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模式)下可写。
所以不能使用修改时基计数器利用计数器溢出中断的方式来做定时中断,正确的方法是通过不断的修改输出比较寄存器利用某个通道的输出比较中断来实现周期性定时中断;
PS:如果使用使用修改时基计数器利用计数器溢出中断的方式来做定时中断,在debug时是可以正常工作的,一旦拔掉BDM调试器,让S12(X)系列MCU正常模式工作时,就不能正常产生预期的定时中断了;
如果使用Processor Expert的话,只需要添加TinerInt组件:
然后,再设置周期中断源(Period interrupt source)为TIM定时器的某个通道(TC0~TC7),并设置中断周期(Interrupt period),即可完成使用TIM的输出比较功能实现周期中断定时功能:
3. 不同的part对应TIM模块的通道数可能是6个或者8个,只有具有8个通道的part其通道7才能正常输入脉冲累加
比如S12G系列MCU的TIM通道数如下表,只有S12G96以上的part的TIM模块才有8个通道,可以支持脉冲累加:
4. 正确的TIM通道中断标志清除方法
TIM模块的每一个通道有一个中断标志位,当其产生输入捕捉或者输出比较事件是会将相应的中断标志位置位,如果使能相应的中断则会产生一个CPU中断。该中断标志位采用写1清除、写0无效的工作机制:
TIM的每个通道有自己独立的中断向量,对弈一个独立的中断ISR,在ISR中清除中断标志位时,请务必使用直接向相应位写1,其余为写0的方式清中断标志,即:
如果是通道2产生中断,在其ISR中,使用TFLG1 = 0x04;
如果是通道5产生中断,在其ISR中,使用TFLG1 = 0x20;
而不能使用位操作方式,比如TFLG1_C2F = 1或者或等于的方式,比如TFLG1 |= 0x04;
因为虽然在S12(X)的CPU指令中有位操作指令来支持寄存器的位操作,但其操作往往不是真正的原子操作,它是先将该寄存器读出来,再通过位与或者位或的方式实现的。这样如果同时又两个或者多个通道使能且相应的中断事件产生的话(相应的通道中断标志位会被置位),则会将其他通道的中断标志圆通清除,从而导致中断丢失的情况。
PS:这种情况出现后的现象为,只单独使能某一个TIM通道中断的时候都能够正常工作,但同时使能多个听到没时就会出中断丢失;
S12(X)系列的其他外设中断也是一样的,但一个寄存器中有多个中断标志位时,一定采用直接往相应位写入1其他位写0的方式进行中断标志清除;
5. 配置做定时中断的TIM输出比较通道引脚为GPIO使用
在S12(X)系列MCU中,其端口功能复用没有专门的功能复用寄存器(比如Qorivva MPC56xx系列的SIUL的PCR寄存器),某个引脚上具体复用哪一个功能取决于其固定的优先级,比如S12G系列MCU的PE1管脚,但其作为TIM模块的IOC3使用时候,就不能作为PWM模块的输出通道PWM1、ADC的外部触发ETRIG1以及GPIO功能使用了:
然而,当TIM的某个通道配置为输出比较功能用作内部定时中断使用时, 其不用输出也无需输入(由于默认OCPD=0,所以一旦使能TIM的某一通道,则其相应的比较输出就会占用相应的管脚),因此对应的引脚没有用。
这时,可以通过配置输出比较引脚断开寄存器(OCPD)相应的位为1,将其对应的管脚与TIM模块通道断开连接,从而将该管脚用作其他复用的功能,比如GPIO:
6. 配置BDM调试时,TIM定时器时基计数器停止计数,从而避免反复进入TIM输出比较或者时基计数器溢出中断
默认TIM模块的系统控制寄存器(TSRCR1)的TSFRZ位为0,在连接BDM调试时,即使程序运行至设置的断点停下来了,TIM的时基计数器依然还在计数,所以当你再次运行时就会直接进入TIM的输出比较或者时基计数器溢出中断,并不断反复(即使因为单步运行停下来的时候,TIM的时基计数器依然在工作),影响对其他程序的正常调试。
这个时候就可以在初始化TIM时,将TIM模块的系统控制寄存器(TSRCR1)的TSFRZ位置1来使能调试时冻结模式(Freeze Mode-即调试遇到断点的情况)下,时基计数器停止工作。这样只有点击运行时基计数器才会计数,从而避免不断反复的进入TIM的输出比较或者时基计数器溢出中断。
如果使用Processor Expert,使能该功能只需要在EXPERT模式下配置TimerInt组件的Stop in freeze mode选项为yes即可:
总结
如果正在使用S12(X)系列MCU,想使用TIM,则可以参考以上客户常见的FAQ。如果用户使用Processor Expert来配置TIM的话,很多设置都可以很方便地就可以通过图像化(GUI)配置完成,在其自动生成的中断ISR中就是使用的直接写1清零的方式清除TIM的通道中断标志位,避免中断丢失。
所以在S12(X)系列MCU的底层驱动开发时,我们推荐客户使用Processor Expert,既可以提高效率,又可以避免潜在的配置bug。
以上就是今天跟大家分享的内容。希望对大家有用。
本微信公众号已经发布的个人原创精品----嵌套嵌入式系统技术文章链接如下,欢迎大家参考学习,并转发分享:
汽车电子expert成长之路公众号系列文章列表
浅谈嵌入式MCU开发中的三个常见误区
浅谈嵌入式 MCU 软件开发之应用工程的堆与栈
浅谈嵌入式MCU软件开发之中断优先级与中断嵌套
浅谈嵌入式MCU软件开发之代码风格与代码优化
浅谈嵌入式MCU软件开发之startup过程详解(从复位向量到main函数之前的准备工作)
浅谈嵌入式MCU软件开发之startup过程详解(在CodeWarrior 5.1 中实现RAM自定义初始化)
浅谈嵌入式MCU软件开发之S12(X)系列MCU 中断ISR在CodeWarrior 5.1 IDE 中的三种写法
浅谈嵌入式MCU硬件设计之MCU最小系统电路
S12(X)系列MCU的片上存储器资源与分页访问机制详解(一)
S12(X)系列MCU的片上存储器资源与分页访问机制详解(二)
S12(X)系列MCU的加密(Secure)原理和解密(Unsecure)方法
使用 Cyclone 离线编程器对 S12(X)和 MagniV S12Z 系列 MCU 片上 NVM 编程
Qorivva MPC56xx/57xx系列MCU的模式控制与切换(片上外设资源使能与功耗控制)
外设使用Tips之MSCAN接收ID滤波器设置
S32DS 使用 tips--使用Flash from file下载S19或elf文件
S32DS 使用tips--S32DS for ARM v1.3工程到S32DS for ARM V2.0迁移升级方法和注意事项
S32DS 使用 tips--工程属性配置(编译选项和C编译器、汇编器及链接器设置)
CodeWarrior IDE使用tips之map文件详解
CodeWarrior IDE使用tips之prm链接文件详解(自定义存储器分区以及自定义RAM数据初始化与在RAM中运行函数)
CodeWarrior IDE使用tips之bug定位绝技--hotsync与attach调试
CodeWarrior IDE 版本选择与 License功能(feature)和价格,授权形式差异、激活方法与安装使用
如果你喜欢本公众号的文章,请点击文章最开始的公众号关注或微信直接长按扫描识别下方二维码关注,你也可以在微信添加朋友-->公众号-->输入"汽车电子expert成长之路"搜索-->点击关注。若对本文观点有任何意见和建议也欢迎留言指出。您的关注、点赞、转发分享是对我辛勤写作的最大肯定。
胡恩伟
NXP汽车电子FAE
2017年9月8日于山城重庆
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。