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.

[参考译文] MSPM0G1506:在将数据写入内部闪存 ROM 时、如果数据设置为全局变量、则会发生硬故障中断。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1401857/mspm0g1506-when-writing-data-to-the-internal-flash-rom-if-the-data-is-set-as-a-global-variable-a-hardfault-interrupt-occurs

器件型号:MSPM0G1506
主题中讨论的其他器件:MSPM0G3507

工具与软件:

你好。 我叫 Mori、

我正在检查内部闪存 ROM 的写入、在"DL_FlashCTL_programMemoryFromRAM64WithECCGenerated"处发生硬故障中断。

但是、如果第三个参数的写入数据的存储目标设置为全局变量、
发生 HardFault 中断、但如果我将其设置为局部变量、
否则会发生、并且我能够写入数据。
为什么会发生这种情况?
我已经附上了源代码和执行结果。
请检查。

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

    您好!

    您的图片不清晰、能否上传新图片?

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

    你(们)好

    我已粘贴文本作为源代码。
    我已将图像粘贴为执行结果。
    请检查它。

    【源码】

    #if _debug_flash_WT
    static errlog_t stDmyLog;//←全局变量
    #endif
    #if development_msp430_to_MSPM0
    __attribute__((optnone))
    int main (void)
    #else
    void main (void)
    #endif

    #if development_msp430_to_MSPM0
    uchar bSysRequest;
    uchar bTskRequest;
    uchar bCnt;


    #if _debug_flash_WT
    errlog_t atDmyLog;//←局部变量
    uint32_t qDistAddr = 0x00000800;
    uint32_t qSize = sizeof (errlog_t);

    uint32_t qWrCnt;
    uint32_t qWrtAdr;
    uint32_t qSctAdr;
    Volatile DL_FLASHCTL_COMMAND_STATUS stsCmdStatus;
    uint32_t * pqSrc;

    barray_fill ((uchar*)&atDmyLog、0xAA、(uchar)sizeof (errlog_t));
    pqSrc =(uint32_t*)&atDmyLog;//将数据写入局部变量时←μ s

    barray_fill ((uchar*)&stDmyLog、0xAA、(uchar) sizeof (errlog_t));
    pqSrc =(uint32_t*)&stDmyLog;//将数据写入全局变量时←μ s

    //擦除
    qSctAdr = 0x00000800;
    CPUSS->CTL &=~CPUSS_CTL_ICACHE_ENABLE;
    DL_FlashCTL_unprotectSector (FLASHCTL、qSctAdr、DL_FLASHCTL_REGION_SELECT_MAIN);
    stsCmdStatus = DL_FlashCTL_eraseMemoryFromRAM (FLASHCTL、qSctAdr、DL_FLASHCTL_COMMAND_SIZE_SECTOR);
    如果(stsCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED)

    ;;;;
    }
    DL_FlashCTL_waitForCmdDone (FLASHCTL);
    CPUSS->CTL |= CPUSS_CTL_ICACHE_ENABLE;

    //编程
    CPUSS->CTL &=~CPUSS_CTL_ICACHE_ENABLE;
    for (qWrtCnt =0;qWrtCnt < qSize;qWrtCnt+=8)

    qWrtAdr = qDistAddr + qWrtCnt;
    DL_FlashCTL_unprotectSector (FLASHCTL、qSctAdr、DL_FLASHCTL_REGION_SELECT_MAIN);
    stsCmdStatus = DL_FlashCTL_programMemoryFromRAM64WithECCGenerated (FLASHCTL、qWrtAdr、(uint32_t*) pqSrc);//对写入数据进行寻址(pqSrc)
    如果(stsCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED)

    ;;;;
    }
    PqSrc +=2;
    }
    CPUSS->CTL |= CPUSS_CTL_ICACHE_ENABLE;
    while (1);
    #endif

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

    您好!

    感谢您提供详细信息。

    这似乎很有趣,我将在明天从我身边进行测试,并尽快给你的反馈。

    此致、

    Zoey

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

    您好!

    我已经从我这边验证过。 全局变量和函数内部变量都可支持写入 闪存。

    #include "ti_msp_dl_config.h"
    
    /* Address in main memory to write to */
    #define MAIN_BASE_ADDRESS (0x00000800)
    
    
    
    /* 32-bit data to write to flash */
    //uint32_t gData32 = 0x33333333;
    volatile DL_FLASHCTL_COMMAND_STATUS gCmdStatus;
    
    
    int main(void)
    {
        SYSCFG_DL_init();
        uint32_t gData32 = 0x33333333;
        uint32_t *pqSrc;
    
        pqSrc = (uint32_t*)&gData32;
    
        /* Unprotect sector in main memory with ECC generated by hardware */
        DL_FlashCTL_unprotectSector(
            FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN);
        /* Erase sector in main memory */
        gCmdStatus = DL_FlashCTL_eraseMemoryFromRAM(
            FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_COMMAND_SIZE_SECTOR);
    
        DL_FlashCTL_unprotectSector(FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN);
        gCmdStatus = DL_FlashCTL_programMemoryFromRAM32WithECCGenerated(FLASHCTL, (MAIN_BASE_ADDRESS), (uint32_t*)pqSrc);
        while(1);
    
    }

    您能根据我的演示代码再次核对一下吗

    此致、

    Zoey

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

    您也可以上传该项目的简化版本、以便帮助您快速进行调试。

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

    你(们)好

    感谢您的答复。
    我检查的微控制器型号为"MSPM0G3506T"。
    我很抱歉。
    很抱歉给您带来麻烦、但您也可以在此处查看吗?

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

    您好!

    这是相同的、我的测试 MCU 编号是 MSPM0G3507。

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

    你(们)好

    我很抱歉。 我被告知这个问题不会发生在那里,所以我在这里再次调查它。
    目前、优化设置为"-z"、
    但我发现如果我将其设置为"-0"、则不会发生硬故障。
    我试着将 volatile 修饰符添加到用于存储写入数据的全局变量中、
    但发生了硬错误。
    创建具有优化"-z"的源代码时、
    您能否告诉我、是否有任何我应该小心的事情、或者您是否知道问题的原因?

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

    您好!

    这似乎很奇怪,但我不能再现你的现象从我身边。

    您能否提供一个可以重现此情况的简化代码?

    此致、

    Zoey