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:存储器映射位置(可防止闪存自写覆盖程序存储器)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1522286/mspm0c1104-memory-map-location-to-prevent-self-write-of-flash-from-overwriting-program-memory

器件型号:MSPM0C1104

工具/软件:

我使用的是 MSPM0C1104 芯片、我需要将程序写入其自己的闪存。  

我在 CCS 的“New Project“窗口中找到了一些示例、这些示例展示了如何使用 DL_FlashCTL_{...}进行写入操作 功能。

我找不到的信息是:如何管理存储器映射以防止闪存写入意外覆盖程序存储器?

理想情况下、我希望:

  1. 指定构建工具不会写入的闪存块
  2. 如果现在已指定了编译的程序块、编译后的程序便无法放入较小的闪存空间中、这会引发错误

谢谢、
Seth

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

    尊敬的 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);
                ...
                ...

    随附示例工程。

    e2e.ti.com/.../flash_5F00_dynamic_5F00_memory_5F00_protection_5F00_modifed_5F00_linker_5F00_MSPM0C1104.zip

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

    尊敬的 Dennis:

    感谢您的全面答复。  您附加的项目运行良好。  

    对于我自己的教育背景、您能告诉我、要使用 Debug 目录之外的链接器文件、需要执行哪些步骤吗?  我尝试比较引用 device_linker.cmd 的各种工程文件、但它们都在自动生成的 Debug 目录中。  我还尝试将链接器文件移出 Debug 目录、在构建工程时、它会生成新的链接器文件、导致错误。  

    供以后阅读的任何人参考:

    • 附加项目的范围为 0->0x3BFF、但 Dennis 屏幕截图中的范围也有效(下一行的长度和原点值相同)。  所幸的是、链接器足够智能、可以在范围重叠等情况下抛出错误。  
    • 可以在 Project Properties -> Debug -> Category = MSPM0 Flash Settings 中找到擦除配置。 (不清楚最初在哪里找到它。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dennis:

    对员额的一项小的更正:

    擦除配置应为 0x0 - 0x00003BFF。  当我包含 0x00003C00 时、它会擦除存储在该段中的数据。   

    谢谢、
    Seth