关闭

msp430学习笔记之定时器A

标签: msp430定时器比较模式
1272人阅读 评论(0) 收藏 举报
分类:

1 相关知识

1 定时器a图解

  
 1  定时器A图解
2  定时器A的四种计数模式
 

1. 停止模式。

2. 增计数模式。(产生两个中断标志)

当计数到跟TACCR0一样的时候,就返回0,重新计数。当计数到TACCR0的同时产生一个中断标志CCIFG,而当计数器溢出返回零的同时又同时产生一个中断标志TAIFG。如图:

2 增计数模式的时序图

3.连续计数模式(产生一个中断标志)

计数器将直接计数到计数器所能计数的最大值0FFFFH之后重新返回零,再次计数。返回零的同时产生一个TAIFG中断标志。如图

3 连续技术模式的时序图

如果相应中断位允许,每当一个定时间隔到都会产生中断请求,在连续计数模式下,须将下一事件发生的时间在当前中断程序中加到CCRx中,如图4,下次发生中断的时间等于在CCR0a发生中断时刻,CCR0 = CCR0a + Δt


4 连续计数模式下中断与CCRx关系


4 增减计数模式(产生两个中断标志)

当计数器计数到跟TACCR0一样的之后,然后从TACCR0开始又减少,直到为零,然后又开始增。当计数跟TACCR0一样的时候产生一个中断标志CCIFG,当减到为零的时候又产生一个中断标志TAIFG。如图:



图 5 增减计数模式时序图

相关寄存器这里就不一一介绍了,可以翻阅数据手册


2 代码实现

//本平台 msp430f149
#include <msp430f149.h>

volatile unsigned char count = 0,flag = 0;

void P2_config(){
	P2DIR = 0x80;
	P2OUT = 0xff;

}

void select_xt2(void){
	
	unsigned char i;
	
	/*------选择系统主时钟为8MHz-------*/
    BCSCTL1 &= ~XT2OFF;                 	
	do{    
    IFG1 &= ~OFIFG;                 		//清除晶振失败标志
        for (i = 0xFF; i > 0; i--);     	//等待8MHz晶体起振
    }while ((IFG1 & OFIFG));             	
	
    BCSCTL2 |= SELM_2 + SELS  ;           	//MCLK和SMCLK选择高频晶振	

}


void main(){
	WDTCTL = WDTPW + WDTHOLD;				       // 关狗
	select_xt2();								   //8MHz晶振	
	P2_config();
	
	CCTL0 = CCIE;                                  // CCR0 中断使能
 	CCR0 = 10000;
  	TACTL = TASSEL_2 + MC_2 + ID_3;                // SMCLK = 1MHz, 连续计数模式
	 _EINT();									   // 开启全局中断
	
	while(1){
		if(count == 50){
			count = 0;
			P2OUT  ^= BIT7 ;
	        
		}
		
	}

}

// Timer A0 中断服务函数
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  count ++;
  CCR0 += 10000;                            // 下次中断时间装入CCR0中
}


3 实验结果

       led灯间隔0.5s变化一次,说明使用定时器比较模式成功
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5071次
    • 积分:104
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档