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.

[参考译文] 答复:msp430fr6989写入FRAM

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/616910/re-msp430fr6989-write-in-fram

主题中讨论的其他部件:MSP430FR6.9891万

原始主题: https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/48.5532万/2272339#2272339</s>227.2339万 227.2339万

您好,Katie:

非常感谢您发布此信息。

我在尝试将FRAM用作变量存储(例如日志记录)的RAM时遇到类似问题。  我正在使用MSP430FR6.9891万和CCS 7.2 .0和MSP430 C v编译器16.9 .4.LTS。  我在您的回答中提供的一个链接中注意到,编译器是较新的17.6 .0.STS。  编译器版本可能是这里的问题?

我正在使用#pragma持久性功能,变量(缓冲区)放在RAM中,而不是放在FRAM中。  但是,当我将缓冲区放置在特定的FRAM位置(例如  #pragma location = 0x4400),然后将缓冲区放置在FRAM中。  但是,这显然会对代码执行步骤,因为现在代码会崩溃。

提前感谢您对此问题的任何帮助。

谢谢!
亚当

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

    您能否发布一个代码片段,说明您如何设置缓冲区?

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

    感谢您的回复。

    以下是设置方式:

    #pragma NOINIT (FRAM_WRITE)
    #pragma persistent( FRAM_WRITE )
    //#pragma 位置= 0x4400;
    unsigned long fRAM_write[128];


    然后在main()中,它首先执行的操作是:

    memset( fRAM_write, 0xA5, sizeof( fRAM_write ));


    FRAM_WRITE变量最终位于RAM中,如以下映射文件所示:

    这会将FRAM_WRITE置于RAM中,如内存映射中所示:

    输出 属性/
    书帖页面原点 长度 输入部分
    ----------------- -------- -------- --------
    BSS 000001 00001c000000059a 未初始化
    0.0001万c00 000002000万00200</s>0.02万 (.common:fRAM_write)



    当我使用 #pragma 定位功能时,它将进入FRAM。 代码如下:

    #pragma NOINIT (FRAM_WRITE)
    #pragma persistent( FRAM_WRITE )
    #pragma 位置= 0x4400;
    unsigned long fRAM_write[128];

    和映射文件:

    .TI.Bound:FRAM_WRITE
    * 0.0044万 0000440万 0000.02万 未初始化
    0.0044万00 000002000万00200</s>0.02万 main.obj (.ti.bound:fRAM_write)


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

    您好,Adam:

    我认为#pragma NOINIT和#pragma persistent不应一起使用。 构建时CCS是否会抛出任何警告消息?

    对于持久性,它实际上需要有一个初始化值,例如

    #pragma persistent( FRAM_WRITE )
    unsigned long FRAM_write[128]={0}; 

    这与NOINIT冲突,因为这将要求您没有初始化值。 在这种情况下,NOINIT似乎是在取代持久性,所以让我们去除掉它。

    我建议单独使用持久性,如我上面的例子所示。 我刚刚在 编译器版本中尝试了此功能,它似乎工作正常。  初始化设置的值仅在您第一次将代码加载到部件时设置,但编译器将使c-startup代码不会在每次启动时重新初始化该区域。 这样,您的FRAM值将不会被c启动代码擦除,并将通过电源循环或代码重置来保留。 持久也是MPU工具用于自动处理MPU的内容。

    此致,

    Katie

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

    非常感谢您的快速回复。 非常感谢!

    对于我发给你的代码版本,我有持久性和NOINIT,但我也尝试了它们,没有区别。 我尝试了所有的排列(但只发送给你其中一个),但没有一个成功。

    但是,您建议为其提供初始化值,解决了问题! 这是我没有做的事。

    它的作用是:
    #pragma persistent( FRAM_WRITE )
    unsigned long fRAM_write[128]={0};

    这不起作用:
    #pragma NOINIT( FRAM_WRITE )
    unsigned long fRAM_write[128]={0};

    因此,它看起来唯一的选项是使用FRAM放置的持久性pragma。 NOINIT pragma将不起作用。 我只是为清楚起见才添加了这一条。 您没有建议NOINIT技术。

    再次感谢Katie的帮助。 你一直都很乐于助人!

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

    这就引出了另一个问题。

    是否有办法在FRAM中锁定变量的位置(从生成到生成)? 换言之,固件版本A发布到该字段中,版本B随之出现,但由于版本中的变化,FRAM变量已被链接器移动。 我意识到有#pragma定位功能,也许这就是实现这一功能的方法。

    提前感谢您的帮助。

    再次感谢您对前面的FRAM问题的帮助。

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

    您好,Adam:

    如果始终将FRAM变量作为变量引用,而不是尝试用指针写入硬编码地址,那么链接器放置变量的位置应该不会有任何影响。 所以我的问题基本上是为什么要锁定FRAM变量的特定地址-用例是什么? 有方法可以执行此操作,但在这种情况下,最终不使用MPU初始化的自动链接程序处理,还需要自定义链接程序文件。 因此,如果您可以像访问变量,数组等那样访问FRAM,而不是使用语句写入硬编码地址,那么这将对您来说长期来说容易得多。

    使用持久性,缺省链接程序文件将所有读+写变量放置在部件FRAM的开头。 但是,如果您添加/删除/更改 变量的大小,它们最终可能会在该组中的地址稍有不同。 但正如我所说的那样,很少有需要实际设置特定绝对地址的用例-使用变量/数组的优点 是您不需要知道绝对地址。

    此致,

    Katie

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

    感谢您的回复。

    例如,固件具有一组位于FRAM中的系统参数,这些参数需要在电源循环中保持不变。 例如,前面板LCD对比度设置,它位于FRAM地址0x4400。 因此,对于固件版本,此设置为0x4400。 现在,对于修订版B,对代码进行了一些更改,内容发生了变化,现在LCD对比度设置的位置与FRAM地址0x4410稍有不同。 这显然不起作用,因为安装版本B固件时,它将查看地址0x4410以了解LCD对比度设置,但实际上它的使用地址是0x4400,导致设置未正确应用(例如,应用了垃圾值)。

    希望这个例子是有道理的。

    我同意您的意见,即需要自定义链接程序文件。 因此,我需要进一步探讨该选项。

    感谢你的帮助。 非常感谢。

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

    自定义链接器文件方法如何为您提供帮助-您是否需要任何指导来启动和运行该方法?

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

    您好,Katie:

    自定义链接程序文件运行良好。  现在,我已经创建了一个自定义链接程序文件,在FRAM中为永久存储定义了一个部分,并为其提供了在启动时未自动初始化为零的属性,它正是根据需要工作的。  这是我一直在寻找的解决方案,实现这一目标的唯一方法是使用自定义链接程序文件。  我在过去对其他处理器也做过同样的事情,因此这是使用MSP430实现这一目标的方式是完全有意义的。  我非常喜欢TI有关链接器文件格式的文档。  这是非常彻底的,我非常感谢。

    感谢您的帮助。

    亚当

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

    很棒! 我很高兴听到为您制定的所有方案。

    此致,

    Katie