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-MSPM0L2228:xPSR 寄存器变量"10d"=保留

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved

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

工具与软件:

大家好!

运行、则会发生以下意外行为。

当向闪存写入一个值并再次读取它时、在读取时会发生意外中断。 中断是否发生也取决于该值。 根据 xPSR 寄存器、它应该是异常10


很遗憾、例外10在参考手册中没有详细描述、并且被签名为"保留"。

您能为我提供指导吗? 提前感谢

Jens

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

    Jens、您好!

    您可以检查触发了哪个中断、NMI、硬故障或其他东西。

    您可以在程序中声明这些中断、并设置 while1循环以查看程序将停留在哪个中断中。

    B.R.
    SAL

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

    由于显示屏是6位数、我猜它实际上是二进制(6位)、即=2 (NMI)。

    [编辑:更正了拼写错误]

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

    Jens、您好!

    是的、Bruce 回答正确。 似乎是 NMI 中断。

    我想您触发了闪存 ECC 错误、这是为了解决 NMI 中断。 您可以仔细检查 NMI 中断源的寄存器。

    B.R.
    SAL

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

    嗨、Sal、嗨、Bruce、

    杨明在问我这个问题。
    我知道你是对的。 这就是带有检测到闪存双错(由 ECC 引起)原因的 NMI。
    我读出整个闪存、看起来好像没有生成 ECC。 我使用命令 DL_FlashCTL_programMemoryFromRAM64WithECCGenerated 写入闪存。 根据我正确理解 DL 文档、此命令应自动创建 ECC 字节。 但事实并非如此。 是否必须单独打开 ECC 生成? SysConfig 中的任何位置? 我找不到任何东西。

    如果生成了 ECC 字节、它将位于哪里? 由于参考手册指出、使用 ECC 时闪存字大小为64位和72位、因此我假设它直接位于写入的数据后面。
    例如
    数据-> 0x100 - 0x107
    ECC -> 0x108
    对吗?

    感谢您的支持
    Timo

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

    尊敬的 Timo:

    不是的、它具有单独的闪存地址。

    如果查看数据表中的存储器章节、可以在下面找到:

    它将具有单独的闪存地址来存储 ECC 代码。

    B.R.

    SAL

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

    尊敬的 Sal:


    由于闪存 ECC 代码的大小为1kB、因此可覆盖闪存中仅8kB 的区域。 对吧?

    我不需要 ECC、但我遇到了问题。 可以全局停用 ECC?

    我知道我可以读出偏移量为0x0040.0000的闪存。 但我喜欢使用原始地址从闪存读取、而不使用该偏移。
    我以为它可以停用,但我不知道怎么做。 可以帮帮我吗?

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

    我如何决定 ECC 应该涵盖闪存的一部分? 这对我来说或许是一个解决方案。 我有一个单独的链接器文件、但没有为 ECC 声明任何内容。
    另一方面、我在孔闪存上遇到了这个问题。 因此、闪存似乎通常被介绍完了、但无法在所有地方使用 ECC。

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

    尊敬的 Timo:

    由于闪存 ECC 代码的大小为1KB、因此可以只覆盖闪存中8kB 的区域。 对吗?

    是的、这也是我在看桌子时感到困惑的地方。 我想这可能是个拼写错误、或者有一些新特性我不知道。

    如果您查看我们的 MSPM0G 器件、会发现下面显示了合理区域:

    如果在这个主题上有任何进展、我可以在这里进行更新。 但我认为这不是你关心的关键问题。

    我不需要 ECC、但我遇到了问题。 可以全局禁用 ECC?[/QUOT]

    遗憾的是、 此选项启用默认设置、出于安全原因无法禁用。

    [报价 userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5300996 #5300996"]我知道我可以读出偏移量为0x0040.0000的闪存。 [报价]

    是的。  

    另一种方法是将闪存 API 函数与 ECC_Generated 一起使用、API 函数可以帮助用户使用数据自动设置正确的 ECC 位。

    B.R.

    SAL

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

    尊敬的 Sal:

    如果查看 MSP0G 器件的表、我会猜测这不是单独的存储器区域、而是更多的偏移量来读取此闪存区域的 ECC 值。 这又提出了一个问题、ECC 值存储在哪里。

    我已使用 ECC 命令 DL_FlashCTL_programMemoryFromRAM64WithECCGenerated。 我假设这将在后台组织所有必要的工作。 但是、无论如何、我遇到了这个问题。 我也尝试了没有 ECC 的版本,但没有改进。

    该 API 说明指出不应禁用 ECC 生成。 您说无法停用。 不过、我是否可以检查它是否配置正确? 顺便说一下、说明和库中也有一些拼写错误。

    最后一个问题、我是这样理解的、如果我在 ECC 中使用 API 函数、那么一切都应该按预期工作、应该没有问题出现。 但我的问题可能是什么? 写入没有问题、调试器可以读取该值。 仅当我在闪存中读取该值时、DED 中断才会上升。 这取决于我写入的值。 例如、0x55为正常状态、0xAA 表示 Error。 MSPM0L 器件是否存在问题? 我试了两个部分。

    非常感谢

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

    尊敬的 Timo:

    [quote userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5301390 #5301390(2002) ECC 值存储在哪里。

    我尚未在 M0Lx22x 器件中对其进行测试。 因此、我可能需要一些时间才能了解该器件是否有任何新功能、因为该器件具有可能导致推理的双闪存组。

    [报价 userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5301390 #5301390(2002)我已使用 ECC 命令 DL_FlashCTL_programMemoryFromRAM64WithECCGenerated。 [报价]

    是的、这应该不会有问题。 我可能会在下周用该器件进行试、它也会让我感到困惑。 顺便说一下、您能否在此处分享您的代码供我参考。

    [quote userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5301390 #5301390(2002) API 说明指出不应禁用 ECC 生成。

    是的、实际上、用户没有用于禁用此功能的接口。 至少在 MSPM0G 器件中不是。 我认为这两个器件的闪存 IP 是相同的、或者 TRM 中应该给出一些说明。  

    [quote userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5301390 #5301390(2002)顺便说一下、说明和库中也有一些拼写错误。

    希望这不会让你感到困惑。 我完全同意应该在未来发布版本中更正此拼写错误。

    [quote userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5301390 #5301390(2002)例如、0x55没问题、0xAA 显示错误。

    看起来您没有正确加载 ECC。  

    我知道、ECC 只能检测到双位错误、如果输入的错误位超过两位、则可以检测到错误、但无法检测到错误。 因此、您写入的变量与0xFF 有四位的差异、这是合理的。 您可以尝试一位差异、例如0xFE、0xFD、并检查是否始终发生 FLASHSED。

    B.R.

    SAL

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

    尊敬的 Sal:

    这是我的测试代码、我得到错误。 地址0x108由链接器擦除、不包含程序代码。 其他地址也会显示错误、但不是所有地址。  只有 dataWrite 的第一个字节很有趣。

    您是对的、如果我从1位到0xFF 有差异、它是有效的。 但0x55也具有4位的差异、并且也可以工作。 尽管如此、我同意我的 ECC 可能未正确设置、但为什么呢?

    int main (void)

       静态 const uint32_t 地址= 0x108;
       SYSCFG_DL_init ();
       DL_FLASHCTL_COMMAND_STATUS gCmdStatus;
       uint8_t *数据;
       uint8_t dataWrite[8]={0xAA、0x00、0xFF、0xFF、0xFF、 0xFF、0xFF、0xFF};

       数据=(uint8_t*)地址;
       printf ("ADR:0x%X data:0x%X\n"、address、* data);
       DL_FlashCTL_unprotectSector (FLASHCTL、ADDRESS、DL_FLASHCTL_REGION_SELECT_MAIN);
       gCmdStatus = DL_FlashCTL_programMemoryFromRAM64WithECCGenerated (FLASHCTL、address、(uint32_t*)&dataWrite);
       uint8_t test =* data;               //此行中会出现错误
       printf ("ADR:0x%X data->0x%X\n"、address、* data);

       while (1);

    }

    void NMI_Handler(){
       while (1);
    }

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

    好的、我发现链接器文件很重要。 我创建一个新项目 来演示我的问题。 是否有可能共享一个空洞项目?

    但现在、我在这里加载代码。 为 L2228创建了一个新的空示例、并在 syscfg 中停用链接器文件生成。

    我有一个数组在闪存中的指定位置(DATA[10])。 在这个数组中、我想写入。 仅当我写入定义的数组时才会发生错误。 但并非总是、地址0x20000有效、而在下一个地址0x20008处会在我这边发生错误。 写操作符合预期。

    我的方法有什么问题吗?


    main.c ->

    #include "ti_msp_dl_config.h"
    #include <stdint.h>
    #include <stdio.h>
    
    static const volatile uint8_t data[10] __attribute__((used, section(".my_data")))= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
    
    int main(void)
    {
        static uint32_t address = 0x20000;
        SYSCFG_DL_init();
        DL_FLASHCTL_COMMAND_STATUS gCmdStatus ;
        uint8_t *data;
        uint8_t dataWrite[8] = {0xAA, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
    
        while(1){
            data = (uint8_t*)address;
            printf("adr:0x%X data:0x%X\n",address, *data);
            DL_FlashCTL_unprotectSector(FLASHCTL, address, DL_FLASHCTL_REGION_SELECT_MAIN);
            gCmdStatus = DL_FlashCTL_programMemoryFromRAM64WithECCGenerated(FLASHCTL, address, (uint32_t*) &dataWrite);
            uint8_t test = *data;                // in this line the error occurs
            printf("adr:0x%X data->0x%X\n",address, *data);
            address += 0x08;
        }
    
        while(1);
    }
    
    void NMI_Handler(){
        while(1);
    }


    device_lincer.cmd ->

    -uinterruptVectors
    --stack_size=256
    
    MEMORY
    {
        FLASH           (RX)  : origin = 0x00000000, length = 0x00020000
        DATA	        (RX)  : origin = 0x00020000, length = 0x00020000
        SRAM            (RWX) : origin = 0x20200000, length = 0x00008000
        BCR_CONFIG      (R)   : origin = 0x41C00000, length = 0x000000FF
        BSL_CONFIG      (R)   : origin = 0x41C00100, length = 0x00000080
    }
    
    SECTIONS
    {
        .intvecs:   > 0x00000000
        .text   : palign(8) {} > FLASH
        .const  : palign(8) {} > FLASH
        .cinit  : palign(8) {} > FLASH
        .pinit  : palign(8) {} > FLASH
        .rodata : palign(8) {} > FLASH
        .ARM.exidx    : palign(8) {} > FLASH
        .init_array   : palign(8) {} > FLASH
        .binit        : palign(8) {} > FLASH
        .TI.ramfunc   : load = FLASH, palign(8), run=SRAM, table(BINIT)
    
    	.my_data	: palign(8) {} > DATA fill = 0xFFFFFFFF
    
        .vtable :   > SRAM
        .args   :   > SRAM
        .data   :   > SRAM
        .bss    :   > SRAM
        .sysmem :   > SRAM
        .stack  :   > SRAM (HIGH)
    
        .BCRConfig  : {} > BCR_CONFIG
        .BSLConfig  : {} > BSL_CONFIG
    }

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

    更多信息。

    我尝试了与上述 MSPM0G3507相同的代码、由于闪存更小、略有修改。 阵列从0x10000开始。 这里没有错误或意外中断。 我还将阵列增加到1000以测试更大的区域。 仍然按预期工作。

    这就迫使人们不禁要问 MSPM0L 有什么问题?

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

    尊敬的 Timo:

    是的、您可以将其打包到.zip 文件中并直接在此处上传。

    明天我将花一些时间 、使用 MSPM0L2228 LaunchPad 来解决该问题。

    B.R.

    SAL

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

    我的两个测试项目:

    e2e.ti.com/.../MSPM0_2D00_FlashTest.zip

    MSPM0L2228的控制台输出:

    谢谢、Sal。

    我很好奇、您是否同样拥有中断以及您能找到什么。

    我很高兴明天收到您的来信

    B.R. Timo.

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

    尊敬的 Timo:

    很抱歉耽误你的时间、今天比较忙。 我希望这个问题对您的申请来说不那么紧迫。

    我计划在    本周结束前进行一些分析并更新进展情况。 感谢您的耐心。

    如果您想更新任何信息、也请告知我。

    B.R.

    SAL

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

    尊敬的 Sal:

    老实说、这有点紧急。 我们喜欢在新项目中使用此芯片、以及器件中是否存在对我们来说将是大问题的错误。 但愿不是如此。 希望我出错了、大家可以快速找到解决方案。 那会更好。

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

    尊敬的 Timo:

    我很快就用您之前分享的文件进行测试。

     事实证明、以下代码将导致发生异常情况:

    我在 line37. 它可以正常工作、而不会有任何问题。

    尽管您将0xFF 分配给地址0x20000、它也会将值为0xFF 的 ECC 代码更改为0xFF。 因此、如果不进行擦除操作、就无法对地址进行编程。 为了验证、我还尝试以下代码:

    它可以正常工作。

    尽管我还不知道 ECC 代码存储在哪里、但我认为您可以在开发应用代码时不会出现 FLASHDED 问题。

    如果您 对此有任何进一步的问题、请告诉我。

    所以、  

    B.R.

    SAL

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

    尊敬的 Sal:

    感谢您的测试。

    我想、如果闪存位于0xFF 上、可以写入其他值。 这也适用于写入、值位于闪存中。 但 ECC 似乎是个问题。 我可能同意、由于 ECC、我必须在写入前进行擦除。

    但是、让我真正感到奇怪的是、它在 MSPM0G 上不使用擦除即可工作。 API 和 TRM 接缝相同。
    你能解释一下吗?

    我再次提问的原因是 MSPM0G 的行为符合我的预期。 我的算法就是基于这种设计的。 那么、我感兴趣的是这些器件之间的差异。 我知道 MSPM0L 具有两个存储器组、但这并没有解释不同的行为。

    B.R.
    Timo

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

    尊敬的 Timo:

    我不使用 G3507测试您的代码、因为代码看起来稍有不同、因此请进一步分析 它的低级别逻辑。

    以下代码与我在 G3507中进行测试的代码相同、NMI 始终触发。

    这是预期行为。

    如果您在固件加载后检查 ECC 代码而不开始闪存写入、则可能会发现 ECC 代码已更改。 以下是 G3507数据、L2228应该具有相同的功能。

    触发 NMI 后:

    我认为、如果闪存打开0xFF、则可以写入其他值。

    是的、您可以。 但您忽略了 ECC 代码。 它也是一个闪存区域。  这意味着您不能将"0"写入"1"。 这会发生错误。

    我想您应该了解以下内容:

    将0xFF 写入闪存也将更改 ECC 代码。 默认 ECC 代码是0xFF、这意味着 相应的闪存是空白、而不是0xFF。

    B.R.

    SAL

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

    尊敬的 Sal:

    再次感谢您的解释。 我想我现在明白了。

    在 MSPM0G 上、我可以写入多次、但没有得到中断。 看一下我的屏幕截图。 在这里、我在同一地址从0xFF 开始向下写入。 几次写入后、ECC 代码为0。 我可以将此代码运行至0x00。 而不产生任何中断。 在控制台中、您可以看到循环运行多次。
    我将使用 LP-MSPM0G3507的早期样片、并且我认为 ECC 函数已禁用。 否则,我无法解释这一点。 你怎么看?

    我当时想 MSPM0G 的行为是正确的、但显然不正确。 这正是让我走错路的原因。
    我订购新的 LaunchPad、然后重试。

    感谢调查,这是有点困难:)

    唯一有待解决的问题是、ECC 值存储在 MSPM0L 中的位置? 这是完全清楚所缺少的。 如果您有任何问题、请告诉我。

    非常感谢
    Timo

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

    尊敬的 Timo:

    您怎么看?

    您可以在此处分享您的 LP 的图片、我可以进一步帮助您进行检查。

    实际上、预采样 LP 无法使用最新的 SDK、当您将程序加载到器件中时将报告一些警告。

    唯一未决问题是、ECC 值存储在 MSPM0L 上的位置? 这是完全清楚所缺少的。 如果您发现任何问题、请告诉我。

    是的、我已经与其他团队专家进行了讨论、如果有任何进展、我将在此处进行更新。

    B.R.

    SAL

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

    尊敬的 Sal:

    当然可以

    是的、我收到了该警告。
    但我不知道、它可能有这个效果。

    B.R.
    Timo

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

    尊敬的 Timo:

    明白了。 请使用 RTM 样片进行进一步测试、我想可以正常工作。

    至于 MSPM0L2228 ECC 代码存储闪存区域、我 认为这不会阻碍您的持续开发。 由于仅提供了接口供用户查看、因此在写入时、它与闪存地址同时写入。

    总之、 我会在有进展时进行更新。 感谢您的耐心。

    B.R.

    SAL