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.

[参考译文] MSP430F5335:嵌套中断和 LPM 有问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/780588/msp430f5335-problem-with-nested-interrupts-and-lpm

器件型号:MSP430F5335

我观察到嵌套中断有问题。 我知道我应该避免使用嵌套中断、但相信我、在这种情况下、没有其他选择。

这是一种情况:

- MSP 处于低功耗模式3 (LPM3)。

RTC 中断发生。

-在 RTC 的 ISR 内部,我设置 GIE 以启用嵌套。

- TA0 (或其它)中断、然后从 RTC 的 ISR (嵌套)返回。

-在 TA0内部、我更改状态寄存器(SR)位以退出 LPM (使用__BIC_SR_REGISTER_ON_EXIT)。

-MSP 不再响应。

注意:如果我没有尝试从嵌套中断中退出 LPM、MSP 将按预期运行。

在以下线程中、Jens-Michael Gross 提到"嵌套中断无法退出 LPM"。

https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/349661?Nested-interrupts-and-jump-table 

我知道 SR 和 PC 在堆栈中保存了两次。 然后、在嵌套中断 ISR 结束时、修改并检索堆栈中保存的最新 SR (以退出 LPM)、然后 PC 将从 RTC 的 ISR 中检索一条指令、并继续执行 RTC 的 ISR。 然后、在 RTC ISR 结束时、在进入 RTC 的 ISR 之前、SR 将再次从堆栈中检索并保存值。 因此、MSP 此时不会退出 LPM 形式。

但是、我不理解的是、MSP 根本就不会唤醒、稍后当发生另一个中断并且没有启用嵌套时。

我非常感谢就这一问题提出任何意见。

提前感谢。

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

    我没有 F5335。 当我在 F5529 (Launchpad)上运行此程序时、它会按预期运行。

    我不确定你和我的表现有何不同。

    ////
    nest-5529
    //如果嵌套正常工作,LED1闪烁2Hz,LED2为0.5Hz
    //
    #include 
    define Hz 1000000UL //从复位
    int
    main 开始1MHz (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    P4OUT &=~BIT7; // Launchpad LED2
    P4DIR |= BIT7;
    P1OUT &=~BIT0; // Launchpad LED1
    P1DIR |= BIT0;
    //频率为2Hz 的闪烁,来自4个中断/秒
    TA0CCR0 = Hz/4/4; // Hz/4,ID=2
    TA0CCTL0 = CCIE;
    TA0CTL = tassel_2 | ID_2 | MC_1 | TACLR;// SMCLK/4,向上[,清除]
    // RTC 处于计数器模式,通过 PS1中断 RTCPS0CTL
    = RT0PSDIV_7| RTPS1L|RTPS0|RTPS0|RTPS0|RTPS0|RTPS0|RTPS0|RTPS6|RTPS0|RTPS0|RTPS0|RTPS0|RTPS0+计数
    器模式;RTPS0|RTPS0|RTPS0|RTPS0|RTPS0|RTPS0|RTPS0|RTPS0|RTPS0|RTPS0+ RTPS0|RTPS0|RTPS0|RTPS0
    RTCCTL0 = 0;
    RTCCTL1 =(0*RTCHOLD);//运行
    __ENABLE_INTERRUPT ();
    while (1)
    {
    LPM3;
    }
    /* NOTREACHED*/
    返回0;
    }
    #pragma vector=TIMER0_A0_VECTOR
    __INTERRUPT void
    TA0_0_ISR (void)
    {
    P1OUT ^= BIT0; // LED1
    _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//唤醒时间减半
    return;
    }
    #pragma vector=RTC_vector
    __interrupt void
    RTC_ISR (void)
    {
    (无效)RTCIV; //我们知道它是 PS1
    P4OUT ^= BIT7; // LED2
    _bis_SR_register (GIE); //允许嵌套
    _delay_cycles (3*Hz/4); // 3/4-second 明显阻止 TA0而不使用 GIE
    返回;
    }
    

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

    尊敬的 John:

    您可以在进入 LPM 的位置发布代码部分吗?

    若要清除 TimerA ISR 内部的 SR、只有在处于 LPM 时出现 TimerA 中断时才会起作用。 如果它将作为嵌套中断执行、那么您的器件无论如何都将返回 AcitveMode、因为它来自 RTC 吗?

    因此、要么会导致某种堆栈溢出、要么会返回主循环内的 AM、而不会在循环中捕获 CPU。 如果你说它不再作出反应,这些是我的初步想法。