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.

[参考译文] MSPM0L1227:如何设置闪存静态写保护 (SWP)

Guru**** 2777545 points

Other Parts Discussed in Thread: SYSCONFIG, LP-MSPM0L2228, MSPM0L1227

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1607736/mspm0l1227-how-to-set-flash-memory-static-write-protection-swp

器件型号: MSPM0L1227
主题中讨论的其他器件: SysConfigLP-MSPM0L2228

您好、

我的客户对闪存存储器栈写保护 (SWP) 的规范有疑问。

 

根据 TRM、第一个 32K 字节似乎可以由一个扇区设置为 SWP、而另一个可以由八个扇区设置。

他们希望使用该函数仅针对 CCS 中 SysConfig 上闪存的某些扇区禁用 SWP、并启用其他区域、以便即使在写入 ROM 后、也能在 SWP 禁用区域中进行内部重写。

但是、此操作无法写入 SWP 禁用区域、并且该操作未按预期工作。

如果此功能的识别或使用有误、请告知他们。

 

删除了 TRM 中 SWP 寄存器的说明中的内容

SWPMAINLOW.jpg

  

SWPMAINHIGH.jpg

 

SysConfig 屏幕

SysConfig>软件>配置 NVM>SWP 配置 CCS

SWP.jpg

它们将扇区 0 设置为 3:第一个 32K 字节中的 bit[3:0]设置为“1"(“(禁用(禁用保护)、扇区 4 设置为 31:bit[31:4]设置为“0"(“(启用(启用保护)。

 

谢谢。此致、

英明

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

    Hi Hideaki、

    他们将扇区 0 设置为 3:第一个 32K 字节中的 bit[3:0]设置为“1"(“(禁用(禁用保护)、扇区 4 设置为 31:bit[31:4]设置为“0"(“(启用(启用保护)。

    这对我来说很好。 因此、客户根据此设置发现了什么?  

    闪存加载程序或应用程序代码无法再写入或擦除 5KB-32KB 地址。

    请注意、NONMAIN 设置需要 MCU 复位或重新加电才能生效。

    另一个猜测是他们是否成功地将 NONMAIN 下载到器件?

    B.R.

    Sal

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

    尊敬的 Sal:

    不好感谢你的评分

    [引述 userid=“522967" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1607736/mspm0l1227-how-to-set-flash-memory-static-write-protection-swp/6195386

    请注意、NONMAIN 设置需要 MCU 复位或重新加电才能生效。

    另一个猜测是他们是否成功地将 NONMAIN 下载到器件?

    [/报价]

     

    他们使用 LP-MSPM0L2228 上的板载仿真器将固件写入板上的 MSPM0L1227 器件。

    当时、它被写入 NONMAIN 并正确完成、并且可以正常工作、因此他们认为上面的两个选项没有问题。

      

    他们想要做的是写入/记录到尚未设置为 SWP 的闪存区域、以计算将固件写入器件后的引导次数。 但是、它失败了。

    程序区域启用 SWP、可重写自由区域禁用 SWP。

    如果程序有任何问题、请告知他们。

    或者、如果您能告诉他们 SWP 的用例错误、将其用于哪些函数、将不胜感激。

     

    谢谢。此致、

    英明

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

    Hideaki、

    也有 NONMAIN 用户指南: MSPM0 NONMAIN 闪存配置指南文档

    他们要做的是对尚未设置为 SWP 的闪存区域进行写入/记录、以便计算将固件写入器件后的启动次数。 但是、它失败了。

    根据配置、可以写入 0-4KB。 他们发现了什么问题、代码或故障 现象的任何屏幕截图?

    对于闪存操作、请遵循 SDK 示例:

    dev.ti.com/.../node

    B.R.

    Sal

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

    尊敬的 Sal:

    感谢您的答复、但请允许我确认。 你为什么要提到 NONMAIN 闪存?

    遗憾的是、它们无法获得屏幕截图、因为 MSPM0L1227 独立运行并且调试被禁用。

    谢谢。此致、

    英明

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

    尊敬的 Sal:

    客户能够确认 SWP 工作正常。

    他们发现不同之处在于调试安全配置文件的设置。

    当他们将调试安全配置文件设置为“安全级别 2“以禁用调试端口时、SWP 无法正常工作、如上所述。

     

    如果同时设置多个安全功能、是否可能会产生不良影响?

    他们希望设置为“安全级别 2“。 有可能吗? 他们如何解决这个问题?

    谢谢。此致、

    英明  

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

    Hi Hideaki、

    我认为这不应该起作用。

    虽然我以前没有测试过它。 我来对此配置进行一些实验、然后继续给您解答。

    B.R.

    Sal

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

    Hi Hideaki、

    使用 L2228 进行测试后、安全级别 2 不会影响 SWP 功能。

    SysConfig 设置:

    它可以在 NONMAIN (NVM) 的 SWP 中保护 4-8KB 闪存范围。

    测试代码:

    #include "ti_msp_dl_config.h"
    /* Base address of test main memory */
    #define NONMAIN_BASE_ADDRESS                                      (0x00001000U) //4-5KB
    
    __attribute__((used, persistent, location(0x1000))) unsigned int dataFlash_1 = 0x12345678;
    __attribute__((used, persistent, location(0x1004))) unsigned int dataFlash_2 = 0x9ABCDEF0;
    
    int main(void)
    {
        volatile DL_FLASHCTL_COMMAND_STATUS gFlashStatus;
        volatile uint32_t gFlashData;
    
        SYSCFG_DL_init();
    
        delay_cycles(32000000*5);   // delay 5s
    
        /* Clear STATCMD register, unprotect MAIN, and then erase MAIN memory */
        DL_FlashCTL_executeClearStatus(FLASHCTL);
        DL_FlashCTL_unprotectSector(
            FLASHCTL, NONMAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN);
        gFlashStatus = DL_FlashCTL_eraseMemoryFromRAM(
            FLASHCTL, NONMAIN_BASE_ADDRESS, DL_FLASHCTL_COMMAND_SIZE_SECTOR);
    
        if(gFlashStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED) {
            delay_cycles(8000000);
            DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
            delay_cycles(8000000);
            DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
            delay_cycles(8000000);
            DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
            /* Lighting LED with 0.25s */
        }
    
        gFlashData = *(uint32_t*)(0x1000);
    
        if(gFlashData == 0x12345678) {
            while(1){
                delay_cycles(16000000);
                DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
            }
        }
    
        while (1) {
            delay_cycles(32000000);
            DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
        }
    }

    测试结果:

    B、R、

    Sal