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.

[参考译文] MSP430FR5994:GPIO引脚上的外部中断,用于从MSP430上的LPM4唤醒

Guru**** 2389440 points
Other Parts Discussed in Thread: MSP430FR5994
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1093363/msp430fr5994-external-interrupt-on-a-gpio-pin-for-waking-up-from-lpm4-on-the-msp430

部件号:MSP430FR5994

我正在使用BOOSTXL回放作为在MSP430FR5994上运行音频检测代码的参考。 使用的MSP是外部的,并且由启动板成功检测到。  根据样本代码,我将WFP 5.5 和WFP 5.6 上的两个按钮功能替换为WFP 5.7 插针上的一个外部中断。 这是我要用来触发ISR的功能,它从LPM 4.0 唤醒MSP430。 在示例中运行应用程序的代码如下所示:

void runApplication(void)
{
    while(1)
    {
		// Disable button interrupt
		GPIO_disableInterrupt(PUSHBUTTON1_PORT, PUSHBUTTON1_PIN);
		GPIO_disableInterrupt(PUSHBUTTON2_PORT, PUSHBUTTON2_PIN);

    	switch(applicationMode)
        {
            case RECORD:
                runRecord();
                break;
            case PLAYBACK:
                runPlayback();
                break;
            default: break;
        }

        // Toggle app mode
		applicationMode = DEFAULT;

    	// Set a Switch debounce to 500ms
        __delay_cycles(0.5 * __SYSTEM_FREQUENCY_MHZ__);

        // Clear the interrupt flag
        GPIO_clearInterrupt(PUSHBUTTON1_PORT, PUSHBUTTON1_PIN);

        // Re-enable the interrupt
        GPIO_enableInterrupt(PUSHBUTTON1_PORT, PUSHBUTTON1_PIN);

        // Clear the interrupt flag
        GPIO_clearInterrupt(PUSHBUTTON2_PORT, PUSHBUTTON2_PIN);

        // Re-enable the interrupt
        GPIO_enableInterrupt(PUSHBUTTON2_PORT, PUSHBUTTON2_PIN);

        // Enter low power mode
		__bis_SR_register(LPM0_bits + GIE);
    }
}

我已使用可在WFP 5.7 上使用的外部中断将其替换为我的代码,如下所示:  

