MSP430_定时器A的使用
- 格式:docx
- 大小:542.06 KB
- 文档页数:25
MSP430定时器A捕捉脉实例[调试通过,很好用]微控论坛原创主贴作者:fangthMicrocontrol CODE/*****************************************************************//功能:利用定时器A的捕捉能测量脉冲信号的脉宽////// MSP430F449// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P1.5/ACLK|---+// | | |// | P2.0/TA2|<--+// | |// | |//说明:ACLK要进行8分频(4K),并将其作为外部的要捕获的脉冲;//MCLK=SMCLK=8M;*****************************************************************/#include <msp430x44x.h>int pwm_start,pwm_end,pwm_wide=0;void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTP1DIR = 0x20; // P1.5 输出P1SEL = 0x20; // P1.5输出ACLKP2SEL|=BIT0; //P2.0 CCI2ASCFI0 |= FN_4;SCFQCTL = 121; // (121+1) ×32768 *2= 7.99MhzFLL_CTL0=DCOPLUS+OSCCAP1; //MCLK=SMCLK=8MFLL_CTL1 |= FLL_DIV_8; //ACLK要进行8分频,ACLK=4KTACCTL2 =CAP+CM_3+CCIS_0+SCS+CCIE; //捕获模式,上升和下降都捕获,选择CCI2A,同步,捕获中断开//Capture input select: 0 - CCI2ATACTL = TASSEL_2 + MC_2 ; //SMCLK=8M,L连续计数模式_EINT(); //开总中断LPM0;_NOP();pwm_wide=pwm_end-pwm_start;while(1);}// Timer_A3 Interrupt Vector (TAIV) handler#pragma vector=TIMERA1_VECTOR__interrupt void Timer_A(void){switch(TAIV){case 2:break;case 4:if(TACCTL2 & CCI)pwm_start=CCR2;elsepwm_end=CCR2;//pwm_wide=pwm_end-pwm_start;break;case 10:break;}LPM0_EXIT;}检验方法:在调试环境下,在watch 窗口观察pwm_end和pwm_start,然后相减!我计算了一下。
MSP430F1系列定时器A结构图[1]TimerA模块结构组成在MSP430F1XX-TimerA的结构中,分别由TA基础模块、CCR0、CCR1、CCR2子模块。
TA基础模块:[1]TA基础子模块主要完成定时器时钟源的输入(时钟源的选择、分频)。
[2]TA定时器计数。
[3]定时器的工作模式设置。
CCR0、CCR1、CCR2子模块:CCRx全称为Capture Compare Register-捕获比较寄存器,这些子模块有着捕获和比较的功能。
捕获、比较信号的触发源可以从芯片的外部引脚、CPU的外围模块输入来。
同时CCRx子模块也有其输出信号OUT.x ,此OUT.x可以输出到芯片的外部引脚、或输入到CPU的外围模块中。
CCRx与TAR(Timer A Register - 简称:TAR )结合使可以实现特定的的功能。
常用TimerA可以实现功能:PWM信号输出功能:通过设置TA的工作模式,结合CCR0、CCR1或CCR2计数。
直从CCR0、CCR1或CCR2中子模块的OUT.x端输出。
Slope AD转换功能:利用定时器A与比较器A结合设计成斜边数模转换器。
实现软USART功能:利用CCR0子模块中的捕获输入功能,结合TAR实现通用串行异步通讯功能(USART)。
ADC12模块的采样信号:利用定时器的TAR或CCR0实现OUT.x输出得到ADC12模块所需要的采样触发信号。
其它应用...。
[2]TimerA 模块工作模式[TA工作模式]TA定时器的工作模式有4种,这4种模式由TACTL寄存器的MC1、MC0位控制:模式 MC1 MC0 功能说明停止0 0 TA为停止(上电状态)增计数0 1 TAR增计数至CCR0,然后回到0。
连续计数 1 0 TAR连续计数至FFFFH,然后回到0。
增/减计数 1 1 TAR增计数至CCR0,然后减计数至0。
[时钟输入]定时器A时钟源有4种选择,分别为外部时钟TACLK、辅助时钟ACLK、子系统时钟SMCLK及INCLK。
MSP430单片机定时器A结构及其应用范例MSP430单片机定时器A结构及其应用范例1-简介简介MSP430单片机定时器A结构及其应用范例。
2-定时器模块在MSP430系列单片机中带有功能强大的定时器资源,这定时器在单片机应用系统中起到重要的作用。
利用MSP430(以下称为430)单片机的定时器可以用来实现计时,延时,信号频率测量,信号触发检测,脉冲脉宽信号测量,PWM信号发生。
另外通过软件编写可以用作串口的波特率发生器。
后面我们将用定时器A作为一个波特率发生器,来编写一个串口例程给初学者参考。
以加强初学者对定时器A的理解和应用。
在430的大系列产品中,不同的子系列产品定时器资源有所不同;在F11X,F11X1中是不带定时器B资源的。
430的定时器主要分为3部分模块:看门狗定时器,定时器A,定时器B。
定时器A主要资源特点有16位定时计数器,其计数模式有4种。
多种计数时钟信号供选择。
3个可配置输入的捕获/比较功能寄存器和8种输出模式的3个可配置输出单片。
以上各块定时器资源可作多种组合使用,以实现强大的功能。
定时器资源功能说明(1)看门狗定时器(WDT):主要用于程序在生错误时用作单片机系统复位重起的。
另外,也可作为一个基本定时器使用。
(2)定时器A:作基本定时器使用,结合捕获/比较功能模块可实现时序控制,可编程波形信号发生输出。
可作串口波特率发生器使用。
(3)定时器B:作基本定时器使用,与定时器A基本相同,但是功能方面有某些功能会比A 增强些。
详情请看关于定时器B应用范例。
3-定时器A模块结构4-定时器A--基础应用例程(1)//例程描述:利用定时器定时功能,实现P1.0方波输出。
MSP430F149的定时器A定时操作1)定时器A的图解图1 定时器A图解2)定时器A的四种计数模式。
1.停止模式。
2.增计数模式。
(产生两个中断标志)也就是当计数到跟TACCR0一样的时候,就返回0,重新计数。
当计数到TACCR0的同时产生一个中断标志CCIFG,而当计数器溢出返回零的同时又同时产生一个中断标志TAIFG。
如图:图2 增计数模式的波形图3.连续计数模式。
(产生一个中断标志)也就是计数器将直接计数到计数器所能计数的最大值0FFFFH之后重新返回零,再次计数。
返回零的同时产生一个TAIFG中断标志。
如图:4.增减计数模式。
(产生两个中断标志)也就是当计数器计数到跟TACCR0一样的之后,然后从TACCR0开始又减少,直到为零,然后又开始增。
当计数跟TACCT0一样的时候产生一个中断标志CCIFG,当减到为零的时候又产生一个中断标志TAIFG。
如图:注意:当重新写入TACCR0数值的时候,当新的数据大于原来的数值的时候,计数器将计数到新的数值才重新返回零;当新的数据小于原来的数值的时候,计数器将直接返回零重新计数。
3)定时器A的寄存器。
1.TACTL●TASSELx:计时器A的时钟来源选择。
●IDx:计时器A时钟的分频选择。
●MCx:计时器A四种计数模式选择。
●TACLR:计数器A的TAR计数清零,同时也可以清楚时钟分频器和计数方向。
●TAIE:TAIFG中断标志使能。
在捕获模式下可以打开所有CCIFG的中断使能。
●TAIFG:中断标志位。
2.TAR计数器的计数寄存器。
3.TACCTLx●CMx:捕获模式选择。
00:关闭;01:上升沿捕获;10:下降沿捕获;11:上升下降沿捕获。
●CCISx:捕获引脚选择。
●SCS:选择捕获电平方式。
0异步时钟;1同步时钟。
●SCCI:锁存同步时钟输入端。
也就是锁存EQUx的值,以供CPU读取。
●CAP:捕获模式和比较模式选择。
0比较;1捕获。
●OUTMODx:输出模式选择。
单片机MSP430 - Timer_A 定时器中断程序一、利用定时器定时功能,实现定时器单个溢出中断,实现P3.0 方波输出#include “cc430x613x.h”void main(){WDTCTL = WDTPW + WDTHOLD; // 停止看门狗定时器P3DIR |= 0x04; // P3 口初始化,设置为输出模式TA0CCR0 = 32768; // 定义中断计数周期1s,时钟频率为32.768MHZ,32768 / 32768 = 1sTA0CCTL0 = CCIE; // TA0CCR0 捕获/比较中断寄存器中断使能TA0CTL = TASSEL_1 + MC_1 + TACLR; // TASSEL_1,ACLK 时钟源MC_1,增计数模式_BIS_SR(LPM3_bits + GIE); // 进入LPM3 低功耗模式,开启总中断}#pragma vector = TIMER0_A0_VECTOR__interrupt void Timer_A(void) // 定时器中断触发,P3 输出口异或,电平翻转{P3OUT – 0x04;二、利用定时器定时功能,实现定时器多个溢出,对应产生多个中断,实现P3.0 输出#include “cc430x613x.h”void main(){WDTCTL = WDTPW + WDTHOLD; // 停止看门狗定时器P3DIR |= 0x04; // P3 口初始化,设置为输出模式TA0CCR0 = 32768; // 定义中断计数周期1s,时钟频率为32.768MHZ,32768 / 32768 = 1sTA0CCTL0 = CCIE; // TA0CCR0 捕获/比较中断寄存器中断使能TA0CCR1 = 3276; // 定义中断溢出周期100msTA0CCTL1 = CCIE; // TA0CCR0 捕获/比较中断寄存器中断使能TA0CTL = TASSEL_1 + MC_1 + TACLR; // TASSEL_1,ACLK 时钟源MC_1,增计数模式_BIS_SR(LPM3_bits + GIE); // 进入LPM3 低功耗模式,开启总中断}#pragma vector = TIMER0_A0_VECTOR__interrupt void Timer_A(void) // 1s 溢出中断P3OUT = ~0x04;}#pragma vector = TIMER0_A1_VECTOR__interrupt void Timer_A1(void) // 100ms 溢出中断{switch(TA0IV){case 2:P3OUT = 0x04;break;case 4:break;case 10:break;}}tips:感谢大家的阅读,本文由我司收集整编。
定时器A用到CCR0定时器A的中断可由定时器溢出引起,也可由捕获/比较器模块产生。
每个捕获/比较模块可以独立编程,由捕获/比较外部信号产生中断。
定时器A使用两个中断向量,一个单独分配给捕获/比较寄存器CCR0;另一个作为共用中断向量用于定时器和其他的捕获/比较寄存器。
捕获/比较寄存器CCR0中断向量具有最高优先级,因为CCR0主要用来定义定时器的工作模式,而这是定时器A其他功能的基础,需要最快速的服务。
开启定时器应该在修改定时器工作频率之前。
CCR1,CCR2和定时器共用另一个中断向量,属于多源中断。
由向量中断寄存器TAIV决定由哪个中断标志来触发中断。
中断标志产生数据表:中断优先级中断源缩写 TAIV 的内容最高捕获/比较器1 CCIFG1 2捕获/比较器2 CCIFG2 4定时器溢出 TAIFG 10最低没有中断将挂起 0PxDIR输入/输出方向寄存器0:I/O引脚切换成输入模式 PxIN1:I/O引脚切换成输出模式 PxOUTPxIE中断使能寄存器0:禁止该中断 1:允许该中断PxIES中断触发沿选择寄存器如果允许Px口的某个引脚中断,还需要定义该引脚的中断触发沿。
0:上升沿使相应标志置位 1:下降沿使相应标志置位PxSEL功能选择寄存器0:选择引脚为I/O端口 1:选择引脚为外围模块功能上电复位信号:POR(power-on reset)上电清除复位信号:PUC(power-up clear)POR信号的产生总会产生PUC信号,但是PUC信号的发生不一定会产生POR信号。
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
TACTL是最为主要的控制寄存器,它决定了TA的输入时钟信号、TA的工作模式、TA的开启与停止、中断的申请等工作。
上次Cloud和大家一起学习完了MSP430的时钟配置,这一篇,我们来学习MSP430单片机的TimerA(定时/计数器A)。
MSP430单片机的TimerA具有非常强大的功能,相关的寄存器配置也相当复杂,Cloud花了好久才逐步理清学习思路,尤其是学习数据手册的相关描述。
在这里Cloud提醒大家,虽然现在网上有中文汉化版的数据手册,但Cloud阅读英文原版后对比发现还是英文原版对器件特性描述得更加清楚,而中文汉化版的省略掉了一些内容。
好吧,扯远了。
下面进入正题:一、MSP430的Timer结构首先让我们通过官方描述来初步了解一下MSP430单片机的Timer资源:定时器A是一个16位的定时/计数器。
定时器A支持多重捕获/比较,PWM输出和内部定时。
定时器还有扩展中断功能,中断可以由定时器溢出产生或由捕获/比较寄存器产生。
定时器A的特性包括:·四种运行模式的异步16位定时/计数器·可选择配置的时钟源·可配置的PWM输出·异步输入和输出锁存·对所有TA中断快速响应的中断向量寄存器MSP430G2553单片机共有两个TimerA,分别是Timer0A和Timer1A。
OK,零零总总说了这么多,大家一定带有很多的疑惑,比如什么叫“捕获/比较”等,这里Cloud先不作解释,会用才是王道。
我们呢先找来定时器A的结构图给大家初步了解一下定时器A的结构:我们先从上面部分开始解释。
中间红色的是一个16位的TimerA,TAR,这其实就是MSP430单片机内部的一个定时计数器了,类似于51中的TH0和TL0的合体。
既然可以拿来计时,那么肯定可以有时钟信号输入,让我们最左边黄色的框,是一个选择器,由上面的TASSEL来选择TACLK、ACLK、SMCLK、INCLK的其中一种时钟。
上次我们已经学习过ACLK和SMCLK,也知道如何配置这两个时钟了(这也是为什么先学习时钟的原因),另外两个是外部时钟源,其中TACLK可以由P1.0输入。
MSP430F5系列16位超低功耗单片机模块原理第12章Timer A 定时器A版本: 1.0日期: 2008.10.原文: TI slau208.pdf (5xxfamily User's Guide)翻译: 许俊超软件工程师郑州市编辑: DC 微控技术论坛版主注:以下文章是翻译TI slau208.pdf 文件中的部分内容。
由于我们翻译水平有限,有整理过程中难免有所不足或错误;所以以下内容只供参考.一切以原文为准。
文章更新详情请密切留意微控技术论坛。
第12章Timer A定时器A是一个复合了捕获/比较寄存器的十六位的定时/计数器。
本章介绍MSP430X5XX的定时器A。
章节12.1 定时器A介绍12.2 定时器A操作12.3 定时器A寄存器12.1 定时器A介绍定时器A是一个十六位的定时/计数器,其捕获/比较寄存器多达七个。
定时器A支持支持多重捕获/比较,PWM输出和内部定时。
定时器还有扩展中断功能,中断可以由定时器溢出产生或由捕获/比较寄存器产生。
定时器A的特性包括:○四种运行模式的异步16位定时/计数器○可选择配置的的时钟源○多达七个可配置的捕获/比较寄存器○可配置的PWM输出○异步输入和输出锁存○对所有TA中断快速响应的中断向量寄存器定时器A的结构图如图12-1图12-1 定时器A的结构图12.2TIMER_A 操作方法TIMERA模块由用户软件来配置,TIMERA的使用在下面的章节中讨论。
12.2.116位定时/计数器寄存器TAR,随着时钟信号的第个上升沿增/减(由模式所决定)。
TAR 可以由软件读写。
除此之外,定时器溢出时可以产生中断。
TAR可以通过设置TACLR位来清除。
在UP/DOWN模式下,设置TACLR也可以清除时钟分频器和计数方向。
注意:修改TIMERA寄存器建议在修改定时器运行模式前先停止定时器(中断使能、中断标志、TACLR例外),以避免产生求知的误操作。
当TACLK与CPU时钟不同步时,当定时器没有运行时TAR的读将产生,其结果也是不可预料的。
第四讲定时器A 的使用MSP430F413芯片中含有TimerA3模块,如图1-2所示。
其常用的外引线有三条:TACLK 、 TA1 和 TA2。
TACLK :定时器_A 输入时钟(48脚),与P1.6和ACLK 输出共用同一引脚。
TA1 :定时器_A 的第一通道输入、输出引脚(51脚)。
捕获方式:CCI1A 输入;比较方式: OUT1输出。
TA2 :定时器_A 的第二通道输入、输出引脚(45脚)。
捕获方式:CCI2A 输入;比较方式: 0UT2输出。
1定时器A 功能及结构定时器A 基本结构是一个十六位计数器,由时钟信号驱动工作,结构框图如图4-1所示。
TPSSEL1 TPSSELOC CM 11 CCM 10CCJ?A ―O CCIZB —0C4M> —6 VCC "&图4-1定时器A 结构图定时器A 具有多种功能,其特性如下:(1) 输入时钟可以有三种选择,可以是慢时钟(ACLK )、快时钟(SMCLK 与单片机主时 钟同频)和外部时钟。
(2) 能产生的定时中断、定时脉冲和 PWM (脉宽调制)信号,没有软件带来的误差。
TACLK ―ACLK ―O >7 MCLK —-O 弄 INCL K ―O XID1 II KJftCLRCarrjr'Zcr o TimerEquO---------------- ►设富TMFCCCISil JCCJ&4 —rCCJOB —cOID —13Wx —13CCISOOF—H比投罟o比血 CCMD1 CCMOOCCIS11 CCIS10CC11A —4 CC11B ―°GHD —0 vcc —°£炳捉,比戕餐存辭(riwQF.10? 3MOIm/moLQUO捕怩'比牧蒂存幣WIUOMI? OM11 CM10CCI2 CCM21 CCM20LUU?(3)不仅能捕获外部事件发生的时间,还可选择触发脉冲沿(由上升沿或下降沿触发)。
定时器A功能模块主要包括:(1计数器部分:输入的时钟源具有4种选择,所选定的时钟源又可以1、2、4或8分频作为计数频率,Timer_A可以通过选择4种工作模式灵活的完成定时/计数功能。
(2)捕获/比较器:用于捕获事件发生的时间或产生时间间隔,捕获比较功能的引入主要是为了提高I/O端口处理事务的能力和速度。
不同的MSP430单片机,Timer_A模块中所含有的捕获/比较器的数量不一样,每个捕获/比较器的结构完全相同,输入和输出都取决于各自所带控制寄存器的控制字,捕获/比较器相互之间完全独立工作。
(3)输出单元:具有可选的8种输出模式,用于产生用户需要的输出信号,支持PWM输出。
2•定时器工作模式(1停止模式:停止模式用于定时器暂停,并不发生复位,所有寄存器现行的内容在停止模式结束后都可用。
当定时器暂停后重新计数时,计数器将从暂停时的值开始以暂停前的计数方向计数。
例如,停止模式前,Timer_A工作于增/减计数模式并且处于下降计数方向,停止模式后,Timer_仍然工作于增/减计数模式,从暂停前的状态开始继续沿着下降方向开始计数。
如果不需这样,则可通过TACTL 中的CLR控制位来清除定时器的方向记忆特性。
(2)增计数模式:捕获/比较寄存器CCR0用作Timer_A增计数模式的周期寄存器,因为CCR0为16位寄存器,所以该模式适用于定时周期小于65536的连续计数情况。
计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等(或定时器值大于CCR0的值)时,定时器复位并从0开始重新计数。
增计数模式的计数过程如图4-2所示。
通过改变CCR0值,可重置计数周期。
图4-2增计数模式示意图(3)连续计数模式:在需要65536个时钟周期的定时应用场合常用连续计数模式。
定时器(4)增/减计数模式需要对称波形的情况经常可以使用增/减计数模式,该模式下,定时器先增计数到值,然后反向减计数到0。
计数周期仍由CCRO定义,它是CCRO计数器数值的2倍计数过程如图4-4所示。
图4-4增/减计数模式3•增计数模式应用举例增计数最大值存储器在CCR0,该值计算方法如下:选用辅助时钟时,ACLK频率周期T=1/32768,若选用250ms中断,贝U CCR0值应为:0.25N 0.25 32768 =8192T转换成十六进制数后N=2000 ( H)MSP430F413单片机定时器A构成的时钟小系统程序清单如下:/****************************************************文件名称:MSP413C语言定时程序*文件说明:用MSP430F413定时器A作为定时中断源。
***************************************************/#i nclude <msp430x41x.h>/******************************************************文件说明:LCD模块*****************************************************]#defi ne LCD_IN_USE 10/******************************************************* 数据定义七段译码表*****************************************************/const un sig ned char NUM_LCD[17]={0xd7, 0x06, 0xe3, 0xa7, 0x36, 〃'0'~ '4'0xb5, 0xf5, 0x07, 0xf7, 0xb7, //'5' ~ '9'0x77, 0xf4, 0xd1,0xe6, 0xf1, // 'A'~ 'E'0x71, 0x00}; // 'F',全熄'unsigned char cd_Buf[LCD_IN_USE]; //自定义显示缓冲区,用于要显示的数据un sig ned int con t,y0,y1,y2;CCR0 的计数器的f=32768Hz,//秒、时、分存储变量LCD 模块初始化***************************************************** void init_LCD(void){char tmpv;BTCTL = BT_fLCD_DIV32;P5SEL = 0xfc;LCDCTL = LCDON+LCD4MUX+LCDP1;for (tmpv = 0;tmpv<10;tmpv++){LCDMEM[tmpv] = 0x00;}}/******************************************************* * LCD 清零模块*******************************************************/ void cl_LCD(void){char tmpv;for (tmpv = 0;tmpv<10;tmpv++) {LCDMEM[tmpv] = 0x00; //clear LCD }}// set LCD 时钟// 置为外围模块// 4Mux 模式//clear LCD更新LCD 缓冲区的内容,把数据显示到LCD**************************************************void lcd_Display(void) {char tmpv;lcd_Buf[0]=y2/10;lcd_Buf[2]=16;lcd_Buf[3]=y1/10; lcd_Buf[5]=16; lcd_Buf[1]=y2%10; lcd_Buf[4]=y1%10;lcd_Buf[6]=y0/10; lcd_Buf[7]=y0%10; lcd_Buf[8]=16; lcd_Buf[9]=16; for(tmpv=0;tmpv<LCD_IN_USE-1;tmpv++){LCDMEM[tmpv] = NUM_LCD[l cd_Buf[tmpv]]; // 更新 }}/*********************************************************** *定时器 A 中断服务程序************************************************************/ #pragma vector=TIMERA0_VECTOR__interrupt void Timer_A(void ) //interrupt[TIMERA0_VECTOR] void Timer_A (void) { cont=cont+1; if(cont==4){cont=0; y0=y0+1; //秒加 1if(y0==60){y0=0; y1=y1+1; //60 秒为 if(y1==60){y1=0; y2=y2+1; //60 分为 if(y2==24){y2=0 ; //24 小时再清零}}}cl_LCD(); lcd_Display();_NOP();LCDMEM 中的内容1 分 ,分加 11 小时 , 小时加 1}void init_TA(void) //初始化定时器 A{TACCR0 = 0x2000;TACTL = TASSEL0 + TACLR; // ACLK, 清零 Tar TACCTL0 = CCIE; // 中断使能 CCR0TACTL |= MC0; // 设置增模式启动定时器 A }/*********************************************************** *主程序************************************************************/4.输出单元定时器A 的输出单元输出模式有8种,增计数模式下输出模式如图4-5所示。
void main(void){WDTCTL = WDTPW +WDTHOLD; SCFQCTL |= SCFQ_4M; init_LCD(); init_TA() ; _EINT();cont=0; y0=0; y1=0; y2=0; for (;;){_BIS_SR(CPUOFF); _NOP();}}// 关 WDT// 设定主时钟为 4MHz// 使能中断//关 CPU // 调试程序使用IK』Mt IB特f就览PW kP/KP图4-5输出模式示意图各模式说明如下:(1输出模式0—输出模式:输出信号OUTx由每个捕获/比较模块的控制寄存器CCTLx 中的OUTx位定义,并在写入该寄存器后立即更新。