1.Timer_A3的模式介绍
在介绍TACTL中的MC1和MC0控制位时提到,收到MC1和MC0位的共同控制,使得Timer_A3共有4种定时器的工作模式,在实际的使用中,这四种模式的影响非常广泛,因此本小节中将详细介绍4种工作模式:
1、MC_0:停止模式
2、MC_1:增计数模式
3、MC_2:连续计数模式
4、MC_3:增减计数模式
2.停止模式
停止模式时,定时器暂停计数,但是16位计数器TAR中的数值不会受到影响。当重新开始计数时,计数器将冲原来暂停的位置继续开始计数。如果用户希望以新的计数特性重新计数,可以对TACTL控制寄存器中的CLR控制位置位。
3.增计数模式
增计数模式下的基本规则:计数器TAR进行增计数,当其中的值等于或大于CCR0中的值时,计数器TAR复位并重新从零开始计数;当TAR=CCR0时,CCIFG0置位;当TAR复位至0时,TAIFG置位。
根据以上规则,选择合适的定时器时钟源和分频系数,确定CCR0的值(16位寄存器,最大65535)就可以确定定时器的定时长度。
因此我们可以更加细致的分析增计数模式下定时器时钟周期与TAR中值的变化关系。伴随定时器时钟周期,TAR中的值从0开始计数一直到CCR0的值,然后重新计数。因此实际上定时的周期长度为(CCR0+1)个定时周期。
4.连续计数模式
连续计数模式下的基本规则:计数器TAR进行增计数,当其中的值到达0xFFFFH后,计数器TAR复位并从0开始重新计数;当TAR复位至0时,TAIFG置位。
连续计数模式下,允许CCRx中断并启动定时器后,到达要求的时间间隔都会产生中断请求。例如,如下图所示,红色部分表示有中断。连续模式下TAR从0开始计数依次要在△t1、△t2、△t3和△t4四个时刻产生四次中断,按照预先设定的定时器时钟源和分频系数,分别需要N1、N2、N3和N4(N4>65535)四个定时器时钟周期,那么可以按照如下的顺序产生:第一次向CCRx中写入N1,启动定时器,当第一次进入CCRx中断后,需要向CCRx中增加上定时器增量N2-N1;当第二次进入CCRx中断后,需要向CCRx中增加上定时器增量N3-N2;当第三次进入CCRx中断后,需要向CCRx中增加上定时器增量N4-N3。
5.增减计数模式
增减技术模式下的基本规则是:计数器TAR先进行增计数,当其中的值到达CCR0后,计数器TAR开始进行减计数;当TAR减计数减至0时重新开始计数;当TAR增计数至CCR0时CCIFG0置位当TAR减计数至0时,TAIFG置位。
增减模式下,如下图所示的中断示意图,其中红色部分由中断。当允许中断并启动定时器后,由于计数模式的对称性,会产生具有对称性的周期性中断。用户可以利用这种特殊的中断,或者结合输出模式,输出具有特定特征的波形。
6.16位Timer_A3系统操作
定时器历来都是单片机的重要组件。利用定时器的简单定时功能,可以完成基本的定时功能,并且配合中断以及软件控制功能组成输入测量、输出控制等更为复杂的控制系统。
我们所需要的器材(如图所示)有:1、畅学系列MSP430核心板一块;2:畅学系列多功能开发底板一块。
6.1增计数模式下软件端口翻转
#include
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0x01;
CCTL0 = CCIE;
CCR0 = 50000;
TACTL = TASSEL_2 + MC_1;
_BIS_SR(GIE);
while(1);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= 0x01;
}
程序中除了初始化看门狗和端口之外,开启CCR0中断,设置CCR0初始值、选择定时器时钟源和工作模式,开启系统中断,中断服务程序中翻转P1.0端口的输出。特别参考增减计数部分的内容思考为什么CCR0=20000-1.程序整体运行的效果图为程序图下面的图。
增计数模式是下,CCR0的值时不需要用户在软件中重新写入的(除非要改变定时器的定时周期),每次当TAR计数到CCR0并复位到0都会将TAIFG置位,产生中断。程序响应TIMERA0_VECTOR(CCR0的中断向量)的中断事件,并且在中断服务程序中执行端口翻转的操作。
6.2连续计数模式下软件端口翻转
#include
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 50000;
TACTL = TASSEL_2 + MC_2; // SMCLK=default DCO ~800kHz, contmode
//连续模式表示计数器从0一直增加到0ffffh,然后再次清零,再增加到0ffffh
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= 0x01; // Toggle P1.0
CCR0 += 50000; // Add Offset to CCR0
}
维持原有的硬件电路不变,我们现在看到的程序便是连续计数模式下软件端口翻转程序。
在前面介绍连续计数模式时已经提及过,如果中断的间隔周期不等于65536个定时器时钟周期,那么每次中断都必须向CCRx中写入一个增量,以保证在经过这个增量的定时器时钟周期后能够再次产生中断。
因此在连续计数模式下实现相同功能的程序,除设置部分的差异外,最主要的差异就是在中断服务程序中,向CCR0中加上一个偏移量。因此,实际上每次产生中断时间时TAR的值都是不同的。
6.3 连续计数模式下软件端口翻转
上面所讲的程序时一个简单的、具有规律性的定时器中断,实际上连续计数模式更适合于产生一些不具有规律性中断事件。例如产生的定时器中断时间的间隔换算成定时器时间周期依次为:9872、5525、6636、7749、8864、9981、5840、6848、7856、9872、5525、6636,其中,图中所示的红色框内的部分是循环的一个周期。图中所示的程序,便是我们将上面的程序修改之后的。
与固定的CCR0增量相比,改程序从数组Int_TAB中按顺序提取增量,因此定时器中断事件间隔也将按照数组元素来实现。
这里就不用增减计数模式来举例。需要注意的是,只使用Timer_A3的定时器等功能而不使用定时器的溢出中断时。是不需要开启定时器中断允许位的。因此,我们上面的程序中并没有开启TAIE控制位。
6.4溢出中断的软件端口翻转
维持原有的硬件电路不变,带有溢出中断的软件端口翻转程序如图所示。
程序响应TIMERAI_VECTOR的中断事件,用户在该中断服务程序中通过判断中断向量寄存器TAIV,以获得中断源。按照TAIV中断表,中断向量10表示定时器溢出。
我们来看以下管脚描述,如图所示,CAP2.2....0的管脚方向是输ru。捕获管脚的跳变可配置为将定时器值装入一个捕获寄存器,并可选择产生一个中断,图中所示的是管脚的列表。计数器/定时器可选择一个捕获信号作为时钟源来代替PCLK分频时钟。
管脚MAT2.2......0和MAT3.3....0的管脚方向是输出。当匹配寄存器0/1等于定时器计数器时,该输出可翻转,变为低电平、变为高电平或不变。外部匹配器和PWM控制器控制该输出的功能。图中显示的是管脚的列表。
6.5中断向量的软件端口翻转
依然使用原来的硬件电路,中断向量的软件端口翻转程序如图所示。
使用连续计数模式,在中断向量TIMERA1_VECTOR的中断服务程序中判断捕获/比较器1的中断请求。
从上面的程序可以总结出使用Timer_A3定时器应当注意的基本问题:
1、CCR0对应的中断向量位TIMERA0_VECTOR
2、CCR1和CCR2对应的中断向量为TIMERA1_VECTOR
3、CCRx中断对应CCTLx中CCIE控制位控制;定时器溢出中断受TACTL中TAIE控制位控制;使用中断时,不要忘记开启总中断(GIE)。