专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

msp430单片机定时器Timer_A

作者:佚名   来源:本站原创   点击数:  更新时间:2014年08月31日   【字体:


Timer_A定时器:

 

 

注:msp430有两个16位定时器Timer_A和Timer_B.二者基本相同。

主要有TACTL,TAR,CCTL0,CCR0,CCTL1,CCR1,CCTL2,CCR2,TAIV几个寄存器。其中最主要的是TACTL寄存器,它决定Timer_A的输入时钟信号,Timer_A的工作模式,Timer_A的开启与停止,中断的申请等。

 

定时器A大致可分为四个功能模块:计数器、比较/捕获寄存器0、比较/捕获寄存器1、比较/捕获寄存器2。计数器是主体它是一个开启和关闭的定时器,如果开启它就是一直在循环计数,只会有一个溢出中断,也就是当计数由0xffff到0时会产生一个中断。那怎么实现定时功能呢?这就要靠三个比较/捕获寄存器了以后用CCRx表示。CCR0比较特殊,通过他可以改变计数器的最大计数值,也就是当计数器计数到CCR0的值时自动会将计数器清零。但这需要设置相应的工作模式,模式列表如下:

0——停止模式,用于定时器的暂停

1——增计数模式,计数器计数到CCR0,再清零计数

2——连续计数模式,计数器增计数到0xffff,再清零计数

3——增/减计数模式,增计数到CCR0,再减计数到0

当计数器计数到CCR0时,CCR0单元会产生一个中断。同样当计数器计数到CCR1和CCR2时,两个单元也都会个产生一个中断。这样我们可以通过定时器A得到三个定时时间了。

看程序中的定时器初始化模块。CCTLx是相应比较/捕获寄存器的控制寄存器。它可对比较/捕获寄存器进行设置,在这里只用到比较功能,也就是当计数到CCRx时产生中断,由于CCTLx默认的是比较功能,所以一般也就只用到CCIE这个控制字,就是开启相应比较器的中断。CCRx就是相应比较器的值。

 

 

下面介绍几个Timer_A的重要寄存器:

 

TACTL寄存器:

15~10

9

8

7

6

5

4

3

2

1

0

未用

SSEL1

 

SSEL0

ID1

ID0

MC1

MC0

未用

CLR

TAIE

TALFG

 

 

 

SSEL_1   SSEL_0 是时钟源的选择

0——TACLK,使用外部引脚信号作为输入

1——ACLK,辅助时钟

2——SMCLK,子系统主时钟

3——INCLK,外部输入时钟

对TACTL进行模式设置的同时也开启了定时器,要停止只需把MC_0赋值给TACTL就可以。

ID1 ID0 是时钟源的分频选择

00——不分频

01——2分频

10——4分频

11——8分频

MC1 MC0 是模式选择

0——停止模式,用于定时器的暂停

1——增计数模式,计数器计数到CCR0,再清零计数

2——连续计数模式,计数器增计数到0xffff,再清零计数

3——增/减计数模式,增计数到CCR0,再减计数到0

CLR——————定时器清楚位

TAIE——————定时器中断允许位

TAIFG——————定时器溢出标志位

TAR寄存器:

16位计数器,是执行计数的单元,是计数器的主体。我的理解:即存储你的计数值,0——>CCR0

CCTLx寄存器:

捕获比较控制寄存器:

15/14

13/12

11

10

9

8

7/6/5

4

3

2

1

0

CAPTMOD1~0

CCIS1~0

 

SCS

SCCIx

 

CAP

OUTMODx

CCIEx

CCIx

OUT

COV

CCIFGx

CAPTMOD1~0:选择捕获模式

0 0————禁止捕获模式

0 1————上升沿捕获

1 0————下降沿捕获

1 1————上升沿与下降沿都捕获

CCIS1~0: 捕获事件输入源

0 0————选择CCIxA

0 1————选择CCIxB

1 0————选择GND

1 1————选择Vcc

SCS——选择捕获信号与定时器时钟同步、异步关系

0:异步捕获

1:同步捕获(实际中经常使用同步模式,捕获总是有效的)

SCCIx——比较相等信号EQUx将选中的捕获/比较输入信号CCIx(CCIxA,CCIxB,Vcc和GND)进行锁存,然后可由SCCIx读出。

CAP——选择捕获模式还是比较模式。

0:比较模式

1:捕获模式

OUTMODx:  选择输出模式

0 0 0————输出

0 0 1————置位

0 1 0————PWM翻转/复位

0 1 1————PWM置位/复位

1 0 0————翻转

1 0 1————复位

1 1 0————PWM翻转/置位

1 1 1————PWM复位/置位

CCIEx——捕获/比较模块中断允许位

0:禁止中断

1:允许中断

CCIx——捕获/比较模块的输入信号

捕获模式:由CCIS0和CCIS1选择的输入信号可通过该位读出

比较模式:CCIx复位

OUT——输出信号(如果OUTMODx选择输出模式0,则该位对应于输入状态)

0:输出低电平

