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.

[参考译文] MSP430FR5959:无法在 FRAM 中写入数据

Guru**** 2489685 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1552788/msp430fr5959-unable-to-write-data-in-fram

器件型号:MSP430FR5959


工具/软件:

当变量声明为 如以下代码所示 但无法在同一 变量上写入数据时。期待您的帮助。

#pragma NONINIT (DEMO_CONFIG)
unsigned char demo_config[2]={1};

typedef 结构{
unsigned char A;
unsigned char b;
}DEMO_CIONFIG;
DEMO_CIONFIG GOST_demoConfig;

GOST_demoConfig.a =5;
memcpy (&demo_config、&GOST_demoConfig、sizeof (GOST_demoConfig));
GOST_demoConfig.A = 0;
memcpy (&GOST_demoConfig、&demo_config、sizeof (demo_config));

putch1 (((GOST_demoConfig.a)/100)%10 +'0');
putch1 (((GOST_demoConfig.a)/10)%10 +“0")“);
putch1 ((GOST_demoConfig.a)%10 +'0');

每次上电后、变为 255 ( GOST_demoConfig.A)

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

    如果您尚未更改链接器 (.cmd) 文件、则 NOINIT 变量(段.TI.noinit)将被放置在 RAM 中。 [我假设您是 NOINIT、因为“#pragma NONINIT ()“将被忽略。]

    如果您更改了链接器文件、请描述这些更改、因为您可能(或者可能不需要)需要涉及 MPU。

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

    我在链接器 (.cmd) 中更改了、但仍然无法设置值、期待您的帮助。

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

    请描述您对.cmd 文件所做的更改。

    我在 FR5969 (Launchpad) 上试用了您的代码并观察到:

    1)“#pragma NONINIT“确实被忽略(带有警告)、并将 DEMO_CONFIG 放置在 RAM (.data) 中。

    2) 将它更改为“#pragma NOINIT“得到了关于初始化的不同警告(“={1、}“)、而且--更重要的是--它显然忽略了 NOINIT 规范、并将 DEMO_CONFIG 放在 RAM (.data) 中。

    3) 移除初始化后、将 DEMO_CONFIG 放入.TI.noinit(仍在 RAM 中)。

    4) 更改链接器文件以将“.TI.noinit"行“行向下移动到 FRAM 底部的可写区域(.TI.persistent 旁边)、将 demo_config 置于 FRAM 中并允许我写入。

    cmd 片段现在看起来像:

            GROUP(READ_WRITE_MEMORY)
            {
               .TI.persistent : {}              /* For #pragma persistent            */
               .TI.noinit  : {}                 /* For #pragma noinit                */
               .cio           : {}              /* C I/O Buffer                      */
               .sysmem        : {}              /* Dynamic memory allocation area    */
            } PALIGN(0x0400), RUN_START(fram_rw_start)
    

    5) 将 Project->Properties->Debug->MSP430 Flash Settings->Erase Options 设置为“Needly segments only“、可以通过代码下载保留 demo_config。

    【编辑:轻微澄清。】

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

    你好 Namita — 布鲁斯的建议对你有用吗?

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

     我们在.cmd 文件中进行了这些更改

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

    但它还没有发挥作用

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

    此更改将 NOINIT 段置于只读 FRAM 中、而上述步骤 (4) 将其置于可写 FRAM 中。 如果没有步骤 (2)-(3)、您的变量无论如何都不会放在该部分中。

    我建议您进行我描述的所有更改、即 (a) 更改 NONINIT->NOINIT (b) 删除初始化值 (c) 将.TI.noinit 移至 READ_WRITE_MEMORY 组 (d) 更改“擦除选项“、因此重新加载代码不会擦除 NOINIT 段。

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

    我们根据附加的图像进行了更改、为了验证其是否有效 、我们将语法写如下  

    #pragma NOINIT (DEMO_CONFIG)
    unsigned char demo_config[2]={};

    GOST_demoConfig.a =5;
    memcpy (&demo_config、&GOST_demoConfig、sizeof (GOST_demoConfig));
    GOST_demoConfig.A = 0;
    memcpy (&GOST_demoConfig、&demo_config、sizeof (demo_config));

    putstr1(“\nu16_TimePM:“);
    putch1 (((GOST_demoConfig.a)/100)%10 +'0');
    putch1 (((GOST_demoConfig.a)/10)%10 +“0")“);
    putch1 ((GOST_demoConfig.a)%10 +'0');

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

    您看到了什么结果?

    您是否收到有关  demo_config[]初始化程序的警告? (可能是一个零初始化值在某种程度上不同。)