关闭

msp430学习笔记之中断处理函数

标签: 定时器msp430中断处理函数比较模式
1929人阅读 评论(0) 收藏 举报
分类:

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

void select_xt2(void){
	
	unsigned char i;
	
	/*------选择系统主时钟为8MHz-------*/
    BCSCTL1 &= ~XT2OFF;                 //打开XT2高频晶体振荡噿    
	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();
	
	P2DIR = 0x80;
	P2OUT = 0xff
	
	CCTL1 = CCIE;                         	 // CCR1 中断使能
    CCR1 = 10000;
    TACTL = TASSEL_2 + MC_2 + ID_3;   		 // SMCLK = 1MHz, 连续计数模式
    _EINT();								//打开全局中断
	
	while(1){
		
		if(count == 50){
			count = 0;
			P2OUT ^= BIT7;                   //led灯每0.5s变化一次
		}
		
	}

}


#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
	
	CCR1 += 10000;                    // 
	count ++;

		
}

昨天写了一段这样的代码,本想用定时器a 每0.5s控制led灯状态,发现程序运行不符合预期效果,仔细检验发现根本就没有进中断,count 值不变。先贴上可用的代码,再仔细分析

修改后的中断处理函数:

#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
	switch(TAIV){
		case 2:
			CCR1 += 10000;                    // 
			count ++;
	}
	
	
}
这两个中断处理函数区别在修改后的多用了switch语句,里面还有TAIV,也就是中断向量值

仔细阅读数据手册,发现TAIFG的中断入口地址是TIMERA1_VECTOR,同时也是TACCR1//TACCTR2CCIFG的入口地址。TACCRO单独使用TIMERA0_VECTOR。从官方给出的代码,使用TACCR1事中断函数里面也有switch语句,结合上面这个图,分析中断处理代码,执行

switch(TAIV)

不难发现,TAIV是与CCIFG所在的向量值匹配,也就是查询中断向量,提供一个入口地址,

执行后case语句的代码,现在可以理解未修改之前中断处理函数count值为改变的原因。

以上都是本人结合官方的源码和数据手册做出的分析,如有出入的地方,欢迎指正!




0
0

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