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/MSP430FR2355:FRAM 问题和变量

Guru**** 2538955 points
Other Parts Discussed in Thread: MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/900219/ccs-msp430fr2355-fram-questions-and-variables

器件型号:MSP430FR2355

工具/软件:Code Composer Studio

美好的夜晚

我有一个应用、在该应用中、我希望 MSP430FR2355上的默认 ID 存储在非易失性空间中。  通过系统配置、我想在 MSP 中的单独非易失性位置写入一个新的用户 ID。  我希望这个新 ID 可读并被查询。 如果用户决定执行硬电路板复位、我希望设备恢复为默认 ID、这将允许用户创建并写入新的用户 ID。   … 有人能告诉我我可能想要了解哪些预编译器 pragma 吗? (只是永久性的?)  作为一名了解 C 语言但对编译器和链接器了解不多的硬件人员、我在这里很费劲。  我已经测试了 persistent,并在.map 文件中找到.TI.persistent 和变量名称...如果我创建了第二个 persistent 变量,我将无法在.map 中显示它...

谢谢

Steve

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

    您需要确保程序中有一个指向您正在创建的变量的引用(在某处)、或者链接器会将它们输出为"未使用"。 ("volatile"不适用于此、因为这是 C 概念)。

    持久的声音、就像您想要的那种东西。 每次加载新代码时都会初始化 persistent 变量、但每次重置时不会初始化。 我不确定为什么您的非默认用户 ID 需要位于非易失性存储器中、因为您希望在每次复位时清除(重新初始化)它。

    相关的功能包括 NOINIT、LOCATION 和 DATA_SECTION、它们可实现此目的。

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

    信息内存是存储配置数据的常用位置。

    我不知道您所谓的"硬电路板复位"是什么意思。 这与上电复位有何不同? 您的软件如何辨别差异?

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

    非默认用户 ID 将是静态的,并且在重置时也需要保留(永久性?)...也就是说,设备将默认发货,用户将创建一个系统(ie....userID)... 这将是静态的,即使在断电/上电周期期间也将保持不变,但是用户确实有一个硬件复位按钮,允许他返回默认值并使用新的用户号重新刷新用户 ID .....

    我猜、persistent 也是用户 ID 的正确选择吗?

    我将研究位置/数据段 pragma ...我希望我可以在 c 文件中执行这些操作,而不必使用 linker.cmd 文件,因为这看起来非常神秘????

    谢谢

    Steve

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

    这组指令中的每一条都提供了略有不同的使用模型。 Persistent 会让您继续。

    正如大卫所指出的,信息记忆是一个相当标准的地方来放置这些东西。 您可以使用 data_section()来执行此操作 ,".info")。 其优点是:

    1)信息存储器(也称为"数据 FRAM")通常具有写保护功能、其中(在 FR2355上)会读取/写入持久性数据。 您可以通过运行 SYSCFG0:DFWP 来打开/关闭它

    2) 2)链接器不会自行将任何内容放入.info 中、因此除非您移动变量、否则该变量不会移动。

    3) 3)如果您不提供初始化值、则在下载期间不会覆盖该值。 [另请参阅属性->调试->闪存设置]。 这又意味着您需要确定何时需要初始化它。

    您可以通过任一种方式执行该操作、而无需接触链接器文件。

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

    布鲁斯······

    我读过并重新读过你的上述回答,但有点困惑… 因此我能够使用(在 main 之前、例如全局变量)

    #pragma PERSISTENT (PERSISTENT _Info)
    char PERSISTENT_Info[9]={'1'、'2'、'3'、'4'、'0'、 "0"、"0"、"0"、"0"、"0"};
    

    然后、在代码中、我通过逻辑执行了一个分配

    Permanent _ Info[8]= tmp;
    

    它可以正常工作(即我在 CCS 中进行了软复位、信息仍然存在)

     CCS 中是否有方法可以调试您不重新加载代码的地方?  我想关闭主板电源并重新连接 CCS 以查看永久信息空间并查看它仍然在... 通常、在我关闭电路板电源后、我必须点击"调试"以进行连接、这将擦除永久性_Info[8]空间。

    2.我看到上面的加载了0x8000.....的变量 这似乎是数据表所称的"主要:代码存储器"的底部...我猜、如果我添加了#pragma DATA_SECTION PERSISTENT_Info[9].info 并在0x19FF 和0x1800之间的某个位置使用位置(再次按照数据表"Information FRAM") 那么、只要我只将闪存设置保留在擦除主程序中、每次运行调试器/关闭系统时、我都看不到它被加载了吗?

    3. 现在假设#2正确、我将对其进行实验、我是否应该在写入 DEAL_Info[8]字符之前对 SYSCFG0.DFWP 进行计时?

    … 我已经在 main 之前的代码中添加了以下行:

    #pragma PERSISTENT (PERSISTENT _Info)
    #pragma DATA_SECTION (untouchables、"Info")
    
    char PERSISTENT_Info[9]={'1'、'2'、'3'、'4'、'0'、 "0"、"0"、"0"、"0"、"0"};
    #pragma LOCATION (DEAL_Info、 0x1800)
    

    CCS 构建、我现在可以在0x1800处看到我的变量...上面的内容是否正确?  在.cmd 或.map 中,我仍然无法在任何地方看到“untouchables”。。。 我是否需要做其他事情?

    谢谢

    Steve

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

    这就是我(认为我)描述的行为。 在某些器件上、持久性(本身)数据是只读的、但在 FR2355上不是。

    1)" ->调试为->调试配置->程序->仅加载符号"。 此设置是粘滞的、因此当您想要真正下载时、您必须将其改回。  

    2) 2)如果使用 persistent、则需要为其提供初始值、因此它会在下载时设置该初始值。

    如果您使用 DATA_SECTION (、".info"):(a)如果您为其提供一个值(C 初始化程序)、下载将在该值处放置(b)如果您不为其提供值下载将不会触碰它。  

    3) 3)如前所述、如果您没有在程序中的某个位置引用"不可接触的"、链接器将丢弃它。

    [编辑:是的、如果它位于信息存储器中、则需要清除/设置有关更新的 DFWP。 在我的世界中、这是一项功能。]

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

    布鲁斯...

    非常感谢您的帮助!  下面是我的代码,它似乎按预期工作...如果你看到任何我出错的地方,请进行评论...作为一个处理 pragma /链接器的硬件人员,似乎有点麻烦...几乎像 Linux:)

    #pragma DATA_SECTION (PERSISTENT_Info、".info")
    #pragma LOCATION (PERSISTENT _Info、0x1800)
    
    char PERSISTENT_Info[9]={'1'、'2'、'3'、'4'、'0'、 "0"、"0"、"0"、"0"、"0"};
    

    在代码内、我有:

    SYSCFG0 = 0xA501;//解锁对信息存储器的写入
    Permanent _ Info[8]= tmp;
    SYSCFG0 = 0xA503;//锁定写入信息存储器
    

    这似乎起作用了...我在.map 文件中看到的是永久性_Info、而不是.cmd 文件中的信息...猜测这不是什么大问题、因为#pragma 会替换我
    执行相同操作的.cmd 文件。。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    段名".info"出现在.cmd 文件中--这就是将它联系在一起的原因。

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

    您好、Steve、

    您的问题如何? 您是否仍然需要我们的支持?

    此致

    Johnson