当前位置:首页 > 单片机 > 单片机
[导读]MSP430的定时器中有比较捕获的概念,刚刚接触非常生疏。看了半天终于清楚:比较模式:这是定时器的默认模式,当在比较模式下的时候,与捕获模式相关的硬件停止工作,如果这个时候开启定时器中断,然后设置定时器终值

MSP430定时器中有比较捕获的概念,刚刚接触非常生疏。看了半天终于清楚:

比较模式:

这是定时器的默认模式,当在比较模式下的时候,与捕获模式相关的硬件停止工作,如果这个时候开启定时器中断,然后设置定时器终值(将终值写入TACCRx),开启定时器,当TAR的值增到TACCRx的时候,中断标志位CCIFGx置一,同时产生中断。若中断允许未开启则只将中断标志位CCIFGx置一。

例子:比较模式就像51单片机一样,要能够软件设置定时间隔来产生中断处理一些事情,如键盘扫描,也可以结合信号输出产生时序脉冲发生器,PWM信号发生器。如:不断装载TACCRx,启动定时器,TAR和TACCRx比较产生中断处理。

捕获模式:

利用外部信号的上升沿、下降沿或上升下降沿触发来测量外部或内部事件,也可以由软件停止。捕获源可以由CCISx选择CCIxA,CCIxB,GND,VCC。完成捕获后相应的捕获标志位CCIFGx置一

捕获模式的应用:

利用捕获源的来触发捕获TAR的值,并将每次捕获的值都保存到TACCRx中,可以随时读取TACCRx的值,TACCRx是个16位的寄存器,捕获模式用于事件的精确定位。如测量时间、频率、速度等

例子:利用两次捕获的值来测量脉冲的宽度。或捕获选择任意沿,CCISx=”11“(输入选择VCC),这样即当VCC与GND发生切换时产生捕获条件

结合利用:异步通讯

同时应用比较模式和捕获模式来实现UART异步通信。即利用定时器的比较模式来模拟通讯时序的波特率来发送数据,同时采用捕获模式来接收数据,并及时转换比较模式来选定调整通信的接受波特率,达到几首一个字节的目的

----------------------------------------

利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量。

本例程用到了定时器A的CCI1A端口(例如MSP430F14X的P1.2引脚)作捕获外部输入的脉冲电平跳变,同时结合简单的软件算法就能实现脉冲宽度的测量。在实际应用中可根据例程中的start,end,overflow三个变量来计算脉冲宽度。此功能模块在实际产品应用中体现出有较高的应用价值。

2-例程

#include

unsigned int start,end;

unsigned char overflow;

void main (void)

{

WDTCTL = WDTPW+WDTHOLD; //关闭看门狗定时器

P1DIR = BIT0+BIT4; //设置P1.0方向为输出

P1SEL = BIT2; //设置P1.2端口为功能模块使用

TACTL = TASSEL0+TACLR+TAIE+MC1; //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式

CCTL1 = MC0+SCS+CAP+CCIE; //输入上升沿捕获,CCI0A为捕获信号源

_EINT(); //中断允许

while(1); //LOOP

}

#pragma vector=TIMERA1_VECTOR //定时器A中断处理

__interrupt void timer_a(void)

{

switch(TAIV) //向量查询

{ case 2: //捕获中断

if(CCTL1&CM0) //上升沿

{

CCTL1=(CCTL1&(~CM0))|CM1; //更变设置为下降沿触发

start=TAR; //记录初始时间

overflow=0; //溢出计数变量复位

}

else if (CCTL1&CM1) //下降沿

{

CCTL1=(CCTL1&(~CM1))|CM0; //更变设置为上升沿触发

end=TAR; //用start,end,overflow计算脉冲宽度

}

break;

case 10: //定时器溢出中断

overflow++;

break; //溢出计数加1

default:break;

}

}

//例程结束

-----------------------------------

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——停止模式,用于定时器的暂停

[!--empirenews.page--]

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值时置位

//******************************************************************************

// Date: 2009.8.4

// Author: xurafreedom

// Email: freedomxura@gmail.com / mxh20999@163.com

// Blog: http://xurafreedom.cublog.cn

//

// Description: Toggle P3.4 using software and TA_0 ISR. Toggles every

// 50000 SMCLK cycles. SMCLK provides clock source for TACLK.

// During the TA_0 ISR, P3.4 is toggled and 50000 clock cycles are added to

// CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and

// used only during TA_ISR.

// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz

// Software release:IAR Assembler for MSP430 V4.09A/W32 (4.9.1.9)

//******************************************************************************

#include

/********************函数声明******************/

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来选定[!--empirenews.page--]

//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

}

[/td][/tr]

------------------------------

其实捕获相当于51的外部中断?只不过,MSP430里,把捕获和定时器做在了一起。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