Timer_A是一个16位定时器/计数器,最多有7个捕获/比较寄存器。Timer_A可支持多个捕获/比较、PWM输出和间隔定时。Timer_A还具有广泛的中断功能。计数器的溢出和每个捕获/比较寄存器都可以产生中断。
Timer_A有以下性能特点:
具有四种工作模式的异步16位定时器/计数器 可选择和可配置的时钟源 最多七个可配置的捕获/比较寄存器 具有脉宽调制(PWM)功能的可配置输出 异步输入输出闭锁 中断向量寄存器,用于快速解码所有定时器中断
TAxR:
16位定时器/计数器寄存器,随时钟信号的每个上升沿递增或递减(取决于操作模式)。TAxR可以用软件读写。此外,定时器在溢出时可以生成中断。
定时器有四种工作模式:停止、增、连续和增/减。使用TAxCTL.MC位选择操作模式。
增计数模式:
如果定时器周期必须与0FFFFh不同,则使用‘增计数’模式。定时器重复计数到比较寄存器 TAxCCR0的值,它定义了周期(见下图)。期间内定时器计数的数量是TAxCCR0+1。当定时器值等于TAxCCR0时,定时器重新从0开始计数。如果在定时器值大于TAxCCR0时选择了‘增计数’模式,则定时器将立即从0开始计数。
增计数模式
当定时器计数到TAxCCR0值时,置位IFG中断标志。当定时器从TAxCCR0计数到0时,置位TAxCTL.TAIFG中断标志。下图显示标志设置循环
增计数模式标志设置
在定时器运行时更改TAxCCR0时,如果新时段大于或等于旧时段或大于当前计数值,则定时器将向上计数到新时段。如果新时段小于当前的计数值,定时器将归0。但是,在归0之前,可能会出现一个额外的计数。
工程介绍:
MCU型号: MSP430F6736A
编译平台: IAR for MSP430 6.40.1
实验项目: Timer0_A: 增计数模式
计数: TA0R 从0增计数到TA0CCR0 ; TA0R归0 ;
TA0R从0增计数到TA0CCR0 ; TA0R归0 ; 如此循环
时钟: REFOCLK(典型频率为32.768 kHz) 作为 ACLK SMCLK MCLK
Timer0_A时钟 = ACLK
中断: Timer0_A 溢出 (中断标志: TA0CTL.TAIFG)
TA0R 从 TA0CCR0 归 0 时 产生
中断: 捕获/比较模块0 (中断标志: IFG)
TA0R 从 (TA0CCR0-1) 到 TA0CCR0 时 产生
#include "msp430.h"#include "msp430f6736a.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // 禁止看门狗__bic_SR_register(GIE);// 禁止所有中断// 选择 REFO (内部校准的低频振荡器, 典型频率为32.768 kHz): 作为 ACLK SMCLK MCLKUCSCTL4 = SELA__REFOCLK | SELS__REFOCLK | SELM__REFOCLK;//---------------------------------------------------------------------------------------------// Timer0_A设置//---------------------------------------------------------------------------------------------// 时钟选择: ACLK// 计数模式: 增计数 (TA0R 从0增计数到TA0CCR0 ; TA0R归0 ; TA0R再从0增计数到TA0CCR0 ; TA0R归0 ; 如此循环)// TA0R清0// 溢出中断允许, 溢出时间 = TA0CCR0 / ACLK = 4096 / 32768 = 125msTA0CTL = TASSEL__ACLK | MC__UP | TACLR | TAIE;//---------------------------------------------------------------------------------------------// 捕获/比较模块0设置//---------------------------------------------------------------------------------------------// 比较模式// 捕获/比较模块0 中断允许, 中断周期 = TA0CCR0 / ACLK = 4096 / 32768 = 125msTA0CCTL0 = CCIE;// 捕获/比较模块0 与TA0R相比较的数值,// 改变此值可以改变这2个中断的中断周期, 从而可以得到不同的定时时间TA0CCR0 = 4096;//---------------------------------------------------------------------------------------------// PORT 3 : P3.7 P3.6 P3.5 P3.4用作流水灯输出, 管脚功能:I/O 模式:输出//---------------------------------------------------------------------------------------------P3SEL = 0;P3DIR = 0xf0;P3OUT = 0xf0;//---------------------------------------------------------------------------------------------// PORT J : Timer0_A 溢出中断一次 PJ.0 电平切换一次//Timer0_A 捕获/比较模块0 中断一次 PJ.1 电平切换一次//---------------------------------------------------------------------------------------------PJSEL = 0;PJDIR = 0x0f;PJOUT = 0x0f;// 中断总使能__bis_SR_register(GIE);while(1);}//*************************************************************************************************// Timer0_A 溢出中断服务程序 (中断标志: TA0CTL.TAIFG)//*************************************************************************************************#pragma vector=TIMER0_A1_VECTOR /* 0xFFEC Timer0_A CC1-CC2, TA */__interrupt void TIMER0_A1_ISR(void){TA0CTL &= ~TAIFG; // 复位 Timer0_A 溢出中断标志(TAIFG)P3OUT ^= BIT7;PJOUT ^= BIT0;}//*************************************************************************************************// Timer0_A 捕获/比较模块0 中断服务程序 (中断标志: IFG)//*************************************************************************************************#pragma vector=TIMER0_A0_VECTOR /* 0xFFEE Timer0_A CC0 */__interrupt void TIMER0_A0_ISR(void){P3OUT ^= BIT6;PJOUT ^= BIT1;}
PJ.0: Timer0_A溢出中断(每125ms,电平切换一次,所以频率=4Hz)
PJ.1: 捕获/比较模块0 中断(每125ms,电平切换一次,所以频率=4Hz)