×
嵌入式 > 技术百科 > 详情

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

发布时间:2020-06-01 发布时间:
|


//本平台 msp430f149 

#include

 

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和//TACCTR2的CCIFG的入口地址。TACCRO单独使用TIMERA0_VECTOR。从官方给出的代码,使用TACCR1事中断函数里面也有switch语句,结合上面这个图,分析中断处理代码,执行


switch(TAIV)

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


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


 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil5(MDK5)在调试(debug)过程中遇到的问题