1:输出高电平

COV——捕获溢出标志

0:没有捕获溢出

1:发生捕获溢出

当CAP=0时,选择比较模式。捕获信号发生复位。没有使COV置位的捕获事件

当CAP=1时,选择捕获模式。如果捕获寄存器的值被读出前再次发生捕获事件,则COV置位。程序检测COV来判断原值读出前是否又发生捕获事件。读捕获寄存器时不会使溢出标志复位,须用软件复位。

CCIFGx——捕获比较中断标志

捕获模式:寄存器CCRx捕获了定时器TAR值时置位

比较模式:定时器TAR值等于寄存器CCRx值时置位
 

 

 

#include <msp430x14x.h>
/********************函数声明******************/
void InitClock();
/********************主函数********************/
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD; // Stop WDT
  InitClock(); // Initialize the clock
  
  P3DIR |= BIT4; // P3.4 output
  CCTL0 = CCIE; // CCR0 interrupt enabled
  CCR0 = 500;
  TACTL = TASSEL_2 + MC_1; // SMCLK, Up to CCR0 mode
  _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
/*******************************************
函数名称:InitClock
功 能:初始化时钟函数
参 数:无
返回值 :无
********************************************/
void InitClock()
{
  unsigned int oscdly;
  BCSCTL1 &= ~XT2OFF; //------------清OSCOFF/XT2,使XT2振荡器有效
  do
  {
    IFG1 &=~OFIFG; //------------清OFIFG
    oscdly=255;
    while(oscdly--); //------------延时等待
  }
  while(IFG1 & OFIFG); //------------直到OFIFG=0为止
  
  //-------------------------------------------------------------
  DCOCTL |= DCO0 + DCO1 + DCO2; // Max DCO
  BCSCTL1 |= RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL
  //这两句设置DCOCTL和BCSCTL1,设置DCO的频率
  //一般来说,PUC复位之后,如果没有特定设置系统时钟MCLK,MCU将默
  //认DCO振荡器产生的频率为系统时钟,不过如果设置BCSCTL2来选定
  //MCLK的时钟源的话(如:BCSCTL2 |= SELM_2+SELS;)系统时钟就是由
  //XT2振荡而来.
  //-------------------------------------------------------------
  BCSCTL2 |= SELM_2+SELS; //SMCLK and MCLK uses XT2
  //这一句设置BCSCTL2,选定MCLK和SMCLK的时钟源
  //注意:ACLK只能来源于LFXT1.可以在BCSCTL1里设置ACLK的分频。
  //-------------------------------------------------------------
}
/*******************************************
函数名称:Timer_A
功 能:定时器A中断服务子函数,当
参 数:无
返回值 :无
********************************************/
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P3OUT ^= BIT4; // Toggle P3.4

}


// Software release:IAR Assembler for MSP430 V4.09A/W32 (4.9.1.9)
//******************************************************************************
#include <msp430x14x.h>
/********************函数声明******************/
void InitClock();
/********************主函数********************/
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD; // Stop WDT
  InitClock(); // Initialize the clock
  
  P3DIR |= BIT4; // P3.4 output
  CCTL0 = CCIE; // CCR0 interrupt enabled
  CCR0 = 500;
  TACTL = TASSEL_2 + MC_1; // SMCLK, Up to CCR0 mode
  _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
/*******************************************
函数名称:InitClock
功 能:初始化时钟函数
参 数:无
返回值 :无
********************************************/
void InitClock()
{
  unsigned int oscdly;
  BCSCTL1 &= ~XT2OFF; //------------清OSCOFF/XT2,使XT2振荡器有效
  do
  {
    IFG1 &=~OFIFG; //------------清OFIFG
    oscdly=255;
    while(oscdly--); //------------延时等待
  }
  while(IFG1 & OFIFG); //------------直到OFIFG=0为止
  
  //-------------------------------------------------------------
  DCOCTL |= DCO0 + DCO1 + DCO2; // Max DCO
  BCSCTL1 |= RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL
  //这两句设置DCOCTL和BCSCTL1,设置DCO的频率
  //一般来说,PUC复位之后,如果没有特定设置系统时钟MCLK,MCU将默
  //认DCO振荡器产生的频率为系统时钟,不过如果设置BCSCTL2来选定
  //MCLK的时钟源的话(如:BCSCTL2 |= SELM_2+SELS;)系统时钟就是由
  //XT2振荡而来.
  //-------------------------------------------------------------
  BCSCTL2 |= SELM_2+SELS; //SMCLK and MCLK uses XT2
  //这一句设置BCSCTL2,选定MCLK和SMCLK的时钟源
  //注意:ACLK只能来源于LFXT1.可以在BCSCTL1里设置ACLK的分频。
  //-------------------------------------------------------------
}
/*******************************************
函数名称:Timer_A
功 能:定时器A中断服务子函数,当
参 数:无
返回值 :无
********************************************/
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P3OUT ^= BIT4; // Toggle P3.4

}

 


 
关闭窗口

相关文章