工具/软件:
我使用的是 MSPM0C1104 芯片、我需要将程序写入其自己的闪存。
我在 CCS 的“New Project“窗口中找到了一些示例、这些示例展示了如何使用 DL_FlashCTL_{...}进行写入操作 功能。
我找不到的信息是:如何管理存储器映射以防止闪存写入意外覆盖程序存储器?
理想情况下、我希望:
- 指定构建工具不会写入的闪存块
- 如果现在已指定了编译的程序块、编译后的程序便无法放入较小的闪存空间中、这会引发错误
谢谢、
Seth
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.
工具/软件:
我使用的是 MSPM0C1104 芯片、我需要将程序写入其自己的闪存。
我在 CCS 的“New Project“窗口中找到了一些示例、这些示例展示了如何使用 DL_FlashCTL_{...}进行写入操作 功能。
我找不到的信息是:如何管理存储器映射以防止闪存写入意外覆盖程序存储器?
理想情况下、我希望:
谢谢、
Seth
尊敬的 Seth:
首先、为了保护一系列闪存免受应用程序自擦除/编程的影响、请考虑使用 TRM 中第 5.4 节所述的动态写保护方法。 它将允许应用对一个或多个扇区进行写保护、防止 CPU 意外擦除/编程操作。 如果应用程序需要修改受写保护的扇区、请禁用写保护(修改 CMDWEPROTA 寄存器中的 R/W 位)并修改扇区。 在编程/擦除周期结束时、写保护会自动重新启用。 这就是它在 EEPROM 仿真中的使用方式。
顺便说一下、MSPM0 SDK 中有一个这样的示例。 您可以在以下文件夹中找到它:
C:\ti\mspm0_sdk_2_04_00_06\examples\nortos\LP_MSPM0C1104\driverlib\flashctl_dynamic_memory_protection
接下来、要保护该扇区免受外部编程/擦除 (XDS100) 的影响、请找到要保留为闪存中最后一个扇区的扇区。 例如、在 mspm0c1104.cmd 链接器脚本文件中、闪存在地址= 0x00000000 处定义、长度= 0x00004000、我们希望保护闪存中的最后一个扇区。 因此、从 MAIN 闪存区域借用一个扇区、然后调用 EEPROM 并找到它 0x00003C00、长度= 0x00000400。 BTW、1 个扇区大小为 0x00000400。 由于您要修改链接器文件、因此 必须将 EEPROM 分配给“存储器段“、例如、创建一个并将其命名为.calib(校准)。 现在、编译器/链接器可以使用此符号来表示 EEPROM 存储器的起始地址。 请参阅下面的如何进行更改。
然后、您将需要设置 XDS110 调试器擦除配置、以将编程器限制为仅擦除从 0x00000000 到 0x00003C00 的闪存区域(如此处所示)、使 0x00003C00 到 0x00004000 保持不变。
最后、在代码中、您可以通过如下声明变量并传递该变量的地址来访问此存储器部分、并作为 uint32_t 转换为 DL_FlashCTL 函数。
/* * Assign the eepromCalibrationTable to the memory section ".calibration" * that was created in the linker .cmd file. */ __attribute__((section(".calibration"))) uint32_t eepromCalibrationTable; int main(void) { SYSCFG_DL_init(); ... ... ... /* * Ensure proper flash command execution by clearing the STATCMD * register before executing a flash operation */ DL_FlashCTL_executeClearStatus(FLASHCTL); DL_FlashCTL_unprotectSector( FLASHCTL, (uint32_t) &eepromCalibrationTable, DL_FLASHCTL_REGION_SELECT_MAIN); /* Program to flash in main memory */ gCmdStatus = DL_FlashCTL_programMemoryFromRAM32( FLASHCTL, (uint32_t)&eepromCalibrationTable, &gData32); ... ...
随附示例工程。
尊敬的 Dennis:
感谢您的全面答复。 您附加的项目运行良好。
对于我自己的教育背景、您能告诉我、要使用 Debug 目录之外的链接器文件、需要执行哪些步骤吗? 我尝试比较引用 device_linker.cmd 的各种工程文件、但它们都在自动生成的 Debug 目录中。 我还尝试将链接器文件移出 Debug 目录、在构建工程时、它会生成新的链接器文件、导致错误。
供以后阅读的任何人参考: