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.

[参考译文] RM48L952:对未启动的闪存进行 CRC 校验会导致 ESM 故障

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/683235/rm48l952-crc-checking-of-uninitiated-flash-causes-esm-faults

器件型号:RM48L952
主题中讨论的其他器件:HALCOGEN

您好!

我正在尝试使用 CRC 和 DMA 模块对闪存内容、特别是程序存储位置进行错误检查。 我正在使用半自动 CPU 模式、在该模式下、我手动启动从闪存存储器到 CRC 寄存器的 DMA 块数据传输。 这将按预期工作、直到允许 DMA 检查超过编程空间末尾的闪存地址。 此时、正如预期的那样、DMA 在 ESM 中设置不精确错误标志、这是因为它读取了一个带有不正确(未启动) ECC 值的闪存值。 在某些情况下、我还在 ESM 中得到一个 FMC 不可纠正的错误。

一种简单的解决方案是在短于编程空间或恰好在编程空间的末尾停止 DMA 读取。 这是开发代码时的一个问题、因为编程闪存的末尾总是随每次编辑而变化。 此外、尝试选择一个元素和帧计数以匹配该精确地址也是一个问题。

简单的解决方案似乎是使用一个也会设置 ECC 值的默认值来填充闪存组的其余部分。 到目前为止,我还没有找到办法来做到这一点。  

我觉得我在这里缺少一些非常简单的东西。 提供的示例显示了自动使用 DMA 和 CRC 来检查闪存存储器是否存在错误、但没有提及此问题。 除非 DMA 在最后一个编程的闪存值停止、否则将发生上述错误。 我缺少什么?

谢谢、

  艾伦

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

    您可以使用链接器使用链接器命令文件中的新语法来生成 ECC。 命令文件将为器件存储器映射中的 ECC 指定单独的存储器范围。

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

    谢谢、这会为未使用的闪存生成 ECC、从而防止 ESM 错误。

    为了使其正常工作、必须修改 HALCoGen 中的 sys_link.cmd 文件以接受链接器生成的 ECC。 剩余的问题是、每次运行 HALCoGen 生成代码时、它都会将存储器重新定义回默认值。 更新后的 ECC 生成存储器定义可以添加到用户代码部分、但主存储器定义不在用户代码部分。

    以下是 sys_link.com 文件的一部分:

    存储器

    //向量(X):origin=0x00000000 length=0x00000020
    // FLASH0 (RX):origin=0x00000020 length=0x0017FFE0
    // FLASH1 (RX):origin=0x00180000 length=0x00180000
    //堆栈(RW):origin=0x08000000 length=0x00001500
    // RAM (RW):origin=0x08001500 length=0x0003eb00

    /*用户代码开始(2)*/
    /*闪存*/
    /*组0 (1.5MB)*/
    向量(X):origin=0x00000000
    length=0x00000020
    fill=0xffffffff
    FLASH0 (RX):origin=(end (VEC...

    我注释了 HALCoGen 存储器定义、但在 HALCoGen 重新生成时、它们会被取消注释。 这会导致链接器出错、因为"已指定存储器范围"。 以下是 HALCoGen 在重新生成后对 sys_link.cfg 文件执行的操作:

    存储器

    引导程序(X):origin=0x00000000 length=0x00000020
    FLASH0 (RX):origin=0x00000020 length=0x0017FFE0
    FLASH1 (RX):origin=0x00180000 length=0x00180000
    堆栈(RW):origin=0x08000000 length=0x00001500
    RAM (RW):origin=0x08001500 length=0x0003eb00

    /*用户代码开始(2)*/
    /*闪存*/
    /*组0 (1.5MB)*/
    向量(X):origin=0x00000000
    length=0x00000020
    fill=0xffffffff
    FLASH0 (RX):origin=(end (VECT

    是否有方法禁用 HALCoGen 生成的存储器定义?

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

    我能够回答我自己关于 HALCoGen 问题的问题。 我在下面为可能正在阅读此问题的其他人提供了我的解决方案。

    要禁用 HALCoGen 生成的内存定义,请在内存映射正上方的/*用户代码 begin (1)*/部分底部添加"#if 0"。 此外,在内存映射正下方的/*用户代码 begin (2)*/部分顶部添加"#endif"。 这允许 HALCOGen 调整存储器段、但链接器会忽略该段。 以下是适用于我的问题的代码:

    /*用户代码开始(1)*/
    # if 0//添加以禁用下面 HALCoGen 生成的存储器部分
    /*用户代码结束*/

    /*------------------ *
    /*内存映射 *

    存储器

    引导程序(X):origin=0x00000000 length=0x00000020
    FLASH0 (RX):origin=0x00000020 length=0x0017FFE0
    FLASH1 (RX):origin=0x00180000 length=0x00180000
    堆栈(RW):origin=0x08000000 length=0x00001500
    RAM (RW):origin=0x08001500 length=0x0003eb00

    /*用户代码开始(2)*/
    # endif //添加以禁用 HALCoGen 生成的存储器部分
    //下面的存储器部分用于代替链接器生成的 HALCoGen 存储器映射
    存储器

    /*闪存*/
    /*组0 (1.5MB)*/
    向量(X):origin=0x00000000
    length=0x00000020
    fill=0xffffffff
    FLASH0 (RX):origin=(end (VECT.....

    感谢你的帮助。 我将重新启动并再次运行。
    艾伦