定时器加计数器延长计时时间,如何使用定时计数器实现信号扩展
chanong
|Timer_A 是一个16 位定时器/计数器,具有多达7 个捕获/比较寄存器。 Timer_A 可支持多重捕获/比较、PWM 输出和间隔定时。 Timer_A 还具有广泛的中断功能。计数器溢出或每个捕获/比较寄存器可以生成中断。 Timer_A 具有以下性能特征:
具有4 种工作模式的异步16 位定时器/计数器可选择和可配置的时钟源多达7 个可配置的捕获/比较寄存器具有脉冲宽度调制(PWM) 功能的可配置输出异步输入/输出锁存所有中断向量寄存器用于定时器中断的快速解码TAxR :16 位定时器/计数器寄存器,在时钟信号的每个上升沿递增或递减(取决于操作模式)。 TAxR 可以使用软件读写。此外,定时器可以在溢出时生成中断。定时器有四种工作模式:停止、增加、连续和增加/减少。使用TAxCTL.MC 位选择工作模式。
定时器工作模式
加计数模式:如果您需要定时器周期不同于0FFFFh,请使用“加计数”模式。定时器重复计数直到比较寄存器TAxCCR0 的值,该值定义了周期(见下图)。期间定时器计数的数量为TAxCCR0+1。当定时器值等于TAxCCR0时,定时器再次从0开始计数。如果定时器值大于TAxCCR0 并且选择“向上计数”模式,则定时器立即从0 开始计数。
向上计数模式
当定时器计数到TAxCCR0 值时,TAxCCTL0.CCIFG 中断标志被置位。当定时器从TAxCCR0 计数到0 时,TAxCTL.TAIFG 中断标志被置位。下图显示了标志设置循环
向上计数模式标志设置
如果在定时器运行时更改TAxCCR0,如果新周期大于或等于旧周期或大于当前计数值,则定时器将计数到新周期。如果新周期小于当前计数值,则定时器重置为0。然而,在返回到0 之前可能会发生额外的计数。项目介绍: MCU 型号: MSP430F6736A 编译平台: IAR 6.40.1 MSP430 实验项目: Timer0_A: 向上计数模式计数: TA0R 从0 向上计数到TA0CCR0,TA0R 返回到0,TA0R 为0 从TA 向上计数到0CCR0 ; 返回到T A0R 0; 这样,时钟: REFOCLK(标准频率为32.768 kHz)循环为ACLK SMCLK MCLK Timer0_A 时钟=ACLK 中断: Timer0_A 溢出(中断标志: TA0CTL.TAIFG) TA0R 从TA0CCR0 返回时产生中断:至0。当从模块0(中断标志: TA0CCTL0.CCIFG)(TA0CCR0-1)转换到TA0CCR0 时,会生成TA0R。
#include 'msp430.h'#include 'msp430f6736a.h'void main(void){ WDTCTL=WDTPW + WDTHOLD; //禁用看门狗__bic_SR_register(GIE); //禁用所有中断//禁用REFO 选择(内部校准低频振荡器) ,典型频率为32.768 kHz) : as ACLK SMCLK MCLK UCSCTL4=SELA__REFOCLK | SELS__REFOCLK | SELM__REFOCLK; //------------- ----- -- -------- ---------------------------- ----- --------- ---- //Timer0_A 设置//-------------------------- --- ------- --------- -------------------------------- --- --- ------------ --- //时钟选择: ACLK //计数模式: 向上计数(TA0R 从0 向上计数到TA0CCR0。TA0R 返回到0。TA0R 向上计数)再次从0 向上计数到TA0CCR0;TA0R 回到0;循环this) //TA0R 清0 //溢出中断使能,溢出时间=TA0CCR0/ACLK=4096/32768=125ms TA0CTL=TASSEL__ACLK | MC__UP | TACLR | TAIE; //-------- ---- --------------------------- ------- - - - - - - - - - - - - - - - - - - - - - - - - //比较捕获/模块0 设置//-- ----- -------------------- ----- --- --------- ---------------------------- //比较模式//捕获/比较模块0 中断使能,中断周期=TA0CCR0/ACLK=4096/32768=125ms TA0CCTL0=CCIE; //捕获/比较模块0 和TA0R 的值, //更改此值可能会改变中断周期,因为它们之间存在差异两次中断即可得到定时时间TA0CCR0=4096; //---------------------------------------- --------- - -------------------------------------------------------- ----- -- -- ------- //端口3 : P3.7 P3.6 P3.5 P3.4作为流水灯输出,引脚功能:I/O模式:输出//---- --- --- ------------------------- --------- - --------- ------------------------- P3SEL=0; P3DIR=0xf0; P3OUT=0xf0; //- ---------- ------------------------------- ---------- - -------- -------------------------------------------------------- - //端口J : Timer0_A 溢出中断1 次PJ.0 电平切换1 次//Timer0_A 捕捉/比较模块0 中断1 次PJ.1 电平切换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 中断服务程序(中断标志: TA0CCTL0.CCIFG)//***** **************** *** ****************************************************** ********** *** **************************#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)
如果您继续关注,我稍后将分享MSP430 系列和ST 系列MCU 中每个模块的编程示例。








