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:执行 MSP430程序时 RAM 数据会自动更改

Guru**** 2392005 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/994838/msp430fr5994-ram-data-changes-spontaneously-while-executing-the-msp430-program

器件型号:MSP430FR5994

我在同一电源(3、4V)上使用 MSP430FR5994和 LTE 调制解调器。 当调制解调器关闭时、一切都正常、但当它打开时、MSP439FR5994中的 RAM 数据开始自发变化(并非总是如此、而是不时发生变化)。 MSP430中没有任何时间发生复位。 在示波器上、电力线似乎是稳定的。

其他配置:现在我将 MSP430FR5994放在单独的电源上、MSP430和调制解调器之间的唯一连接是从调制解调器到 MSP430 (和 GND)的中断线路。 随机 RAM 变化的问题仍然存在。 因此、MSP430的 Vcc 电力线可能会因这个问题而被部分排除。

因此、我假设它可能是电力线(或中断线路)上的尖峰、或者由调制解调器引起的其他问题、从而改变 MSP430中的 RAM 内容。 有人是否遇到过类似的问题? 来源可能是什么? 该问题的解决方法是什么?

感谢你的帮助。

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

    作为(主要)软件人员、我倾向于首先怀疑软件。 阵列溢出(包括失控 DMA)或堆栈溢出可能会产生间接影响、这可能首先显示为随机字节转换。 错误字节的值通常会提供线索。

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

    感谢你的答复。 但在实际情况下、我不认为这是软件情况、因为它仅在互联网中调制解调器的登录阶段发生。 此时、没有其他有关进入 MSP430的数据或中断线路的信息。 MSP430独立工作、无需任何额外的活动(只有 LPM 中的"while (1)"循环)。

    在该调制解调器网络登录阶段、调制解调器已将功耗从几 uA 快速变为1A (短电源脉冲)。 我无法用示波器进行足够精确的测量、但我想、它可能是 Vcc 电源中非常短的干扰(或类似干扰)、导致这些 RAM 错误。 当这些尖峰在任何引脚(Vcc、UART 或端口)进入 MSP430时、MSP430的 RAM 会收到一个随机脉冲来改变这些值。 您对这一假设有何看法?

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

    SRAM 单元非常稳定、使其变得不稳定需要很多时间。 Vcc 压降足以触发掉电复位。 但是、如果您在每个 Vcc 引脚上都有推荐的电容器、那么快速变化就不太可能。

    软件是最可能的问题。 但是、如果调制解调器的电源要求变化很大、则需要仔细设计电源、以防止电源泄漏到电源轨中。 在极端情况下、可能需要专用的稳压器和仔细的接地系统设计。

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

    感谢你的答复。 在我们的情况下、专用电压稳压器无法成为解决方案、因为正如我在前面提到的、如果只有一条中断线连接到 MSP430的端口(调制解调器和 MSP430为2个独立的电压稳压器)、RAM 错误也会发生。 在 PCB 上、MSP430的每个 Vcc 引脚上都有一个100nF 电容器。  

    为了测试软件的影响、我编写了一个非常小的程序、该程序仅切换输出端口。 单个全局变量(在"test.h"文件中定义并在"main.c"文件中使用)在调制解调器初始化期间也会随机更改、但不会对 MSP430进行复位。 如果在同一电源线上没有调制解调器、则 MSP430完全没有问题、具有相同的全局变量。 我发现、它主要(最终仅限)涉及全局变量。 因此、我认为、如果它是软件用途、它可能不是 RAM 溢出、而是其他一些我这次不知道的东西。 有人是否有进一步检查的想法?

    我们是否可以尝试在中断和 UART 线路上放置较小的附加电容器? 有可能吗? 过去是否有人对其进行过测试?

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

    此外、我发现、如果我使用属性"__attribute__((section (".TI.noinit")));")、则不会再随机更改全局变量。

    这是否可以表明我们的问题的根源? "noinit"段中的变量保存方式是否与 RAM 中的正常变量不同? 感谢你的帮助。

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

    noinit 被单独分配、即在.bss/.data 不同的地址处。 您可以比较.map 文件以查看是否有线索。

    这似乎仍然指向软件(错误指针?)、但正如我提到的、我总是首先(几乎)责怪软件。

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

    Noinit 还意味着在复位后不会初始化变量。  

    是否确定由于调制解调器的电源噪声 MSP430未复位?  "已损坏"的变量是否可能刚刚恢复其初始化状态、然后从此处运行?

    您说过您创建了一个简单的测试程序、并且仅在调制解调器运行时才再次看到问题。  您能在这里分享一下这个简单的测试程序吗?  

    谢谢、

    JD   

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

    感谢您的回复。

    我的测试代码与此类似(见下文)。 较长的等待时间(在 while 循环之前)有助于我检测 MSP430的最终复位。 在正常代码中、我可以通过寄存器读出它。 这里不会发生复位。 经过一段时间后、"IF (TERM_Reply[1]=0x45)"测试变为负值、并且 LED 始终保持开启或关闭状态。 如果在实数完全复位的情况下、示例代码(TERM_RESPON1]=0x45;)中的重新初始化会重新启动代码、但这不会发生。

    此外、我发现、当调制解调器和 MSP430仅与 Vcc 连接时、它工作正常。 当我现在连接一条介于两者之间的其他数据线(调制解调器的 TX、或者一条到 MSP430的中断线)时、MSP430 RAM 会下降并且"if (term_Reply[1]=0x45)"代码始终为 false。

    我测试了 TX 调制解调器和 RX MSP430的电流分离。 在这种情况下、MSP430再次运行良好。 我想、这是进入 MSP430端口的东西、干扰了他的工作。 有人过去是否注意到类似的影响?

    ---- main.c ----------------------------------------------------------

    #include
    #include

    void initPorts (void);

    unsigned char term_reply [term_BUFSIZE];

    int main (空)

       WDTCTL = WDTPW | WDTHOLD;   //停止看门狗计时器
       initPorts();
       PJOUT = 0;
       PJSEL0 = BIT4 | BIT5;
       PJDIR = 0xFFFF;
       PM5CTL0 &=~LOCKLPM5;
       P8OUT ^= 0x02;  //调制解调器打开
       int i;

       TERM_回复[1]=0x45;

       P6OUT ^= 0x20;  //LED 打开(等待时间长)
       对于(i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}
       对于(i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}
       对于(i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}
       对于(i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}
       对于(i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}
       对于(i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}
       对于(i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}
       对于(i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}
       对于(i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}
       对于(i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}

       while (1)
         {for (i=0;i<30000;i++){WDTCTL = WDT_ARST_250;}  //非常简单的等待计时器
         if (TERM_Reply[1]=0x45){P6OUT ^= 0x20;}  //切换 LED
       }

    ---- 试验.h----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    #define TERM_BUFSIZE       (255)

    --------------------------------------------------------------------

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

    您好!

    您似乎已经缩小了行为的来源、这在某种程度上与调制解调器的噪音有关。  如果我理解正确、那么通过通信引脚输入的噪声似乎比电源轨输入的噪声还要大、您的假设是这样吗?    

    我以前没有看到任何有关这种确切行为类型的报告、也没有在勘误表文档中看到任何相关内容、但通常会根据应用定制噪声极高的环境。  在我以前的高噪声环境经验中、某种形式的复位是最常见的问题、但它不是唯一的问题。  即使在这种情况下、降低 MSP430并保护其免受高环境噪声影响实际上也会成为系统级问题。   

    《MSP430系统 ESD 故障排除指南》中提供了更多相关信息、第2节确实将内存损坏列为 ESD/EMI 导致的故障示例。  我建议查看该应用手册以及 我们的 MSP430系统级 ESD 注意 事项应用手册、尝试找到提高系统级 EMI 抗扰度的方法。

    谢谢、

    JD