msp430定时器a中文超级详解_第1页
msp430定时器a中文超级详解_第2页
msp430定时器a中文超级详解_第3页
msp430定时器a中文超级详解_第4页
msp430定时器a中文超级详解_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文章转载自网络- 感谢原作者的辛勤奉献 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 /更变设置为下降沿触发 start=TAR; /记录初始时间 overflow=0; /溢出计数变量复位 else if (CCTL1 /更变设置为上升沿触发 end=TAR; /用 start,end,overflow 计算脉冲宽度 break; case 10: /定时器溢出中断 overflow+; break; /溢出计数加1 default:break; /例程结束 - - msp430单片机定时器 Timer_A 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 寄存器: 1510 9 8 7 6 5 4 3 2 1 0 未用 SSEL1 SSEL0 ID1 ID0 MC1 MC0 未用 CLR TAIE TALFG SSEL_1 SSEL_0 是时钟源的选择 0TACLK,使用外部引脚信号作为输入 1ACLK,辅助时钟 2SMCLK,子系统主时钟 3INCLK,外部输入时钟 对 TACTL 进行模式设置的同时也开启了定时器,要停止只需把 MC_0赋值给 TACTL 就可以。 ID1 ID0 是时钟源的分频选择 00不分频 012分频 104分频 118分频 MC1 MC0 是模式选择 0停止模式,用于定时器的暂停 1增计数模式,计数器计数到 CCR0,再清零计数 2连续计数模式,计数器增计数到0xffff,再清零计数 3增/减计数模式,增计数到 CCR0,再减计数到0 CLR定时器清楚位 TAIE定时器中断允许位 TAIFG定时器溢出标志位 TAR 寄存器: 16位计数器,是执行计数的单元,是计数器的 主体。我的理解:即存储你的计数值,0 CCR0 CCTLx 寄存器: 捕获比较控制寄存器: 15/14 13 /1 2 11 10 9 8 7/6/5 4 3 2 1 0 CAPT MOD1 0 C CI S1 0 SC S SC CI x C AP OUT MOD x CC IE x CC Ix OU T COV CCIF Gx CAPTMOD10:选择捕获模式 0 0禁止捕获模式 0 1上升沿捕获 1 0下降沿捕获 1 1上升沿与下降沿都捕获 CCIS10: 捕获事件输入源 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 0PWM 翻转/复位 0 1 1PWM 置位/复位 1 0 0翻转 1 0 1复位 1 1 0PWM 翻转/置位 1 1 1PWM 复位/置位 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: / / Blog: / / 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 () /* * * #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 /-清 OSCOFF/XT2,使 XT2振荡器有效 do IFG1 /-清 OFIFG oscdly=255; while(oscdly-); /-延时等待 while(IFG1 /-直到 OFIFG=0为止 /- - DCOCTL |= DCO0 + DCO1 + DCO2; / Max DCO BCSCTL1 |= RSEL0 + RSEL1 + RSEL2; / XT2on, max RSEL /这两句设置 DCOCTL 和 BCSCTL1,设置 DCO 的频率 /一般来说,PUC 复位之后,如果没有特 定设置系统时钟 MCLK,MCU 将默 /认 DCO 振荡器产生的频率为系统时钟, 不过如果设置 BCSCTL2来选定 /MCLK 的时钟源的话 (如:BCSCTL2 |= SELM_2+SELS;)系统时钟就是由 /XT2振荡而来. /- - BCSCTL2 |= SELM_2+SELS; /SMCLK and MCLK uses XT2 /这一句设置 BCSCTL2,选定 MCLK 和 SMCLK 的时钟源

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论