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.

[参考译文] LP-MSPM0G3507:当您在产品样片中引用闪存地址时、它成为 DEFAULT_Handler

Guru**** 2482225 points
Other Parts Discussed in Thread: MSPM0G3507

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1243094/lp-mspm0g3507-when-you-refer-to-the-flash-address-in-product-sample-it-becomes-default_handler

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

您好!
我正在使用产品样片、但使用 default_handler 时遇到问题。
情况如下。
-使用示例项目"flashctl_multiple_size_read_verify_LP_MSPM0G3507_nortos_ticlang"
-根据示例代码的值在 MAIN_BASE_ADDRESS 之后写入。
-由于 MAIN_BASE_ADDRESS 中注册的值会写入您自己的无符号字符类型的变量、因此当您引用 MAIN_BASE_ADDRESS 时、该值会变为 Default_handler。

使用早期样品时不会出现此问题。
是否存在控制问题?
请确认。

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

    您好!

    您是否为应用使用高32KB 地址?

    下面是一个可能会为您提供帮助的主题: https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1242097/lp-mspm0g3507-flash-operation-does-not-succeed-when-using-product-sample 

    B.R.

    萨尔

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

    感谢您的答复。

    否。  您正在尝试引用0x00001000。
    以下代码。

    unsigned char Test;
    unsigned char * pTest;
    pTest = MAIN_BASE_ADDRESS;  // #define MAIN_BASE_ADDRESS (0x00001000)
    Test = *pTest;
    /* If successful, toggle LED */
    while (1) {
        if(Test == 0x01)
        {
            DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
        }
            delay_cycles(16000000);
    }


    请确认。

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

    您好!

    我认为您尝试 为指针分配地址的方式是不正确的。

    请尝试以下陈述:

    ptest =(unsigned char *) main_base_address;//如果您在  main_base_address 中分配 char 变量。

    B.R.

    萨尔

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

    感谢您的答复。

    我尝试了你给我的语句、但最终它也是 default_handler。

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

    您好!

    很抱歉这么晚才回复。

    由于闪存区域中的数据没有属性、因此应将其与(void *)  MAIN_BASE_ADDRESS 对齐。

    请尝试并欢迎您提供反馈。

    B.R.

    萨尔

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

    感谢您的答复。

    无法解决。
    我检查过、但我能够在 ptest 中存储 MAIN_BASE_ADDRESS。
    之后、"Test =* ptest;"设置为 Default_handler。
    我尝试了各种陈述、但没有改善。

    ○确认结果
    -"ptest =(void *) main_base_address;"可以执行。
    -通过执行"Test =* ptest;"转换到 Default_handler。
    -当我检查它时、它在"flashctl_multiple_size_read_verify_lp_MSPM0G3507_nortos_ticlang"的第164行成为 Default_handler *。
    *在启用 ECC 并由闪存控制器硬件生成的情况下、向 MAIN 存储器中的闪存写入64位写入操作
    ・使用"flashctl_dynamic_memory_protection_lp_MSPM0G3507_nortos_ticlang"正在进行确认。
    -在"flashctl_dynamic_memory_protection_lp_MSPM0G3507_nortos_ticlang"的第125行插入以下代码。

    unsigned char Test = 0;
    unsigned char *pTest;
    pTest = (void *)MAIN_BASE_ADDRESS;  // #define MAIN_BASE_ADDRESS (0x00001000)
    Test = *pTest;     // Test = (unsigned char)(*pTest);
    /* If successful, toggle LED */
    while (1) {
        if(Test == 0x01)
        {
            DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
        }
        delay_cycles(16000000);
    }

    -同样、"Test =* ptest"变为 Default_handler。
    ・将优化从2更改为0
    当使用观察表达式确认 ptest 时,ptest 成为预期值。

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

    您好  

    是的、我已经尝试了您的语句、然后它发生了 NMI 中断。 我忘记了您之前修改过闪存区域。

    发生这种情况的原因是、当您读取闪存区域中存储的数据时、ECC 代码读取错误。

    权变措施为:

    第117行:  

    gCmdStatus = DL_FlashCTL_programMemoryFromRAM32 (FLASHCTL、MAIN_BASE_ADDRESS、&gData32);

    -> gCmdStatus = DL_FlashCTL_programMemoryFromRAM32WithECGenerated (FLASHCTL、MAIN_BASE_ADDRESS、&gData32);

    那么您会发现它正常工作、没有错误。

    B.R.

    萨尔

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

    感谢您的确认。

    我还在我的环境中进行了检查、并且能够确认已执行 Test =* ptest;。
    感谢您的支持。
    但我还有问题。
    >发生这种情况的原因是当您读取闪存区域中存储的数据时 ECC 代码读取错误。
    我知道 Test =* ptest;正在读取 ECC 代码。
    之所以创建此代码、是因为读取该代码时不进行 ECC 校验。
    是否有针对 Test =* ptest;的改进计划?

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

    您好!

    如果您想要在没有 ECC 的情况下读取、则应使用以下方法:从未更正的地址空间中读取数据。  

    TRM 第 6章- NVM (闪存)中对其进行了介绍。

    例如: ptest =(void *)(MAIN_BASE_ADDRESS + 0x00400000); //#define MAIN_BASE_ADDRESS (0x00001000)

    B.R.

    萨尔

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

    感谢您的支持。
    它运行没有任何问题。
    我们还确认了6.2.3寻址中提到的内容。  很抱歉、我无法确认。

    现在、我们可以进行确认。  非常有帮助。