void runApplication(void)
{
    while(1)
    {
        P5IE &= ~BIT7;      // Disable interrupt on P5.7 // vm1010

        switch(appMode)
        {
            case app_mode_record:
            {
                volatile uint16_t j;
                runRecord();
                amplify_data();
                fft_init();
                while(window_number < 64)
                {
                    fft_cal();
                }
                window_number=0;
                for(j = 1; j < (VECTOR_SIZE / 2); j++)  // vm1010
                {
                    // vm1010
                    real = fft_res[2 * j] << 2;
                    imag = fft_res[2 * j + 1] << 2;
                    if(real < 0)
                    {
                        real_abs = ~real + 1;
                    }
                    else
                    {
                        real_abs = real;
                    }
                    if(imag < 0)
                    {
                        imag_abs = ~imag + 1;
                    }
                    else
                    {
                        imag_abs = imag;
                    }
                    if(real_abs >= imag_abs)
                    {
                        max = real_abs;
                        min = imag_abs;
                    }
                    else
                    {
                        max = imag_abs;
                        min = real_abs;
                    }
                    mag = max + 3 * (min >> 3);
                    FFT_data[j] = mag << 1;
                }

                int16_t spectrum[SIGNAL_ROWS1][SIGNAL_COLS1];
                signed int a,b;
                for(a=0; a<1; a++)
                {
                    for(b=256; b>=0; b--)
                    {
                        spectrum[a][b] = FFT_data[b];
                    }
                }

                matrix_multiply(1, 256, 256, 20, spectrum, weights1, pdt1);
                matrix_add(1, 20, pdt1, bias1, layer1);
                act_funct(1, 20, layer1, act1);

                matrix_multiply(1, 20, 20, 10, act1, weights2, pdt2);
                matrix_add(1, 10, pdt2, bias2, layer2);
                act_funct(1, 10, layer2, act2);

                matrix_multiply(1, 10, 10, 2, act2, weights3, pdt3);
                matrix_add(1, 2, pdt3, bias3, layer3);
                act_out(1, 2, layer3, pred);

                if(pred[0][0]==1)
                {
                    //PM5CTL0 &= ~LOCKLPM5;
                    // TB0.6 ---- P3.7 ---- PWM 4kHz for buzzer
                    TB0CCR0 = 2000-1;                         // PWM Period, 4kHz --> 250 us --> 2000 (0 to 1999) ticks at SMCLK = 8MHz
                    TB0CCTL6 = OUTMOD_7;                      // CCR6 reset/set
                    TB0CCR6 = 1000;                           // CCR6 PWM duty cycle, 50% duty cycle, 1000 ticks
                    TB0CTL = TBSSEL__SMCLK | MC__UP | TBCLR;  // SMCLK, up mode, clear TBR
                    P1OUT |= BIT0;
                    // TA1.1 ---- P1.2 ---- Timer for approx. 3 seconds for buzzer and LED
                    TA1CTL = TASSEL__SMCLK | MC__CONTINUOUS | TACLR | TAIE;        // SMCLK, Continuous mode, clear TAR
                    __bis_SR_register(LPM4_bits + GIE);       // Enter LPM4 w/ interrupt
                    P1OUT &= ~BIT0;
                    TA1CTL &= ~MC;
                    TB0CTL &= ~MC;
                }
                memset(fft_res, 0, sizeof(fft_res));
                memset(FFT_data, 0, sizeof(signal_fft));
                break;
            }
            default:
                break;
        }

        appMode = app_mode_normal;

        // Need to put in normal mode and back to WoS mode to avoid issue where continuous clapping
        // causes interrupts faster than we can go in sleep mode, thus causing a state where we
        // are in sleep mode, but the interrupt is not recognized since interrupt flag is already high and
        // not cleared
        // vm1010 mode pin, o/p, low for normal mode
        P6OUT &= ~BIT1;                 // vm1010
        // Set a Switch debounce to 10ms (500ms -- 0.5 * sys freq)
        __delay_cycles(0.01 * __SYSTEM_FREQUENCY_MHZ__);

        P5IFG &= ~BIT7;                 // Clear 5.7
        P5IE |= BIT7;                   // P5.7 interrupt enabled
        // vm1010 mode pin, o/p, high for WoS mode
        P6OUT |= BIT1;  // vm1010

        // Enter low power mode
        __bis_SR_register(LPM4_bits+GIE);

//        sleep_Setup();
//        if(FFT_data[1]==0)
//        {
//            sleep(1);
//        }


    }
}

我正在调试模式下评估这两个实现。  

在原始样本中,代码进入LPM0,按下WFP 5.5 上的按钮即可唤醒。 之后,应用程序根据 为端口5编写的ISR输入CASE:RECORD,如下所示:

#pragma vector=PORT5_VECTOR
__interrupt void port5IsrHandler(void)
{
    switch (__even_in_range(P5IV, P5IV_P5IFG7))
    {
        case P5IV_NONE: break;
        case P5IV_P5IFG0: break;
        case P5IV_P5IFG1: break;
        case P5IV_P5IFG2: break;
        case P5IV_P5IFG3: break;
        case P5IV_P5IFG4: break;
        case P5IV_P5IFG5:
        	// Toggle record mode
			applicationMode = PLAYBACK;

			//exit LPM mode on exit
			__bic_SR_register_on_exit(LPM0_bits);
			break;
        case P5IV_P5IFG6:
            // Toggle record mode
            applicationMode = RECORD;

			//exit LPM mode on exit
            __bic_SR_register_on_exit(LPM0_bits);
			break;
        case P5IV_P5IFG7: break;
        default: break;
   }
}

在我修改的样本中,我希望在对端口5的ISR进行修改的基础上,使用Pin WFP 5.7 进行类似的操作,如下所示:

