This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F5438A: 关于GIE的疑问

Part Number: MSP430F5438A

//***************************************************************************//
//
// Main Function
//
//***************************************************************************//
void main( void )
{

WDTCTL = WDTPW + WDTHOLD;
//PMM_CFG();
Init_CLK();
Init_Port();
Init_Timer0_A5();

Init_Timer0_A5_CCTL0();
Init_Timer0_A5_CCTL1();

TA0CTL |= MC__CONTINUOUS; // Continuous mode: Timer counts up to 0FFFFh
_EINT();

LPM4;
}

代码如上,在进入LPM前,使能了中断,即将GIE设置为1,在CCS调试环境种可以观测到SR寄存器中GIE位变为1

问题1. 进入到中断服务中后,GIE会自动清零吗?从调试情况看,是这样的,不过我在SLAU208Q中没有找到相关说明。

问题2.按照这里的描述,退出中断会恢复SR之前的设定值,我在单步调试的时候,执行完中断,为什么观测不到GIE位恢复位1呢?

我的工程是捕获脉冲边沿,虽然观测不到GIE恢复为1,但是确实可以再次进入到边沿中断中。

  • 进入到中断服务中后,GIE会自动清零吗?

    是的。这是为了防止中断嵌套。

    为什么观测不到GIE位恢复位1呢?

    一般来说应该能观测到的,退出中断后,回到LPM语句,此时应该能观测到。

  • 你好,请问您的问题解决了吗?

  • #include "msp430x54x.h"
    #include <stdlib.h>
    #include <stdio.h>
    #include "PIN_DEF.H"

    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer0_A0 (void)
    {
    P1OUT ^= 0xF0 ;
    P9OUT ^= 0x0F ;
    TA0CCR0 = (16000) - 1 ;
    TA0CTL = MC_0;
    }

    //***************************************************************************//
    // //
    //函数:Init_CLK(void) //
    //功能:初始化主时钟: MCLK = XT2 //
    // //
    //***************************************************************************//
    void Init_CLK(void)
    {
    WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
    P5SEL |= 0x0C ; // 端口功能选择振荡器
    UCSCTL6 &= ~XT2OFF ; // 振荡器使能
    UCSCTL3 |= SELREF_2 ; // FLLref = REFO
    UCSCTL4 |= SELA_2 ; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
    do
    {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志
    SFRIFG1 &= ~OFIFG ;
    }while(SFRIFG1&OFIFG) ; // 检测振荡器错误标志
    UCSCTL6 |= XT2DRIVE0 + XT2DRIVE1 ; // XT2 驱动模式 24~32MHz
    UCSCTL4 |= SELS_5 + SELM_5 ; // SMCLK = MCLK = XT2
    }


    //***************************************************************************//
    // //
    // Init_Port(void): 设置IO端口 //
    // //
    //***************************************************************************//
    void Init_Port(void)
    {
    P5DIR |= POWER ; // 主电源
    MAIN_POWER_OFF ;
    P7DIR |= LED_PWR ; // 发光二极管电源
    P7OUT &=~LED_PWR ;
    P1OUT = 0xF0 ; // 设置LED控制端IO属性
    P1DIR = 0xF0 ;
    P9OUT = 0x0F ;
    P9DIR = 0x0F ;
    }

    //***************************************************************************//
    // //
    // Init_TimerA0(void): 设置TimerA0 //
    // //
    //***************************************************************************//
    void Init_Timer0_A5(void)
    {
    TA0CTL = 0 // 复位Timer0_A5, 分频系数设置为1
    | (1 << 2) // 计数器清0
    | (2 << 8) ; // 计数时钟设为SMCLK ;
    TA0CCR0 = 16000 - 1 ; // SMCK=EX2=16MHz,设置计数器溢出时间为1ms
    TA0CCTL0 = 0 // 初始化捕获控制
    | (1 << 4) ; // 使能比较中断
    TA0CTL |= (1 << 4) ; // 设置计数器为加计数,启动
    }


    //***************************************************************************//
    // //
    // 主程序: 初始化时钟、端口和定时器 //
    // //
    //***************************************************************************//
    void main( void )
    {

    WDTCTL = WDTPW + WDTHOLD ; // 关闭看门狗
    Init_CLK() ;
    Init_Port() ;
    Init_Timer0_A5() ;
    _EINT() ;
    LPM3 ;
    }

    以上为全部代码;CCS版本Version: 11.1.0.00011;仿真器MSP-FET430UIF

    在main函数的LPM3语句初设置断点;在timer0中断函数TA0CTL = MC_0;语句出设置断点

    调试情况1

    第一次点击Resume 

    可以看到GIE变为1;

    第二次点击Resume

    可以看到进入到中断处理函数,GIE变为0;

    第三次点击Resume

    之后再观测观测窗口滚动鼠标滚轮,当出现黄色背景数值时表示有数值变换后,代码会再次执行到Mian函数的LPM3断点处,同时可看到GIE变为1,

    这个我能理解,我开启了以下功能

    第四次点击Resume

    代码还是能执行到timer中断中,这个我不理解。因为第一次进入到中断函数中,在退出中断前,我已经将timer停止了,即TA0CTL = MC_0语句,而且从TA0CTL寄存器看,模式确实不是0,还是之前的上计数模式,请问这是问什么呢?

    调试情况2

    如果在第一次进入到timer中断时,进行单步操作,即Step Into,当执行TA0CTL = MC_0;后,计数器模式就为0了,停止计数,这时观测变量窗口,滚动鼠标,出现黄色背景变量,代码也不会再次执行到main函数中的LPM3断点处

    以上是我调试的两种情况

  • 代码还是能执行到timer中断中,这个我不理解。因为第一次进入到中断函数中,在退出中断前,我已经将timer停止了,即TA0CTL = MC_0语句,而且从TA0CTL寄存器看,模式确实不是0,还是之前的上计数模式,请问这是问什么呢?

    如果你继续点击resume呢?看起来这条语句似乎被忽略了。

    代码也不会再次执行到main函数中的LPM3断点处

    如果你继续点击step into 代码应该会停在LPM语句,对吗?