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.

[参考译文] TMS320F28377D:闪存 API F021在安全模式下失败

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/680324/tms320f28377d-flash-api-f021-fails-in-secure-mode

器件型号:TMS320F28377D

您好、Vamsi 和 Vivek

 

我尝试修改 F28377D 的闪存编程示例 CPU1、以使用安全的闪存和 RAM 运行。

 

我从控制套件 V170示例(\f2837xd\v170\F2837xD_Examples_Dual\flash_programming\cpu01)开始。 我添加了

 

DcsmCommonRegs.FLSEM.ALL = 0xA501;

 

在 InitFlash()的开头,按照(https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/660432?tisearch=e2e-sitesearch&keymatch=Flash%20API%20F021%20CSMhttps://e2e.ti.com/support/microcontrollers/c2000/f/171/t/642405?tisearch=e2e-sitesearch&keymatch=Flash%20API%20F021%20CSM)中的建议抓取闪存信标。

 

此外、我在示例末尾取消了闪存擦除部分的注释、以便能够检查闪存操作是否成功。 该示例在闪存扇区 B (0x82000)和 C (0x84000)的开头写入测试数据。

 

我的安全设置如下:

 

0x3555555上的 Z1-GRABSECT (整个闪存组0)

0x30005555上的 Z1-GRABRAM (LS0-LS5、D0-D1)

0xxxxxxxx 上的 Z1-CSMPSWD0-3

 

在保护(并让示例代码至少运行一次)之后、我对器件进行了非保护并检查了测试数据的闪存扇区。 如果器件被保护、闪存在0xFFFF 上。 如果器件未受保护、则测试数据(0x0001、0x0002 ...) 保持在闪存中。

 

我是否忘记更改其他内容、以便此示例以安全模式运行?

您能否提供一个在安全模式下工作的示例?

 

此致、Benjamin

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

    您好 Benjamin、

    您能更详细地解释一下您看到的内容吗? 您如何知道它们的示例不是从安全存储器运行的?

    您需要确保您尝试编程的数据位于同一个区域或不安全的存储器中、并且闪存 API 位于您尝试擦除和编程的同一个区域中。 如果是这样、则代码应该能够擦除和编程安全闪存。

    此致、
    SAL

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

    你(们)好

     

    我看到闪存仍然在0xFFFF 上、而不是在测试数据上(0x0001、0x0002……) 再次取消保护器件之后。 为此、我在示例代码的末尾取消了闪存擦除部分的注释。

     

    我的测试程序详细说明:

    1. 将引导模式设置为"等待引导模式"

    1. 示例项目的闪存
    1. 固定设备
    1. 引导模式至"获取模式"
    1. 对电路板1-2进行下电上电、以确保示例代码运行
    2. 引导模式至"等待引导模式"
    3. 解除设备的安全保护
    1. 通过内存浏览器检查闪存

     

    如果我跳过第3步和第7步(器件无保护和取消保护)、则测试数据会保留在闪存中、否则不会。

     

    正如我了解示例项目的链接器文件一样、闪存 API 在安全 RAM (LS0-LS3)中运行、因此安全闪存的闪存应该可以正常工作。

     

    我是否忘记了其他东西?

     

    感谢您的支持、Benjamin

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

    我想你不会忘记任何东西。 只要闪存 API 和调用闪存 API 的代码与您尝试进行编程的 RAM 中的区域相同、那么它就应该起作用。 您能否确认闪存 API 也已链接到安全 RAM?

    此外、您要编程的数据在哪里? 只要它位于同一个区域或不安全、就应该可以工作。

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

    你(们)好

    我在该示例中未更改有关映射的任何内容。 到目前为止、我已经了解了所有内容都在安全 RAM 中运行的代码。

    示例代码尝试编程的数据位于闪存扇区 B (0x82000)和 C (0x84000)的开头、这两个扇区通过 Z1-GRABSECT 设置进行保护。

    此致、Benjamin

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

    如果您尝试擦除和编程扇区 B 和 C、并且与存储数据的位置相同、则在执行擦除(0xFFFFFFFF)时数据将丢失。 数据不能存储在您要更新的位置。

    希望我对您的理解正确。

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

    您好 Sal、

    不、您没有正确理解我!:)

    我修改了该示例、以便数据保留在扇区 B 和 C 中。如果器件未受保护、则该示例有效。

    我应该向您发送示例代码吗?

    BR Benjamin

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

    您是否抓住闪存信号量来更新安全闪存扇区。 请参阅以下文章-

    e2e.ti.com/.../2426101

    此致、

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

    你(们)好、Vivek

     

    是的、我抓取闪存信标。 请参阅我的第一篇帖子。

     

    此致、Benjamin

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

    我们现在不清楚问题是什么,如果事实上你在做你所描述的事情。

    您能否附上一个展示此行为的小示例?

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

    您能否在代码末尾添加一个简单的切换、以查看在器件安全时代码是否正在执行直至结束? 其他方法是在连接了 CCS 的情况下运行器件、但 ECSL 解锁并对其进行调试。 按照以下步骤操作。

    *设置等待引导
    *为器件加电
    *连接 CCS
    *发出调试复位
    *为项目加载符号
    *使用闪存插件 GUI 解锁 ECSL (而不是 CSM)(这是通过提供64位 LSB 密码来实现的)。
    *从 CCS 内存观察窗口在地址0xD00写入0x035A。
    *在主入口点设置硬件断点。
    *单击运行按钮。 如果 CPU 在 Estop 处停止、则再次单击运行按钮。
    CPU 应位于主入口点(到达断点)。 现在、您应该能够单步执行代码并查看是否按预期执行。 您将无法看到任何 CPU 寄存器内容、因为器件仍是安全的、但您应逐步完成代码。如果存在任何问题、您将看到执行崩溃。

    让我们知道情况如何。

    此致、

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

    还有一点需要检查:您能否尝试使用控制套件 V210而非 V170的示例? 您将注意到、Fapi_UserDefinedFuncations.c 文件中的函数被分配给.TI.ramfunc 段(以便在运行时复制到 RAM)。 在您的情况下、请确保这些函数也被复制到同一个区域 RAM 中。

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

    你好,Sal 和 Vivek

    我在代码示例中添加了一个调试引脚切换。 为了使示例运行多次、我在示例末尾再次激活了扇区 B 和 C 的擦除。 调试引脚向我显示代码正在运行、直到在安全和非安全模式下结束。 请参阅随附的图(请注意、安全和非安全模式的时间分辨率不同!)。

    在安全模式下、擦除步骤比在不安全模式下的步骤要快。 我认为这是因为整个闪存组的数据在安全模式下仍在0xFFFF 上。

    您有什么想法、为什么它不同?

    此致、Benjamin

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

    e2e.ti.com/.../FlashExample.pdf

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

    在安全模式下、不仅擦除、甚至编程步骤都要快得多、这意味着 API 是存在的、而无需实际的编程/擦除操作。 发生这种情况的原因有两个。
    1) 1) API 未从安全存储器运行。
    2)闪存信标未正确写入(您可以在代码中读回该值并检查该值是否为0x1 (KEY 的读取值将为0x0)。

    您是否能够按照我提到的步骤在安全模式下逐步执行代码?

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

    Benjamin、

    如前所述、您能否确认 Fapi_UserDefinedFuncations.c 文件中的函数已分配给.TI.ramfunc 段(以在运行时复制到 RAM)? RAM 应该与针对擦除/编程的闪存扇区处于同一个区域。

    谢谢、此致、
    Vamsi

    闪存 API wiki: http://processors.wiki.ti.com/index.php/C2000_Flash_FAQ#Flash_API_wiki

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

    您好、Vamsi 和 Vivek

    很抱歉、Vamsi、我没有注意到您的评论。 我再次对其进行了测试、进行了以下更改:

    -复制 API 用户函数以保护 RAM 安全
    -读回 SEM 字段以检查它是否在0x1上

    结果是 SEM 字段仍然为0。

    但是、尽管参考了不需要的文档(spruhm8g)、但我禁用了写保护(EALLOW)并解决了问题!



    非常感谢您的支持、请在文档中更正此问题、并将获取的闪存信标添加到闪存示例的未来版本中!

    此致、Benjamin

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

x 出现错误。请重试或与管理员联系。