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.

[参考译文] MSP430FR2355:如何使用堆栈来找出导致复位的原因?

Guru**** 2534260 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1046572/msp430fr2355-how-to-use-the-stack-to-find-out-what-is-causing-a-reset

器件型号:MSP430FR2355

你好。。。

我有从开关获取按钮输入并根据这些输入执行操作的代码。  我尝试调整代码以读取 P1IN 以进行瞬时操作,现在我有时会重置....   

我在代码中有几个位置将错误的值写入看门狗 WDTCTL、这会导致复位、但如果我在这里放置断点、这些值似乎都不会导致复位。 调试窗口显示以下内容:

是否有人可以告诉我如何阅读此内容并使用此内容来查找问题?  作为一个硬件工具、我的调试级别是设置断点并添加表达式以在断点后观察。  或者浏览 registers....beyond,我不确定要尝试什么,因为我不知道如何使用堆栈以我的优势。。。

代码正在使用所有计时器和 CCR 寄存器执行许多操作...猜某件事情正在进入 limbo

谢谢

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

    复位的原因存储在系统寄存器 SYSRSTIV 中。 请记住、它会按优先级顺序返回值、因此您需要读取它、直到它返回0。 作为正常启动过程的一部分、这不是一个大问题、但是如果使用调试器进行读取、则可能会设置多个代码。

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

    您能再详细说明一下吗?  例如,我重置代码并且 SYSRSTIV 已经显示为0x0E...为什么不为0?

    我能否运行代码、然后在主代码的前端放置一个断点、以便在它复位时、我只查看寄存器?

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

    器件数据表列出了所有代码。 当然、上电复位会设置一个代码。

    断点可以到达任何位置。

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

    我在 WDTCTL 行设置了一个断点(见下文)...我以全新方式启动代码并获取0x0E ...我在这里单击几个按钮,然后在代码复位并在我刚才提到的断点停止时中断代码... SYSRSTIV 仍然读取0x0E....no 差异...我是否需要执行其他操作:?

    int main (空)



    uint8_t sysLoop = 0;

    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

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

    应用程序.c 的第1210行中有什么代码?  

    第一个吸引我眼球的是、最近的可识别功能被称为" _ISR"。 这真的是一个 ISR 吗?

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

    布鲁斯...

    您是 correct....it、这是一个计时器 ISR ....called RFMessageHandler_ISR

    #pragma vector=TIMER0_B1_VECTOR
    __interrupt void rfMssgTimeHandler_ISR(void)
    {
        switch(__even_in_range(TB0IV,TB0IV_TBIFG))
        {
          case TB0IV_NONE:   break;
          case TB0IV_TBCCR1:
              if (!ISR.buttonPushedFlag)
              {
                  UCA1IE &= ~UCRXIE;
                  TimerCompare_Disable_IRQ(TIMER_RADIO, CC_ONE);
                  ISR.mssgRcvdFlag = T;
                  LPM3_EXIT;
              }
              break;
          case TB0IV_TBCCR2:
              pTx = mssg;
              TB0CCTL2 &= ~CCIE;
              UCA1IFG |= UCTXIFG;
              UCA1IE |= UCTXIE;
              break;
          case TB0IV_TBIFG: break;
          default: break;
        }
    }
    

    当 TXIE 被启用时、行1210

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

    由于第1210行不会调用任何内容、这似乎是奇怪的。 启用 TXIE 可能会触发中断、但您在 ISR 中、因此会禁用中断。

    在 application.c 的第162行中有什么代码(即调用栈中的下一个条目)?  

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

    162是我设置的断点,它在配置期间发生在 while (1)循环之前...基本而言,我将它设置为在我复位时捕获

    因此该计时器到期并设置发送器的启用...在中断此 ISR 之后,GIE 应置1,然后我直接跳转到代码看起来所执行的 UART ISR

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

    栈缓存意味着 ISR 在第1210行被挂起、因此在退出之前发生了一些事情。

    应用程序.c 的第162行中有什么代码?