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:如何使用 FRAM 存储器而不是 RAM 8K

Guru**** 2387080 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/1201673/msp430fr5994-how-to-use-fram-memory-instead-of-ram-8k

器件型号:MSP430FR5994

您好!

我们将 MSP430FR5994 MCU 用于我们的一款产品、现在由于某些附加功能、我们需要额外的 RAM。 现在超过了8K。

我们希望为 RAM 类型的运行提供 FRAM 空间、因为我们的代码大小仅为35K。  

通过阅读文档、我们尝试使用.TI.servant 和#pragma 持久性在 FRAM 中映射一些大型数组。 在这里、我们将3600字节的缓冲区移到了 FRAM 中、但如果我们查看它的映射文件、它会显示在 SRAM 中分配的大小。

您能建议我们的做法有什么不妥吗? 或者告诉我们使用 FRAM 而非 RAM 的替代方法。

此致、

Pradeep Lokhande.

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

    .TI.servant 和#pragma 持久性

    您是否从编译器获得了任何警告? 我认为这些拼写为"persistent"[参考 CCS C 编译器 UG (SLAU132Y)第5.11.22节]。

    您可能需要也可能不需要使用 MPU [Build Settings->General->MPU [Tab]]。

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

    确保使用具有 持久定义的默认 cmd 文件、如下所示

    确保使用 代码中的 persistent、如下所示

    #pragma persistent (标志)

    无符号 内部 标志= 0;  

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

    如果我使用默认的.cmd 文件、那么我必须也映射我们现在使用的所有其他存储器部分。 要映射这些地址、您能分享一些用于映射的文档吗? 我们从过去5年开始使用该命令、产品进入市场、我们还需要分析它的影响。

    除了#pragma、我们是否还有其他使用 FRAM 的方法?

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

    您是否相当确定、.cmd 文件没有提及 TI.persistent 部分? 我 ccsv7 (2017)的 lnk_msp430fr5994.cmd 确实如此。

    为了使 FRAM 可写、您可以(a)禁用 MPU、从而使所有 FRAM 可写(大多数人不建议这样 做)、或者(b)使用.cmd 和.map 文件自行布置存储器保护功能。 这些操作都可以使用我提到的 MPU 选项卡来完成。

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

    正如 Bruce 提到的、确保该区域是可写的、并且您还尝试使用如下所示的指针

    #define T_Address1 0x5500

     *( 无符号 特性 *) T_Address1 = 0;

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

    您好!

    我们所理解的是、我们需要移动到 ccsv8提供的最新 cmd 文件。  

    但这里在 lnk_msp430fr5994.cmd 文件中提到的默认地址 与数据表或内存地址不匹配。

    请分享具有地址详细信息的相关文档(存储器映射)。

    只是查看 RAM 地址、根据数据表、它应该从3BFF 和2BFF 开始、在.cmd 文件中没有提到。

    此致、

    Pradeep Lokhande.

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

    数据表(SLASE54D)表9-41显示了从0x4000开始的 FRAM。 这 与 我从 CCSv8获取的(默认) lnk_msp430fr5994.cmd 的存储器部分中的("低") FRAM 区域匹配。 RAM 区域为0x1C00-0x2C00、而 LEA 共享 RAM (0x2C00-0x3C00)被称为 LEARAM。  我想你们可以将这些组合在一起(如果不使用 LEA)、但这不会影响 FRAM 的使用。

    我不知道您是否需要对您当前的.cmd 文件执行任何操作、因为我不知道它包含什么。 如果它基于您从 CCS 获取的.cmd 文件、则您可能不需要进行任何更改。

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

    Bruce、您好!

     

    由于这是我们非常古老的项目、我们不希望有太多变化。 但是、在此 MCU 中添加新功能之前、我们需要详细了解。

     

    我已经介绍了数据表 SLASE54D 中定义的存储器映射。 此处为最大 RAM、我们可利用8KB (包括 LEA 部分)。

     

    但在我们的链接器文件中、我们已将下方的低 FRAM 地址映射到.bss 段。 现在 CCSv8将其视为28K RAM (8K RAM + 20K FRAM)。 我们也在映射文件中对此进行了验证、此处所有未初始化的数据都直接移动到 BSS_RAM 区域。 已初始化的变量进入实际 RAM。 在这里、我们尚未使用任何#pragma 语句、但使用的所有变量与 RAM 变量一样好。

     

    BSS_RAM

    地址

    4000

    没有问题

    8FFF

    大小(K)

     20.0

     

    BSS_RAM 区域的链接器文件快照:

     

     

    将 BSS_RAM 区域映射到.bss 段。

     

    映射文件的快照、其中大多数变量映射到 BSS_RAM 区域而不是 RAM。

     

     

     

    在映射文件中、RW 数据值显示为6948。 如果我们在此处定义和使用大型20K 阵列、它也不会提供任何错误、并且数据也会显示26K 左右。

     

     

    我已附上我们项目的链接器文件和映射文件供您参考。

     

    请您确认一下、该分配是否正确。 我们是否可以将其视为可用于开发的28K RAM? 因为我们在此未使用任何#pragma。 请浏览随附的链接器文件和我们项目的映射文件。

     

    此致、

    Pradeep Lokhande.

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

    这是一个不寻常的用法,我还没有尝试过,但我不明白为什么它不起作用。

    我看不到您的附件、但我唯一关心的是具有对齐要求的 MPU。 使用 Persistent pragma 与链接器一起使用(通过 READ_WRITE_MEMORY 和_MPU_ENABLE)来为您设置 MPU 配置。 如果在这种范围内工作、我希望没问题。 如果不是这样的话、您可能必须通过 MPU 标签页手工设定 MPU。

    在您运行时是否有任何惊喜?

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

    e2e.ti.com/.../MSP430FR5994_5F00_Code_5F00_Files.zip

    请参阅随附的文件。  

     BSS_RAM 的20K 区域内。  除了8K RAM、我们还将其用作 RAM 区域。  

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

    链接器.cmd 执行一组内容来支持 MPU 设置、而您自定义的.cmd 中没有这些内容。 因此、MPU 选项卡对您没有实际帮助、所以我认为您需要直接配置 MPU。

    在遍历库源代码和链接器文件后、我得出了以下序列:

    int
    _system_pre_init(void)
    {
        MPUCTL0 = 0xA500;                           // Unlock and disable
        MPUSEGB1 = (unsigned int) (0x9000UL >> 4);  // Seg1/Seg2 border
        MPUSEGB2 = (unsigned int) (0x10000UL >> 4); // Seg2/Seg3 border
        MPUSAM   = (unsigned int) 0x1553;           // Info R, Seg3 RX, Seg2 RX, Seg1 RW
        MPUCTL0  = (unsigned int) (MPUPW | MPUENA); // Enable
        MPUCTL0_H = 0; //protect MPU registers
        return(1);                                  // Proceed with C init
    }

    我想您可以识别0x9000、如果您需要、也许可以为它定义链接器符号。 0x10000有些随意、因为段2和段3具有相同的访问权限。 它也不必打包为_system_pre_init、但这似乎很方便且及时。 我使用这个函数来使用你的.cmd 文件构建一个小程序、并且我能够写入.data 和.bss、但不是.text。

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

    Bruce、您好!

    根据您的回复、我们可以将.bss 区域 BSS_RAM 用作 RAM。 对吗?

    BSS_RAM 20K + RAM 8K,因此我们总共有28K 的 RAM 用量。 正确理解 RAM 区域定义主题后、我们将研究 MPU。

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

    简短答案是肯定的。 我过去已经这样做过、包括 DMA (我使用了"持久"、因为这样方便)。 上面我的"小程序"包括为.data (SRAM)、.bss (BSS_RAM)和.text (FRAM/2)中的每个字写入一个字。 前两次成功、第三次失败(忽略)。

    我鼓励您尝试一下、看看我们是否有任何尚未考虑到的方法。 特别是、似乎有某种动态(程序)加载正在进行、我无法真正进行测试。

    由于 NWAITS>0、在高 CPU 速度下、您可能会(也可能不会)看到非常轻微的性能成本。  

    我认为、不使用 MPU 做一些事情是不会成功的。 在当前程序中、(a)启用 MPU (使用默认值)、但无法写入任何 FRAM、或(b)禁用 MPU、您可以写入所有 FRAM (包括.text)。