你好
我将一些代码重新写入 MSP430FR6989、我需要比区域信息 A-D 的0x200字节更大的存储器部分 因为我正在重写现有的 EEPROM 例程、我不想使这些例程与现在完全不同。 我可以使需要的每个变量保持不变、但我认为通过定义完整的 FRAM 部分并将其视为 EEPROM 仿真、使其更容易。 然后、我可以在该区域使用常规读/写函数。 有人能说如何界定这种区域吗?
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、我需要比区域信息 A-D 的0x200字节更大的存储器部分 因为我正在重写现有的 EEPROM 例程、我不想使这些例程与现在完全不同。 我可以使需要的每个变量保持不变、但我认为通过定义完整的 FRAM 部分并将其视为 EEPROM 仿真、使其更容易。 然后、我可以在该区域使用常规读/写函数。 有人能说如何界定这种区域吗?
您好、Adam、
如果您想在 FRAM 上执行 EEPROM 仿真、请参阅以下资源。 我们提供了有关此主题的应用手册和 TI 设计、可解决您的问题。
应用手册: www.ti.com/lit/slaa769
您好 Jace、
这不是我需要的、我已经看到了这些 PDF。 现在让我们完全忘记 EEPROM、我只想为编译器/链接器标记 FRAM 中的某个区域、使其不存在代码/数据、然后我可以轻松地将数据读取并写入该 FRAM。 现在、我可以使用0x1800-0x2000的信息区域、但它有点太小了。 我可以假设编译器不应意外使用这些区域。 我可以使用一些引导加载程序器件、因为它就在它旁边。 或者、只要在我想要的任何位置编写代码就足够了、如果我不使用引导加载程序、并且我猜信息 A-D 未被使用、这是可以的? 但是、如果需要更多的 FRAM 用于数据、那么了解如何保留 FRAM 的任何部分是很好的。 我使用默认的 TI 编译器
我找到了一些解决方案、首先定义如下:
pragma PERSISTENT (A)
uint16_t a[1000]={0};
事实证明、MSP430FR6989会自动将数据放在0x4400地址上、并且空间很大、因此一个问题就解决了。 其次、在工程属性中设置 MPU 选项是一个选项、或者更改链接器脚本、但它不起作用。 我尝试更改 FRAM 的 cmd 文件中的默认区域和长度、但它不会编译、说它是重叠的、但不会。 奇怪
一些可能会指导您的观察结果:
1)每次重新加载代码时、持久性数据都会被覆盖(它在.elf 文件中显示为.text-ish 段)。 如果这不是你想要的(几乎不是我想要的),请使用 NOINIT()。
2) 2)信息段的优点是:(a)它们已经出现在.cmd 文件中、(b)它们始终保持在它们所在的位置。 当您重新编译/重新加载代码时、persistent 和 NOINIT 数据可以移动。 处理此问题的唯一方法(我知道)是使用 DATA_SECTION ()来定义私有段,并在.cmd 中添加一个内存和一个 SECTIONS 行,以强制它在您想要的位置运行(如 David 所说, FRAM 的顶部通常是一个不错的选择)。
3) 3)默认情况下、代码下载程序将擦除所有 FRAM。 您可以使用"Project->Properties->Debug->MSP430 Flash Settings->Erase Options"来避免这种情况。 选择"替换已写入"或"需要擦除"(有区别、我模糊地回忆起其中第一个更好的工作)。
4) 4) CCS 中的 MPU 编辑器存在的一个危险是(观察到的行为)使用"manually specify"框不会为您提供默认的 MPU 映射。 您应该仔细检查所有设置、并确保所有代码都具有读取和执行权限。