Randy 发表于 2012-7-18 09:24:59

【大赛原创经验贴】msp430中断嵌套:“另类”的嵌套

我也是即将参加TI杯电子竞赛的一名新手,在这里我看到了一些人的热情奉献还有斑竹认真负责的态度。一定程度上被感动了,也受到了相当的鼓舞!在此,我也希望通过自己的努力,为大家排除疑虑,尽自己所能,与大家共同进步,营造一个好的论坛环境!在这个新手的乐园里,共同探讨学习过程中的疑问.在TI杯,取得理想的成绩!
接下来切入正题吧,今天我要分享的内容源于斑竹的一个关于中断嵌套的帖子。其中有不少人认为斑竹的论述有误,持有怀疑的态度。对于大家质疑的精神,我并不否认。不过,斑竹建议的“程序验证”,不知大家可否有做过实验?很多时候,我们总是说的多,做的少,更多的喜欢别人验证给我们看。其实我们完全能通过自己动手,得到想要的答案。我将分享的程序,希望大家至少能懂得两点:1、理解好这个程序         2、平时多多实践,只有这样,我们才能学习的更好!/*   定时:LFXT1CLK作为ALCK的时钟源,频率:32768HZ   */
#include<msp430x14x.h>
void delay(unsigned int x)
{
unsigned int i,j;
for(i=x;i>0;i--)
   for(j=1000;j>0;j--);
}

void main(void)
{   
    WDTCTL = WDTPW + WDTHOLD;      
//TIMER_A相关设置
    CCTL0 = CCIE;                  
//    CCR0 = 2047;                  //设定周期0.5S
    CCR0=60000;
    TACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式
    P2DIR |=0xff;                   //设置P2方向为输出
    P1DIR=0X00;
    P1IES=0xff;
    P1IE=0XFF;
    _EINT();                        //使能全局中断   
    while(1)
    {
      P2OUT=0XFF;
    }
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
   _EINT();
   P2OUT=0XFD;
   delay(1000);
}

#pragma vector=PORT1_VECTOR
__interrupt void timer()
{
unsigned char temp;
if((P1IFG&0X0F)!=0X0F)
{
    temp=P1IFG;
    switch(temp)
    {
    case 1 :P2OUT=0XEF;break;
    case 2:P2OUT=0XDF;break;
    case 4:P2OUT=0XBF;break;
    case 8:P2OUT=0X7F;break;
    }
}
delay(100);
P1IFG=0X00;
}

说明:此程序可用于验证“msp430中优先级低的中断是否能打断高优先级的中断”!
          首先我们可以查到:P1口的中断优先级比TIMERA0的要低。此程序main部分使led全灭,TA定时(>10s),产生中断,进入中断使P2.1的led亮,并且将维持一段时间,为了便于验证,我特意延时较长,差不多有5s。则有,led——亮,进入TA中断,led——灭,在main函数中。这时,我们只要在led刚亮的时候,按下按键触发P1口中断,导致led提前退出亮的状态,而点亮其他led,则证明P1中断打断了TA中断!否则,反之。

大家学习的过程中一定要多动手,实践才是检验真理的唯一标准。对于发帖,我觉得一个能帮大家排疑解难的贴,才是一个真正的好帖,我希望能得到大家的认可!大家亲手去验证一下它吧,甚至可以延伸性的验证自己其他的各种疑问!
页: [1]
查看完整版本: 【大赛原创经验贴】msp430中断嵌套:“另类”的嵌套