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:有时在软件复位后 noinit 变量将更改为0

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1245809/msp430fr5994-sometimes-the-noinit-variables-changes-to-0-after-a-software-reset

器件型号:MSP430FR5994
主题中讨论的其他器件: MSP-CGT

我们在 MSP430FR5994程序中使用一些 noinit 变量。 例如:
extern volatile unsigned int test_timer __attribute__(section (".TI.noinit")));

通常情况下,对于几乎所有的模块,在软件复位("reset();")或断电后,所有 noinit 变量仍然正确,使用旧的初始化值(重置或关机操作之前保存的值)。 这正是我所期望的。 NOINIT 变量不会改变、因为它们"永久"存储在 FRAM 中。

现在、对于少量器件(所有器件约为10%)、这些 noinit 变量主题在复位后将无法保存。 在软件复位或断电复位后、它们始终显示"0"。 例如:
TEST_TIMER=10;  //变量初始化
Reset ();  //软件复位
// TEST_TIMER 变量现在重置为 o

我使用 PERSISTENT pragma 尝试、但结果是相同的。

是否有人追究了类似的问题? 这种影响的根源是什么? 在软件复位后、可避免将所有 noinit 变量重新初始化为0的解决方案是什么? 那么、如果应在复位后保存变量、最好使用 NOINIT 或 PERSISTENT 呢?

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

    您好!

    这可能与您正在使用的编译器版本有关。 您是否试用过最新的 MSP-CGT v21.6.0.LTS https://www.ti.com/tool/MSP-CGT

    对于 NOINIT 和 PERSISTENT、它们非常相似、并且都可以 防止此类变量在复位期间初始化。 对于有差异的信息、您可以访问此链接第5.11.22.https://www.ti.com/lit/ug/slau132y/slau132y.pdf 章节。

    此致、

    现金豪

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

    感谢您的回答。

    我使用最新编译器版本(v21.6.0.LTS)进行了尝试、但遗憾的是、这没有任何变化。 在简单的软件复位后、noinit 变量仍重新设置为0。 最初我将 v20.2.0.LTS 编译器版本与 CCS 版本11结合使用。 因此不涉及编译器版本。

    独立于编译器版本、我发现非常奇怪的是、此错误仅发生 在使用相同硬件和软件的少量器件上。 在所有其他器件上、在软件复位或断电后、变量仍保留在存储器中。 在所有其他方面,我不能找到器件之间的任何差异( LPM ,通信,电流消耗,...). 他们都是相同的,工作良好,做所有的事情,我预期。

    有人有其他想法来解决此问题吗?

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

    您好!

    这很奇怪。  变量时使用 persistent 来定义这些变量。 启用 MPU 将有助于解决复位问题?

    此致、

    现金豪

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

    您好!

    很遗憾、我不明白您对"启用 MPU 将有助于解决重置问题"的具体意思。

    我 µC 了相同的变量、使用相同的 CCS 源代码和编译器在不同的 MSP430FR5994 μ C 单元中的反应不同。 在大多数器件上、一切都没问题、但在少量器件上、在软件复位后、存储器始终重新设置为0、而这与 NOINIT 或 PERSISTENT 的使用无关。 另一方面、在我们的 PCB 上没有其他器件消耗电流(3.4V、电流<2mA)。

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

    您好!

     定义完这些 变量后、启用 MPU 函数以保护该 FRAM 区域。 有关 MPU 的工作原理、请参考 UG。 您可以参考此示例代码、了解如何启用 MPU 功能。  https://dev.ti.com/tirex/explore/node?node=A__AFyrz5oWa9pbb95w3rkZiA__msp430ware__IOGqZri__LATEST&placeholder=true

    如果启用 MPU 有助于解决该问题、这将是最简单的方法。  

    此致、

    现金豪