一、实验目的
(1)了解MSP430系列Time_A定时器模块结构和功能;
(2)掌握Time_A定时器的工作原理和相关寄存器的配置方法;
(3)熟练掌握Time_A定时器定时中断功能的设计与应用;
(4)熟练掌握MSP430系列端口P1和P2复用功能应用;
(5)熟练掌握Time_A定时器定时中断功能的设计与应用。
二、实验原理
(1)定时功能
Timer_A定时器的结构分为两部分:主计数器和比较/捕获模块。其中,主计数器负责定时、计时或计数。在应用定时和计数功能时,可以只使用主计数器部分。
Timer_A定时器主计数器的结构包括时钟源、预分频器、计数器与计数模式选择几部分。与主计数器相关的控制位都位于TAxCTLn寄存器中。
注意:
①低功耗应用以及需要长时间定时、计时情况下,可以选择ACLK作为时钟。
②计数器复位后TAxCLR标志位自动归零。
(2)定时中断
定时器的基本功能就是计时,计至定时条件满足时可以产生中断。在定时中断服务程序内,执行需要严格时间间隔的程序,如循环扫描、定时采样等。
其中,由于采用增计数模式的定时器具有“自动重装载”的特点,改变定时周期只需要设置比较寄存器TAxCCRn 的值即可,特别适合产生周期性定时中断;对于其他模式则需萎对计数寄存器(TAR)的计数值重装初值。
(3)定时中断服务程序
利用MSP430中断使编写的程序结构更加合理,提高执行效率,降低系统功耗。Timer_A不同工作模式下定义的中断服务程序如下:
- 增计数模式和增/减计数模式下的中断服务程序
比较寄存器TAxCCR0用作 Timer_A 增计数模式和增/减计数模式下的周期寄存器。
- 在连续计数模式下的中断服务程序
连续计数模式下可以产生多个定时信号,每完成一个TAxCCRn计数间隔将产生一个中断。
三、实验内容
(1)为TA0配置时钟源及工作模式,控制LED指示灯的定时亮灭,中间间隔1秒钟。用示波器观察并记录时钟源和定时中断产生的波形和频率。
//增计数模式代码
#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; //关闭看门狗
P1DIR=BIT0;
TA0CTL=TASSEL_1+MC_1+TACLR; // ACLK, 增计数模式, 清除TAR计数器
TA0CCTL0=CCIE;
TA0CCR0=32768;
__bis_SR_register(LPM0_bits+GIE);
return 0;
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER_A0_ISR(void)
{
P1OUT^=BIT0;
}
//增/减计数模式代码
#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; //关闭看门狗
P1DIR=BIT0;
TA0CTL=TASSEL_1+MC_3+TACLR; // ACLK, 增/减计数模式, 清除TAR计数器
TA0CCTL0=CCIE;
TA0CCR0=16384;
__bis_SR_register(LPM0_bits+GIE);
return 0;
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER_A0_ISR(void)
{
P1OUT^=BIT0;
}
- 定时中断方式实现方法与实验一采用软件延时实现方法在效果和工作原理上有何不同?
使用软件延时CPU始终被占用,定时中断方式实现CPU可以处于低功耗状态,使系统功耗降低。
- 增计数模式和增/减计数模式下设置的周期有何不同?
为TAR计数器设置相同数值时,增/减计数模式设置的周期是增计数模式设置的周期的两倍。
(2)设计接口电路并编程实现按动LP板上的按键S1控制扩展板上的L1指示灯一直点亮,按动LP板上的按键S2控制扩展板上的L1指示灯亮灭3次后熄灭,中间间隔0.5秒。
实验代码:
#include <msp430.h>
int i=0;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // 关闭看门狗
P1DIR&=~BIT2;
P1IE|=BIT2;
P1IES|=BIT2;
P1IFG&=~BIT2;
P1REN|=BIT2;
P1OUT|=BIT2;
P1DIR&=~BIT3;
P1IE|=BIT3;
P1IES|=BIT3;
P1IFG&=~BIT3;
P1REN|=BIT3;
P1OUT|=BIT3;
P8DIR|=BIT1;
P8OUT&=~BIT1;
P3DIR|=BIT7;
P3OUT&=~BIT7;
TA0CTL|=TASSEL_1+MC_1+TACLR; // ACLK, 增计数模式, 清除TAR计数器
TA0CCR0=16384;
__bis_SR_register(LPM0_bits+GIE);
return 0;
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
if(P1IFG&BIT2)
{
P8OUT=BIT1;
P1IFG&=~BIT2;
}
if(P1IFG&BIT3)
{
TA0CCTL0=CCIE;
P1IFG&=~BIT3;
}
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
if(i<6)
{
P3OUT^=BIT7;
i++;
}
else
{
TA0CCTL0&=~CCIE;
P3OUT&=~BIT7;
i=0;
}
}
四、问题讨论
定时器都有哪些工作模式,如何配置?
停止模式
设置MCx=00,用于定时器暂停,并不发生复位。
增计数模式
设置MCx=01,主定时器将工作在增计数模式下。
连续计数模式
设置MCx=10,主定时器将工作在连续计数模式下。
增/减计数模式
设置MCx=11,主定时器工作在增/减计数模式下,TAxR从0增加到TAxCCR0然后再从TAxCCR0减到0。