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寄存器:
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寄存器:
捕获比较控制寄存器:
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值时置位