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.

[参考译文] tms320f28023:当 Flash_Eras()中断时,存储在闪存中的设置变为全零。 为什么?

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/600760/tms320f28023-when-flash_erase-interrupted-settings-stored-in-flash-become-all-zeros-why

器件型号:TMS320F28023

您好!

首先,我知道中断 Flash_Eras()函数可能会导致一些错误。 我只是想详细了解在我的特定情况下发生的情况。 总之、当闪存擦除被中断时、闪存中的所有寄存器返回一个0值、这将使人认为它可能与 CSM 密码的损坏有关。 因为、为什么全为零? 为什么不损坏随机值? 但是、系统行为的某一方面与这种解释不符。 详细信息如下:

在 Flash_Erase 期间、系统断电。 复位时、固件中使用的所有存储设置返回0值。 此外、使用 IQmath 库的 IQ 函数计算的变量返回零。 因此、在引导 ROM 中运行的引导加载程序期间、肯定会出现问题。

奇怪的是、一旦我们跳转到闪存、进入扇区 B 和 C 中的 MAIN_APP 并尝试写入闪存、该过程就会成功执行。 如果 CSM 密码损坏、这是怎么可能的? 第一个想法是写入是从安全存储器内部完成的。 但是、也可以从主应用程序读取扇区 D 中存储的设置!!! 那么、为什么写入有效、而不是读取有效?

那么、这里会发生什么情况?

Flash_Erase 损坏-当复位寄存器返回0值时-写入被启用。

提前感谢您!

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

    SusSousa、

    为什么在器件受 CSM 保护时读取所有零?
    在 CSM 受保护的器件上、如果不解锁器件、则无法访问闪存的内容。
    当器件被锁定时、CSM 阻止 JTAG 读取并显示0x0000s。 这就是它的设计方式。

    为什么在引导至闪存时能够写入闪存?
    在受 CSM 保护的器件上、您可以从安全 RAM 成功执行闪存 API 算法、但不能从不安全的存储器成功执行。 我相信您的应用代码具有内置的闪存 API 库、并可从安全 RAM 执行。

    此致。
    <Manoj

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Manoj、
    非常感谢您的回复! 但恐怕我自己解释得不好。

    我知道、如果 CSM 密码未正确解锁、那么我们在尝试读取闪存安全存储器时将获得零。 这就是我认为我的系统发生的情况。 但是、我意识到写入仍在工作、我认为它仍然在工作、因为我是从安全存储器内部执行的。 因此、即使密码损坏、我仍可以从安全存储器中写入。 之后、我意识到我也在从安全存储器读取寄存器! 那么、我怎么不能从安全存储器中读取寄存器(获取零)、但我最终可以在这些寄存器上写入新值呢?

    这里有2个可能性:a)在读取之后和写入之前执行了一个闪存擦除(我没有找到、所以不太可能)、b)对于与 CSM 无关的零值有一个不同的解释。

    我发现 Flash_Erase ()有4个阶段:1) pre-compact 2) clear (将所有地址设置为零3) Erase (将所有位设置为一) 4) Compact。
    那么我是否可以在其清除状态中中断 Flash_Eras()? 这就是为什么我得到全零?

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

    我不确定您是在安全(还是)不安全状态下读取闪存。

    • 您能否确认0x3F7FF8 - 0x3F7FFFF 的内容?
    • CSMSCR (地址:0xAEF)的值是什么?
    • 您是否试图理解为什么在某些扇区中看到0x0000s、即使 CSMSCR.bit0 = 0 (器件处于不安全状态)

    此致、

    曼诺伊

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

    •  0x3F7FF8 - 0X3F7FFF 的内容:所有 FFs。
    • CSMSCR 的值:0X0070
    • 是的。 这是对我要做的事情的一个很好的简短的解释。

      我们的一些产品显示了这种行为。 所有寄存器都变为零、这可能是由于 Flash_Eras()函数期间断电。 起初我以为 CSM 密码已损坏、但现在还不确定了。 如您所见、当调试器件时、所有寄存器都已设置为零、它们看起来不会损坏。

      那么、还有什么可以解释的呢? 这些零是否可以来自擦除的"清除"阶段?

      再次感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当闪存擦除函数被执行时、闪存 API 按顺序调用以下算法:-

    •闪存压缩算法–这可确保没有闪存位单元处于过擦除(或)耗尽状态
    •闪存清除算法 –这将对用0x0000s 选择的闪存扇区进行编程、以预调节闪存扇区
    •闪存擦除算法 –这将擦除所选的闪存扇区
    •闪存压缩算法–这可确保没有闪存位单元处于过擦除(或)耗尽状态

    作为 Flash_Erase 函数的一部分、还会执行闪存清除算法以预调节闪存。 如果在闪存清除算法的中间对器件进行功率循环、您可能会观察到您看到的内容。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我认为这是发生的情况。 非常感谢 Manoj 的帮助!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴为您提供帮助。 我要关闭此 TT。