#pragma vector=PORT5_VECTOR
__interrupt void port5IsrHandler(void)
{
    switch (__even_in_range(P5IV, P5IV_P5IFG7))
    {
        case P5IV_NONE:
            break;
        case P5IV_P5IFG0:
            break;
        case P5IV_P5IFG1:
            break;
        case P5IV_P5IFG2:
            break;
        case P5IV_P5IFG3:
            break;
        case P5IV_P5IFG4:
            break;
        case P5IV_P5IFG5:
            break;
        case P5IV_P5IFG6:
            break;
        case P5IV_P5IFG7:
            __disable_interrupt();
            P5IE &= ~BIT7;
            // Toggle record mode
            appMode = app_mode_record;
            //exit LPM mode on exit
            __bic_SR_register_on_exit(LPM4_bits);
            break;
        default:
            break;
   }
}

但是,与原始样本不同,修改后的版本仅通过以下行进入LPM:__bis_sr_register (LPM4_bits+GIE)。  此后,MSP将在此时继续运行,而不切换到案例:app_mode_record。  我浏览了各种样本并尝试了一些想法,包括使用-__disable_interrupt ()来避免比赛条件。  但是,在runApplication()函数的开头已经完成了这一操作。 除了现在来自WFP 5.7 上的外部信号的中断之外,修改后的代码执行的操作完全相同,因此我无法找到任何不能正常工作的原因。  

另外,我对执行的一部分很好奇,我使用上面提到的同一行-__bis_sr_register(LPM4_bits +GIE)- 在开关盒内输入LPM -这里,代码可以使用计时器TA1的计时器中断从LPM唤醒。  

我在一些帖子中读到,在某些情况下,无法使用外部中断从LPM唤醒。 在我的情况下,这是否是问题? 在我完成整个项目的过程中,如果有任何建议或想法,我将不胜感激,我看不出 有任何其他可能的原因导致未完成执行。  

两个项目的GPIO设置如下所示:

//GPIO interfacing for BOOSTXL Playback sample
initGpio()
{
    GPIO_setAsInputPinWithPullUpResistor(PUSHBUTTON1_PORT,
                                             PUSHBUTTON1_PIN);
    
    GPIO_selectInterruptEdge(PUSHBUTTON1_PORT,
                                 PUSHBUTTON1_PIN,
                                 GPIO_HIGH_TO_LOW_TRANSITION);
    
    GPIO_setAsInputPinWithPullUpResistor(PUSHBUTTON2_PORT,
                                             PUSHBUTTON2_PIN);
    
    GPIO_selectInterruptEdge(PUSHBUTTON2_PORT,
                                 PUSHBUTTON2_PIN,
                                 GPIO_HIGH_TO_LOW_TRANSITION);

}

