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.

[参考译文] TMS320F28388S:在启用 CSM 后尝试运行 CM 时28388S 处理器上出现错误

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1346509/tms320f28388s-error-on-28388s-processor-when-trying-to-run-cm-after-csm-is-enabled

器件型号:TMS320F28388S

我使用了 dcsm_security_tool 项目为我的处理器生成了 DCSM 设置。 我对其进行了设置、以便所有安全闪存和 RAM (CPU 和 CM)都锁定在区域1中、并尝试运行我的项目。 CPU 按预期运行、我可以正常运行已锁定和未锁定的处理器。

但是、当 DCSM 处于锁定状态且调试器一旦 执行 以下函数、就会立即断开连接、CM 将不会运行:

//将 CM 配置为在125MHz (AUX 原始= 500MHz)下运行。
SYSCTL_setCMClk (SYSCTL_CMCLKOUT_DIV_4、SYSCTL_SOURCE_AUXPLL);

一旦调试器断开连接、除非将处理器置于 SCI 引导模式、否则无法重新连接。 即使我注释掉上面的行、下一个 SYSCTL 调用也将具有相同的效果。

为什么运行此函数会导致此行为、我需要执行什么操作来解决此行为? 这是不正确的 DCSM 设置导致的吗?

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

    尊敬的 Thomas:

    如果您未启用安全功能、您能否确认 CM 不存在问题?

    是否在问题发生时在 SysCtl_setMClk 函数中设置了断点? 如果您在存储器的安全区域设置了断点、调试器将立即断开连接。 您可以通过在 CCS 片上闪存工具中执行 ECSL 解锁来防止这种情况。

    谢谢!

    卢克

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

    可以。 如果我在 CSM 未锁定的情况下运行、CPU 和处理器初始化/运行都不会出现问题。 当我将编译配置更改为 RELEASE、以保持 CSM 处于锁定状态时、CM 无法正确运行。 在尝试调试此问题时、我连接了调试器(通过 GEL 文件中的脚本解锁)、并在单步执行 CPU1 main 之前运行了 DSCM 锁定脚本。 存储器显示为全零、但符号仍然与函数调用的存储器地址对齐。 我保持单步执行、直到我获得 SysCtl_setCMClk 函数、并且一旦我执行该函数、我的调试器将断开、并且我无法重新连接。 尽管进行了更多测试、但似乎有时会在后续的 CM 初始化调用中发生断开。

    CM 似乎卡在 0x1618–0x16C4存储器范围内、因此我打算尝试不要将 CM 锁定到 CPU 和 CPU 到 CM 存储器位置、以便查看 CSM 是否干扰了两个处理器之间的通信。 是否需要执行其他设置步骤来确保在我们运行 CM 时初始化 CM 的安全闪存/RAM 安全设置?

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

    尊敬的 Thomas:

    您是否能够进入 SysCtl_setCMClk 函数来查看调试器何时确切断开连接? 您断开连接的代码中的位置是否一致?

    当 CM 至 CPU MSG RAM 处于不安全状态时、您是否看到不同的结果?

    谢谢!

    卢克

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

    Luke、您好!

    将 CM 至 CPU MSG RAM 保留为不安全不会对该问题有所帮助。  

    这是调试器断开连接时正在执行的代码行:

    HWREGH (CLKCFG_BASE + SYSCTL_O_CMCLKCTL)|=
    ((uint16_t) divider << SYSCTL_CMCLKCTL_CMCLKDIV_S)|
    ((uint16_t) source << SYSCTL_CMCLKCTL_CMDIVSRCSEL_S);

    这是调试器断开连接时的控制台输出:

    C28xx_CPU1:错误:(ERROR -1135 @ 0xA611)调试探针报告了错误。 确认调试探针配置和连接、重置调试探针、然后重试此操作。 (仿真包9.6.0.00172)
    C28xx_CPU1:尝试20次后无法确定目标状态

    当出现此问题后尝试重新连接时、出现此错误:

    停止目标 CPU 时出现问题:
    (错误-1156 @ 0x0)
    器件可能在低功耗模式下运行。 是否要使其退出此模式? 选择"是"以强制唤醒器件、然后重试操作。 选择"否"可在不唤醒器件的情况下重试操作。
    (仿真包9.6.0.00172)

    进入此状态后、唯一可以再次连接的方法是将处理器置于 SCI 引导模式、然后重新连接调试器。

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

    尊敬的 Thomas:

    包含这行代码的函数是否被分配给安全存储器? 如果您在片上闪存工具中执行 ECSL 解锁而不是 DCSM 解锁、您仍然会看到这个问题吗?

    谢谢!

    卢克

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

    Luke、您好!

    我最终弄清楚了 DCSM 发生了什么。 看起来、如果您使用 GEL 文件脚本在调试器连接上自动解锁 DCSM、然后锁定 DCSM、您可以单步执行 CPU1代码、然后符号将一致。 即使从安全存储器执行也是如此(即使正在调试安全存储器、DCSM 也不会立即断开连接)。 我们的 CPU 代码将重置 CM、一旦发生这种情况、调试器就会断开连接且不能重新连接。 让我感到困惑的是、当 DCSM 被锁定时、我没有立即断开连接。 我假设在 CM 复位之前实际上并未应用锁定(即使 MEMORY 浏览器中的所有存储器都是零)。 我只会将此标记为已解决。