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.

[参考译文] CCS/MSP430FR5889:程序流中断

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/567566/ccs-msp430fr5889-program-flow-break

器件型号:MSP430FR5889

工具/软件:Code Composer Studio

我正在使用 MSP430FR5889并在 CCS 环境中使用 C 语言进行编写。

在程序运行期间、有时程序流会中断、执行会"跳转到"错误的地址。
有时在代码内部、有时在程序代码外部寻址。

我在捕获和比较模式下都使用 Timer_A 的中断、但在我可以检查的范围内、所有中断都正确结束(我在入口和退出匹配的 ISR 时引入的调试计数器)。

我尝试更改 CCS 版本、编译器版本、优化级别、但没有更改。

有没有这种情况会响铃给任何人?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在没有处理程序的情况下启用了任何中断?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了验证它、我尝试在默认中断处理程序中放置一个断点、但在问题发生之前没有到达该断点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    堆栈溢出可能会产生这种症状。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我也怀疑是这样。
    我在运行开始前将所有堆栈区域设置为零(调试模式)、然后当问题发生时、我看到只有大约1/4的区域被更改(使用)。
    堆栈上没有任何可能已分配但未使用的大型数组。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现正常程序流的跳转发生在调用命令的其中一种情况中。

    该点的反汇编是:

    012980:  13B1 2EDA          Calla  #SetRF_Mode

    程序在此命令中成功传递了数百次、没有问题、但另一次跳转到 了保存地址0x0113B1的命令。

    该地址不在 CALLA 命令的操作码范围内、这使我怀疑处理器将 CALLA 命令的第一个字作为 操作、也用作 目的(而不是作为第二个字)。

    有什么想法吗?

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

    有人可以提供帮助吗?

    它看起来是处理器中的一个错误、但我在勘误表中没有找到任何有关它的信息。

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

    您好、Ofec、

    对于这可能造成的问题、我深表歉意。 我将与我们的质量团队一起研究这一问题、看看是否有任何已知问题可能导致这一问题、或者这可能是全新的问题。

    您能否提供以下信息:

    1. 可用于重现问题的代码示例
    2. 器件版本号
    3. 有多少设备遇到此问题?

    此致、  

    Caleb Overbay

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

    尊敬的 Caleb:
    感谢你的答复。

    器件封装:

    MSP430 FR5889 TI 541 C C8JN G4

    我尝试了3个 CCS 版本(无更改):6.1.0;6.2.0;7.0.0
    我在2个器件上尝试过它、但没有改变。

    出现问题的代码为:

    DBG_RxStatus |= 0x0001;

    TA0CCTL1 = 0; //禁用中断

    SetRF_SLEEP ();//停止射频 Rx (SLEEP)//解析为 SetRF_Mode (0x00、1);

    DBG_RxStatus |= 0x0004;

     

    反汇编是:

    1142     dbg_RxStatus |= 0x0001;

    012970:  D392 2152           BIS.W   #1、&dbg_RxStatus

    1145     TA0CCTL1 = 0;//禁用中断

    012974:  4382 0344           CLR.W   &Timer0_A3_TA0CCTL1

    1150     SetRF_SLEEP ();      //停止射频 Rx (SLEEP)

    012978:  434C                CLR.B   R12

    01297A:  435D                MOV.B   #1、R13

    01297c:  13B1 2ED6           CALA   #SetRF_Mode

    1152     dbg_RxStatus |= 0x0004;

    012980:  D2A2 2152           BIS.W   #4、&dbg_RxStatus

     

    问题在于通常分支到 SetRF_Mode()例程的 Calla 命令,但随后另一个时间分支到地址0x0113b0 - 0x0113b1中的命令。

    Ofec。

     

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

    您好、Ofec、

    感谢您提供代码片段。 我将尝试使用我自己的硬件重新创建它。 在与我们的质量团队交谈后、我们还会为您提出几个问题:

    1. 您是否正在使用 DMA?
    2. 您将计时器和 CPU 使用什么频率?
    3. 您是否在没有调试器的情况下也会遇到此问题、或仅在使用调试器的情况下遇到此问题?
    4. 此问题是否100%可重现?
      1. 是否每次执行 CALLA 命令时都会发生这种情况?
      2. 还是只是偶尔发生?

    此致、  
    Caleb Overbay

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

    还有一条评论。 如果 CPU 的运行频率大于8MHz、则需要确保使用 FRAM 等待状态。 否则、您可能会像在这里遇到的那样执行零星的代码。

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

    尊敬的 Caleb:

    感谢您的努力。

    我的处理器以16MHz 运行、因此 NWAITS 设置为1。

    我不使用 DMA。

    我的系统的硬件设置为:

    void hw_Init (void)

    //看门狗关闭

    WDT_HOLD ();      // WDTCTL = WDTPW|WDTHOLD

     

    // LED 设置

    LED_Init();       // GPIO

    LED_ON();

     

    //调试设置

    DEBUG0_init ();    // GPIO

    DEBUG1_INIT();

    DEBUG2_init();

    DEBUG3_init ();

     

    //禁用 GPIO 上电默认高阻抗模式以激活

    //先前配置的端口设置

    PM5CTL0 &=~LOCKLPM5;

     

    //设置系统时钟

    PJSEL1 = 0;                            //将 XTAL 引脚置为有效

    PJSEL0 = 0x50;

    //

    CSCTL0_H = CSKKEY_H;                      //解锁 CS 寄存器

    CSCTL1 = DCORSEL|DCOFSEL_3;              //将 DCO 设置为16MHz

    CSCTL2 = SELA_VLOCLK|SEL__VLOCLK|SELM_VLOCLK;//选择所有到 VLO 的时钟源

    CSCTL3 = DIVA__1|DIVSA_1|DIVM__1;        //为时钟源设置无向素

    CSCTL4 = HFXTDRIVE_3|HFFREQ_1_LFXTDRIVE_3;//设置驱动器电流和频率。 范围

    //

    操作

    {//循环、直到所有故障标志都被清除

      CSCTL5 &=~(HFXTOFFG|LFXTOFFG);        //清除故障标志

      SFRIFG1 &=~OFIFG;                    //清除故障标志

    } while (SFRIFG1&OFIFG);                  //测试振荡器故障标志

    //

    CSCTL0_H = 0;                            //锁定 CS 寄存器

    //

    FRCTL0 = FRCTLPW|NWAITS_1;              //设置1等待状态

    FRCTL0_H = 0;

    //

    CSCTL0_H = CSKKEY_H;                      //解锁 CS 寄存器

    CSCTL2 = SELA_LFXTCLK|SEL__HFXTCLK|SELM_DCOCLK;//选择实际的时钟源

    CSCTL4 |= VLOOFF;                        //关闭 VLO

    CSCTL0_H = 0;                            //锁定 CS 寄存器

     

    //初始计时过程

    Timer_Init();     //如下所示

     

    //启用中断

    _enable_interrupt ();

     

    //设置看门狗计时器

    WDT_SET ();        // WDTCTL = WDTPW|WDTCNTCL|WDTSSEL0|WDTIS__32K

     

    //将 LED 关闭

    LED_OFF ();       // GPIO

     

    Timer_Init ()

    //为 SMCLK/8设置 Timer_A0、Timer_A1和 Timer_A3、启动、溢出时无中断。

    TA0CTL = TASSEL1|ID1|ID0|MC1|TACLR;

    TA1CTL = TASSEL1|ID1|ID0|MC1|TACLR;

    TA3CTL = TASSEL1|ID1|ID0|MC1|TACLR;

     

    //为 ACLK 输入设置 Timer_A2、启动、溢出时无中断。

    TA2CTL = TASSEL0|MC1|TACLR;

     

    //初始化时间计数过程

    TA3CCTL0 = 0;

    TA3CCR0 = MILISECOND;

    TA3CCTL0 = 0;

    TA3CCTL0 = CCIE;

     

    我没有尝试在没有调试器的情况下工作。
    在我的程序正常运行之前、我很少这样做。

    至於问题的重现性,我会再次强调:

    • 该程序正常运行几秒钟、甚至一两分钟。

    • 在这段时间内、它经过了几十到几百次、没有任何问题。

    • 由于没有外部原因、我可以看到、这种现象发生了一次。

    • 当我  此时没有使用断点停止程序时、程序会继续运行、但由于0x0113b1代码位于主循环中、因此 Stuck 无法正确折返、并且在几次出现问题后、堆栈溢出、WDT 会复位处理器。

    • 我想强调的是、当我对代码进行一些更改(如添加调试标志设置)时、问题可能会改变其发生的频率。
      例如、在我发送给您的示例代码中、添加 dbg_RxStatus |= 0x0002; TA0CCTL1 = 0之后的行中;在调用例程之前、将问题的频率而不是在数秒之后更改为在数分钟之后、有时超过1小时。

    Ofec。

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

    您好、Ofec、

    感谢您提供详细说明。 我看到您在将时钟初始化为16MHz 后将设置等待状态。 我强烈建议在执行此初始化之前设置等待状态。 虽然这可能不是问题的根本原因、但它将有助于将其排除为问题的一部分。

    我无法在我的末尾重现此问题 由于这个问题看起来非常具体、因此最好使用您正在运行的代码的副本来复制这个问题。 如果愿意、您可以向我发送包含您的代码的私人消息、以便我们更好地评估此问题。 我已向您发送朋友请求、一旦接受、您应该可以向我发送一条消息。  

    此致、
    Caleb Overbay

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

    我已将等待状态设置移动到时钟速度设置之前完成、对此问题没有任何更改。

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

    您好、Ofec、

    让我在这里接管。

    是否可以发布中断处理程序?

    非常感谢

    Lukas

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

    您是否仍然需要有关此问题的帮助、或者是否可以提供任何更新?

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

    尊敬的 Caleb:

    感谢您的关注。
    我仍在等待问题的解决方案。

    卢卡斯 ·巴杜拉已经接管并正在研究细节,但迄今没有成功。

    由于问题是 CALLA 命令、我目前正在使用小型模型、以便我可以继续开发我的项目。
    这是一个时间有限的解决方案、因为我最终需要上部存储器。

    您的、Ofec。