//GPIO interfacing for my modified sample
initGpio()
{
    ...............
    // vm1010 WoS digital out pin, i/p
    P5OUT &= ~BIT7;                     // Pull-down resistor on P5.7
    P5REN |= ~BIT7;                      // Select pull-down mode for P5.7
    P5DIR &= ~BIT7;                // Set  P5.7 to input direction
    P5IES &= ~BIT7;                     // P5 Lo/Hi edge
    ..............
    
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Siddhant,

    但是,与原始版本PMSR+BIST_l_不同,只能通过原始版本输入PM_l_。  此后,MSP将在此时继续运行,而不切换到案例:app_mode_record。  [/引述]

    首先,您正在使用WFP 5.7 作为GPIO来引起中断并唤醒CPU,但我不知道它使用哪种极性来触发中断(低到高或高到低)。  来自外部MSP430的脉冲是从低到高,还是从高到低?

    其次,关于将CPU放入LPM4但CPU继续执行的问题,告诉我系统中有其他中断阻止CPU进入LPM4。  由于您要进入LPm4,所有时钟都会停止,因此您的计时器TB0会被排除。

    如果您将while (1)替换为此示例,则在__bis_sr_register(LPM4_bits+GIE)后的__nop()上设置一个断点,不要在WFP 5.7 上发送脉冲,代码永远不会到达中断点。  然后运行相同的实验,在WFP 5.7 上发送一个脉冲,并验证代码是否到达断点。

    while(1)
    {
    	P5IE &= ~BIT7;      // Disable interrupt on P5.7 // vm1010
    	
    	__delay_cycles(0.01 * __SYSTEM_FREQUENCY_MHZ__);
    
    	P5IFG &= ~BIT7;                 // Clear 5.7
    	P5IE |= BIT7;                   // P5.7 interrupt enabled
    
    	// Enter low power mode
    	__nop();
    	__bis_SR_register(LPM4_bits+GIE);
    	__nop();  // set a break point here.
    }
    

    接下来,根据您的代码示例,您设置appMode = normal,然后输入LPM4,但从不在代码中的任何位置设置appMode = app_mode_record,因此我不希望执行开关状态的那一部分。

    MSP430FR58xx-59xx用户指南中有一节介绍了如何进入和退出LPM4 (请参阅第1.4 2节),以防您未看到它。

    https://www.ti.com/lit/ug/slau367p/slau367p.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Dennis,

    下面是指示WFP 5.7 转换极性的设置代码

    void initGpio(void)
    {
        ..............................
            // vm1010 WoS digital out pin, i/p
        P5OUT &= ~BIT7;                     // Pull-down resistor on P5.7
        P5REN |= ~BIT7;                      // Select pull-down mode for P5.7
        P5DIR &= ~BIT7;                // Set  P5.7 to input direction
        P5IES &= ~BIT7;                     // P5 Lo/Hi edge
        
        ..................................
        
    }

    对于appMode=normal的设置和转换为app_mode=app_record的想法是,首先对appMode=normal进行评估,在这里,一旦中断发生并且代码分支到ISR,将在ISR内执行模式切换-如下所示:

    #pragma vector=PORT5_VECTOR
    __interrupt void port5IsrHandler(void)
    {
        switch (__even_in_range(P5IV, P5IV_P5IFG7))
        {       ..............................
        
            case P5IV_P5IFG7:
                    // Toggle record mode
                    appMode = app_mode_record;
                    //exit LPM mode on exit
                    __bic_SR_register_on_exit(LPM4_bits);
                    break;
                default:
                    break;
       }
    }

    这种情况完全基于BOOSTXL-回放的示例。

    对于另一个中断阻止MSP进入LPM的情况,我需要检查一下,看看哪个中断可能会导致问题(如果确实是这样)。

    对于您提到实验的部分,我检查了相同的部分-第一个例子和您提到的一样-在第二个例子中,使用以下代码为WFP 5.7 ,问题仍然存在。

        while(1)
        {
            P5IE &= ~BIT7;      // Disable interrupt on P5.7 // vm1010
    
                __delay_cycles(0.01 * __SYSTEM_FREQUENCY_MHZ__);
    
                P5OUT &= ~BIT7;                     // Pull-down resistor on P5.7
                P5REN |= ~BIT7;                      // Select pull-down mode for P5.7
                P5DIR &= ~BIT7;                // Set  P5.7 to input direction
                P5IES &= ~BIT7;                     // P5 Lo/Hi edge
                P5IFG &= ~BIT7;                 // Clear 5.7
                P5IE |= BIT7;                   // P5.7 interrupt enabled
    
                // Enter low power mode
                __no_operation();
    
                __bis_SR_register(LPM4_bits+GIE);
                __no_operation();  // set a break point here.
                
        }
        
        
    // the ISR is as follows:
    #pragma vector=PORT5_VECTOR
    __interrupt void port5IsrHandler(void)
    {
        switch (__even_in_range(P5IV, P5IV_P5IFG7))
        {
            case P5IV_NONE:
                break;
            case P5IV_P5IFG0:
                break;
            case P5IV_P5IFG1:
                break;
            case P5IV_P5IFG2:
                break;
            case P5IV_P5IFG3:
                break;
            case P5IV_P5IFG4:
                break;
            case P5IV_P5IFG5:
                break;
            case P5IV_P5IFG6:
                break;
            case P5IV_P5IFG7:
                // Toggle record mode
    //            appMode = app_mode_record;
                //exit LPM mode on exit
                __bic_SR_register_on_exit(LPM4_bits);
                break;
            default:
                break;
       }
    }
    

    我也尝试使用LPM0_bits,但同一问题仍然存在。 此外,如果我只使用LPM4_bits或LPM0_bits而不使用'+GIE', 则代码分支到输入LPM后放置的__nop()。 我知道这可能很好,因为我从未使用'+GEI'启用所有中断, 但我认为它仍然是调试问题的有用信息。 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在浏览代码时,我看到了一个单独的问题。 由于我使用的是外部MSP,因此我无法访问MSP430的32.768kHz晶体振荡器。 相反,我想使用内部振荡器作为时钟。  

    代码的时钟函数如下所示:

    void initClock(void)
    {
        // 32.768 kHz crystal is only on Debug board
        // Demo board is meant to be used with internal oscillator
        // Change routine accordingly when using on demo board
        PJSEL0 |= BIT4 | BIT5;      // For XT1 (LFXT 32.768kHz)
    
        // XT1 Setup
        CSCTL0_H = CSKEY >> 8;      // Unlock CS registers
        CSCTL1 = DCOFSEL_6;         // Set DCO to 8MHz
        // SMCLK and MCLK = DCOCLK, ACLK = LFXTCLK
        CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
        CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;   // set all dividers
        CSCTL4 &= ~LFXTOFF;
    
    //    do
    //    {
    //        CSCTL5 &= ~LFXTOFFG;    // Clear XT1 fault flag
    //        SFRIFG1 &= ~OFIFG;
    //    }
    
    //    while (SFRIFG1 & OFIFG);  // Test oscillator fault flag
        CSCTL0_H = 0;               // Lock CS registers
    }
    

    在这里,如果我用'do-while '取消注释该部分, 我的代码将一直滞留在initClock函数中。 这是为什么不可能实现WFP 5.7 从低到高的过渡? 如果是这样的话,我可以对该功能做什么改变,这样我就可以使用内部振荡器来生成触发在WFP 5.7 上中断的脉冲?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Siddhant,

    好的,我明白了。  我刚开始没有看到您的所有代码。

    PMI仍然使用相同的问题。 此外,如果我只使用LPM4_bits或LPM0_bits而不使用'+GIE', 则代码分支到输入LPM后放置的__nop()。

    调试器可能会有一点误导。  此行为正确。  如果没有+ GIE,CPU将在LPM4中花费很长的时间,因为没有中断可以唤醒它。 停止时,箭头指示将执行的下一个指令。  在下面的代码中,CPU进入LPM4,因此停止,就像您的一样。  你可以看到我在第30行设置了一个断点。  第28行上的蓝色小箭头显示将执行的下一个指令(从LPM4中出来后)。  我的坏。  我应该让你放置3 nops(),只是为了清楚执行。

    我建议用3 nops()和在last nop()上的断点再次尝试这个实验,你会看到调试器永远不会到达你的断点。

    接下来,放回+ GIE并重复相同操作。  如果您将其设置为第三个nop()并且您启用的唯一中断是P5IE,请在启用P5IE之前尝试清除P5IV寄存器。

    [QUOTE userid="50.4252万" url="~/support/micromicrosoft器/MSP-low-power - micromicrocontroller-group/MSP/f/MSP-low-power - micromicrocontroller-forum/109.3363万/msp430fr5994-external-interrupt-on-a-gPIo-pin -5994 -唤醒-从MSP-lpm4-on-th-cryster-for-for-for-for-for-forum/109.3363万/msp5994-msp5994-msp5msp5m4020,5994,自5994自MSP4304020MSP430起,一直没有MSP430的32.40I振荡器,它的32.40I 相反,我想使用内部振荡器作为时钟[/QUOT]

    好的,对于最后一个问题, 您说您正在尝试禁用外部32KHz LFxT1,对吗?

    [quote userid="50.4252万" url="~/support/micromicromicrosoft器/MSP-low-power - micromicrocontroller-group/MSP/f/MSP-low-power - micromicromicrocontroller-forum/109.3363万/msp430fr5994-external-interrup-on-a-initgPIo-pin for-lehung-f-from/lpm4-on5994 for-lehung-f-from/lpm4-on -th-the-lock/4020 ,如果注释中保留了#40i/40o-20],则请引用我的注释部分。

    不确定您正在使用的MSP430,但要禁用LFXT1,我认为您应该执行以下操作:

    void initClock(void)
    {
    	PJSEL0 &= ~(BIT4 | BIT5);      // disable LFXT1 pins
        
        CSCTL0_H = CSKEY >> 8;         // Unlock CS registers
        CSCTL1 = DCOFSEL_6;            // Set DCO to 8MHz
    	
        // SMCLK and MCLK = DCOCLK
        CSCTL2 = SELS__DCOCLK | SELM__DCOCLK; // ACLK is VLOCLK by default
    	
        CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;   // set all dividers
        
    	CSCTL4 |= LFXTOFF; // turns off LFXT
    
        while (SFRIFG1 & OFIFG);  // Test oscillator fault flag
        CSCTL0_H = 0;      
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Dennis,

    感谢您的广泛回答。 了解代码可能会发生什么是很有帮助的。 我相应地更正了时钟功能的代码。  

    对于ISR,即使进行了上述更改,同样的问题仍然存在。 但是,我有一个想法,我尝试了,这个解决办法奏效了。  

    我的逻辑是尝试在runApplication()函数中设置appMode=app_mode_record,正如您所提到的。 此外,我在进入ISR之前启用了WFP 5.7 上的中断,并在命令__bis_sr_register(LPM4_bits +GIE)之前设置了大约3秒的计时器。 相同的配置如下所示:

    void runApplication()
    {
            while(1)
        {
            P5IE &= ~BIT7;      // Disable interrupt on P5.7 // vm1010
    
            switch(appMode)
            {   
                .....................
                .....................
                
                appMode = app_mode_normal;
        
                // Need to put in normal mode and back to WoS mode to avoid issue where continuous clapping
                // causes interrupts faster than we can go in sleep mode, thus causing a state where we
                // are in sleep mode, but the interrupt is not recognized since interrupt flag is already high and
                // not cleared
                // vm1010 mode pin, o/p, low for normal mode
                P6OUT &= ~BIT1;                 // vm1010
        
                // Set a Switch debounce to 10ms (500ms -- 0.5 * sys freq)
                __delay_cycles(0.01 * __SYSTEM_FREQUENCY_MHZ__);
        
                P5IES &= ~BIT7;                     // P5 Lo/Hi edge
                P5IFG &= ~BIT7;                 // Clear 5.7
                P5IV &= ~BIT7;
                P5IE |= BIT7;                   // P5.7 interrupt enabled
                // vm1010 mode pin, o/p, high for WoS mode
                P6OUT |= BIT1;  // vm1010
        
                TA1CTL = TASSEL__SMCLK | MC__CONTINUOUS | TACLR | TAIE;
        
                appMode = app_mode_record;
        
                // Enter low power mode
                __bis_SR_register(LPM4_bits+GIE);
        }
    }

    在这种配置中,代码完全按照我所需的功能执行。 它使用  以下命令进入LPM:__bis_sr_on_register(LPM4_bits +GIE)。  随后,代码分支到app_mode = app_mode_record并执行我需要的功能。 我的问题是:这种执行是否有效,因为

    A)中断现在确实找到了一个触发器,并且基于相同的代码,可以看到状态在退出LPM4后切换并分支到相同的状态?          

    b)代码确实会快速进入ISR并退出,但由于切换是在手边之前完成的,现在可以正确分支?

    请告诉我您对同一问题的看法。 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Siddhant,

    顺便说一句,我之前说过以下的话,实际上是错的:

    [quote userid="11.4745万" url="~/support/micromicrosofters/MSP-low-power - micromicrocontroller-group/MSP/f/MSP-low-power - micromicrocontroller-forum/109.3363万/msp430fr5994-external-interrupt-on-a--a-enter-gpi-pimum-fer-for-immragpum-from-lprom-lpm4-on -494p-for-for-for-for-p4p242/40742/pm4"PM244l4l4p244p244p244p244l4p4p4p4p4p244p5994 -494p-for-for-for-for-p4p242/40742/pm4"PM244l4l4p244p244p244p244l4p4p4p4p4p244p</s>4.0742万  由于您要进入LPM4,所有时钟都会停止,因此您的计时器TB0[/QUET]将不会出现此问题

    我不认为您实际上是进入LPM4,因为您已经设置了一个从SMCLK运行的计时器。  在计时器运行的情况下进入低功率模式将强制低功率模式进入LPM1,如下所示。  计时器的中断确实会唤醒CPU,您将继续返回While (1)循环的顶部,因此我们知道这是有效的。  

    回到最初,你真的需要LPM4和使用WFP 5.7 来唤醒CPU。 所以如果你不使用定时器,现在你能让CPU从LPM4唤醒,并在WFP 5.7 上转换一下吗?