MSP430G2553与MSP430F5336系列单片机总结2——定时器与捕捉比较器以及中断

  在研究定时器与捕捉比较器之前,我们可以先讨论一下,他们能做什么?
   1.定时,产生固定频率的波形,或者使LED等按照固定时间闪亮
   2.产生Timer0定时中断,在一定的时间间隔执行某些功能,例如超声波传感器的使用,可以设置超声波测量距离的测量频率
   3.可以测量脉冲或PWM波的的高低电平时间或频率
   4.脉冲计数
   5.捕捉比较模式可以产生PWM波
   6.可以产生PPM波
   7.可以测量PPM波的各通道占空比 
  所以定时器是单片机中使用频率很高的资源,不要随便使用定时器的IO口直接做输入输出使用,这样有点浪费。
  先对MSP430G2553进行分析,通过用户手册和Datasheet,我们可以知道G2553只有定时器A,没有定时器B,并且没有定时器A2,定时器A只有捕捉比较器0(TA0.CCI0A  引脚P1.1),捕捉比较器1(TA0.CCI1A  引脚P1.2)等资源,Timer_A为16为定时器,也就是说最高可以计数到65536,当定时到实践或者满足捕获比较条件时可以出发定时器A中断。
  在这里对中断进行一定的介绍,中断使暂停CPU正在运行的程序,转去执行相应的中断服务程序,中断完毕后返回被中断的程序并且继续运行的现象和技术,中断的存在是很必要的,可以很好地处理突发事件,并且不与主程序内容冲突。这些解释或许不便于理解,我现在举一个例子来说明中断的必要性。例如,我现在要用MSP430系列的单片机做飞控控制四轴飞行器,首先他需要不断产生200HZ的四路PWM波,还需要不断的读来自MPU6050传递过来的飞信器加速度角速度等数据,还需要获取超声波返回的距离信息以避障,还需要进行四元素融合计算欧拉角以及进行PID迭代,这么多的操作要同时执行,假如说没有中断,我们产生200HZ的PWM波的方式或许会采用延时,也就是写一些延时程序延时到5ms则取反则能产生200HZ的pwm波,但是这样你的程序需要不断执行延时程序,并且不能被打断,因为一旦被打断,你产生的波形的周期也就变了,这样我们将不能加入MPU6050等传感器。但是使用中断可以很好地解决这一问题。我们的主程序不断执行的就是PID迭代这个操作,然后再5ms的计时周期到了之后,进入定时器中断并且产生pwm波,串口中断到了之后进入串口读MPU6050的数据,echo信号的高电平到了之后进入超声波对应的定时器读高电平,在这些中断结束后继续在主函数进行PID迭代,这样就可以不断地更新信息,产生波形,并且不影响主函数的执行。所以学会使用中断使很重要的。中断的来源有内部中断和外部中断,并且可以设置优先级,要能够进入中断也必须先在相关的寄存器中设置中断使能,这些内容大家可以参照代码和一些资料自己学习,现在我来讲几个定时器中断的典型例子:

  上面这个例子采用的是捕捉比较器A0的中断,A0和其他捕捉比较器的中断使不同的,A0的中断格式如这个程序所示,其他捕捉比较器的中断我们之后再说,上面的程序基本有注释,很容易看懂,其中要注意的就是定时器计数的四种模式,分别是停止模式(不计数),增计数模式(从0计数到TAxCCR0),连续计数模式(从0计数到0FFFFh),增减计数模式(从0计数到TAxCCR0之后减计数到0循环往复),所以通过增计数或者增减计数模式可以通过改变TAxCCR0改变计数周期,也就是改变要生成的波形周期。此外还有输入输出的模式定义,对应可以生成不同需求的波形,例如pwm波等等,这个可以详细看用户手册了解。接下来看第二个例子:

  这个例子使用的是A1的中断,像注释中所说,其中case2是CCR1产生的中断,case4是CCR2产生的下降沿中断,case10是定时器TAR溢出中断,所以你想要在8hz时P1.0取反,则在case10时写这句话,当然你也可以设置在CCR1或者CCR2的计数时间到时取反,如下方代码所示:

  以上的代码大致是定时器中断的介绍,相信大家不难理解,但是到这里会有一个问题,就是假如不用中断,能不能产生一定周期的信号呢,答案是可以的,可以配置CCR1和CCR0的引脚为比较输出模式,便可以产生一定频率的方波。这里比较简单,不再仔细讲,具体代码和注释如下:

  下面这个例子是不用中断生成pwm波波形的例子,用中断生成pwm波的例子我之后会专门写文章说明

  以上基本是MSP430G2553的定时器A的说明,还有一些其他的例程可能配置时钟为ACLK,或者产生不同的占空比,或者使用不同的引脚,不过原理都大同小异,大家要注意的就是选择哪个时钟,哪种计数模式,便能很好地运用定时器A。

  同样我们来看一下MSP430F5336的定时器使用,F5336的定时器资源相对来说就丰富的多,定时器有定时器A0,定时器A1,定时器A2,定时器B四个不同的定时器模块,定时器A0有CCI0-CCI4五个捕捉比较器,还有CCI1B和CCI2B做为选择,是管教P1.1-P1.7的第二功能;定时器A1和定时器A2都是分别有CCI0-CCI2三个捕捉比较器,在引脚P3上;定时器B有CCI0-CCI6七个捕捉比较器,在引脚P4上;具体的原理和G2553差不多,不过寄存器略有区别,我不详细讲了,直接贴代码:
  定时器A:

  定时器A1,A2,B与之类似不再复述了,以上基本是定时器的原理和使用方法。