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.

[参考译文] TMS320F28379D:在 DCSM 实施之后执行代码

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1356624/tms320f28379d-code-execution-after-dcsm-implementation

器件型号:TMS320F28379D

我有一个379D 芯片项目、同时使用了两个 CPU。 未启用 DCSM 的工程在调试模式下和在两个 CPU 上独立运行正常。 我首先开始将 DCSM 模块实施到 CPU1中、然后可以成功进行调试(不记得我是否当时尝试了独立操作)。 我最终将 DCSM 实现到 CPU2中。 现在发生了以下情况:

-我可以使用 JTAG 成功连接和加载两个 CPU ,但不能运行其中一个 CPU ,但我可以看到所有 DCSM 设置在寄存器,观察窗口和片上闪存选项卡正确

-我只需加载 CPU 1并在连接 JTAG 的情况下正常执行代码,但不能独立执行。

-我不能让 CPU2在任何配置下运行,无论是 JTAG 还是独立

我在这里遗漏了什么?

谢谢!

Mike

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

    尊敬的 Mike:

    您到底看到了什么、表明 CPU 未在运行? 在此期间、我将提供一些一般信息、这些信息可能有助于您确定该问题的根本原因。

     DCSM 的一个常见错误是仅当 DCSM 区域不安全时代码才按预期工作。 当这些区域受到保护并且用户具有驻留在不安全存储器中的必须在安全存储器中读写数据的功能时、应用将不再按预期运行。

    此外、独立器件和 JTAG 之间可能会发生差异、具体取决于 .gel 文件的内容。 GEL 文件充当引导 ROM 代码的替代、该代码始终在独立模式下执行。 在 JTAG 模式下、您还可以将器件置于独立模式绝不会达到的状态、例如取消保护片上闪存工具中的区域。 如果您已经在片载闪存工具 GUI 中提供了您的 CSM 密码、.gel 文件可使用这些密码来尝试取消区域安全。 我不确定 F28379D 的.gel 文件是否默认执行此操作、但某些 C2000器件上存在此行为。

    谢谢!

    Luke

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

    我们有一个基于 CAN 的器件可以单独访问两个 CPU 以设置运行参数并查看实时变量。 ‘可以确切地看到哪个 CPU 正常运行、哪个 CPU 不正常运行。 我部分地展开了它、可以运行两个具有 JTAG 的 CPU、但当我单独运行它们时、它们不会执行。 我断开 JTAG、CPU 仍在执行(我想应该没问题)、我循环控制电源、不再发生任何事情。 安全代码将写入 OTP。

    此时所有区域都是安全的。

     

    单独启动器件时是否出现问题? Bootcntrl 被设置为从闪存(0xB)引导。

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

    CPU1似乎没有通过 IPC CPU 启动检查、这可能是因为 CPU2从不启动? 在 OTP 中、BOOTCTRL 都为0x0B5A、这是否有问题?

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

    您好、Michael:

    您是否使用自己的值对 Z1_BOOTCTRL 和 Z2_BOOTCTRL 字段进行了编程? 您能发送一下您编程的值的屏幕截图吗? 我想可能会发生的情况是、您将 BOOTCTRL 字段的高16位编程为所有 F、这会将两个引导模式选择引脚更改为无效的 GPIO 255。 这将导致器件尝试在复位时运行并行引导、而不是在闪存引导时运行并行引导。 在使用 JTAG 时不会发生此错误、因为调试器会将 PC 重新定位到应用代码的开头。

    谢谢!

    Luke

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

    这是我在两个 CPU 上编程到 OTP 中的内容:

    .sect "dcsm_otp_z1_linkpointer"
    .long 0x1FFFFFFF;Z1-LINKPOINTER1
    .long 0xFFFFFFFF;保留
    .long 0x1FFFFFFF;Z1-LINKPOINTER2
    .long 0xFFFFFFFF;保留
    .long 0x1FFFFFFF;Z1-LINKPOINTER3
    .long 0xFFFFFFFF;保留

    .sect "dcsm_otp_z1_pswdlock"
    .long 0xFFFFFFF0;Z1-PSWDLOCK
    .long 0xFFFFFFFF;保留

    .sect "DCSM_OTP_Z1_crclock"
    .long 0xFFFFFFF0;Z1-CRCLOCK
    .long 0xFFFFFFFF;保留

    .sect "DCSM_OTP_Z1_bootctrl"
    .long 0xFFFFFFFF;保留
    .long 0x49550B5A;Z1-BOOTCTRL

    .sect "dcsm_zsel_z1"

    .long 0x000000FF ;Z1-EXEONLYRAM
    .long 0x00003FFF;Z1-EXEONLYSECT
    .long 0x10005555;Z1-GRABRAM
    .long 0x055555;Z1-GRABSECT

    这应将引导引脚正确设置为 GPIO72和84。

    谢谢!

    Mike

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

    此外、我忘了指出我切换了 IO 引脚、CPU1似乎在等待来自 CPU2的 IPC 标志、CPU2绝不会退出复位、这是在独立模式下完成的。

    有什么建议吗?

    谢谢!

    Mike

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

    您好、Michael:

    根据 TRM 中的这一部分、CPU1是否会在应用代码中将 CPU2从复位状态释放?

    谢谢!

    Luke

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

    我不认为 CPU1的调试引脚状态发生了变化、只是避开了 IPC 标志检查、但未通过 IPC 标志检查、我看不到 CPU2一直在切换其调试引脚。 我假设它没有脱离复位。 如果没有调试器、就很难检查复位寄存器。

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

    您好、Michael:

    如果 CPU2保持复位状态、您是否能够添加一些检查该寄存器并将备用 GPIO 配置为高电平的代码?

    谢谢!

    Luke

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

    很抱歉,我在过去的两个星期里一直忙于家庭紧急情况。  

    我想检查寄存器、但还没完成。 有什么建议哪些寄存器最有趣? 我试着尽快抓住我现在的东西去做。

    谢谢!

    Mike

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

    您好、Michael:

    希望你们的家人都很好。

    我建议读取 CPU2RESCTL 寄存器中的 RESET 位:

    这应指示 CPU2是否仍保持在复位状态。

    谢谢!

    Luke

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

    事实证明这是相当困难的。 我可以使用 JTAG 运行 CPU1、但无法单独运行。 我无法同时运行两个 CPU。 再次,没有 DSCM 一切都像一个魅力运行。 我现在感到非常沮丧。

    如果没有器件执行任何代码或仅在特定点执行任何代码、则也无法从器件获得任何信息。

    查看提供的示例、我认为我的代码中没有遗漏任何内容、但是肯定遗漏了一些内容。  

    我从不想费心加载示例来验证操作、它们是否布置为在独立模式下运行? 如果问题出在正确的寄存器设置上、那么我也会遇到同样的问题、因为示例应用程序中未定义任何安全寄存器。  

    欢迎您提出任何想法!!

    谢谢!

    Mike

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

    您好、Michael:

    您能否确认以下信息:

    GPIO72和 GPIO84被驱动为高电平。

    如果是、您能否尝试在代码的不同点设置 GPIO 以查看执行停止的位置? 例如、在5行代码后设置一个 GPIO、如果设置了 GPIO、则在10行代码后设置 GPIO、依此类推、直到未设置 GPIO。

    谢谢!

    Luke

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

    我可以这样做、我会的。 我只是在我已解决的另一个问题上被回避、并且很快就会回来。 我需要尽快解决这一安全问题。

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

    好的、一旦获得有关此安全问题的更新、请告诉我。

    ——路加

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

    我把时间转向这个问题。 请看一下这两个代码片段和示波器图。 黄色示波器线为 GPIO82、蓝色为 GPIO83。 第一个代码片段在 main 中、相对在开头。 然后打开第二个代码片段。  

    使用 JTAG 运行时拍摄了图片"JTAG"。 两个 GPIO 被切换、代码在两个 CPU 中执行。 pic "Standalone (独立)"仅用于控制循环通电。 CPU 2似乎开始了;然而,我看到 CPU1确实如此,但最终在 IPCBootCPU2()中停留在第274行。 我最终将 GPIO82移到 IPCBootCPU2()中的第266行、发现在独立执行时仍然切换。  

    什么能使 IPCBootCPU2()行274中的条件为使用 JTAG 执行而不是在独立模式下执行?

    谢谢!

    Mike

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

    您好、Michael:

    Luke 目前是 OOO 直到7月1日。 他应该能够作出回应,直到那时。  

    我想看看我是否能找到另一位专家在同一时间内提供帮助。

    此致!

    Ryan Ma

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

    太好了、谢谢。

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

    您好、Michael:

    为响应延迟而道歉。  

    我将就此问题与一位专家进行联系。

    此致!

    Ryan Ma

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

    在这种情况下、您的堆栈映射在哪里并且该存储器是安全的?

    Vivek Singh

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

    请参阅下面的寄存器是如何设置的、我假设它是全部进行了更新。 也请参见堆栈位置(0x400h)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    似乎 CPU1没有通过 IPC CPU 启动检查、这可能是因为 CPU2从不启动? 在 OTP 中、两个 bootctrl 都为0x0B5A、这是否有问题?[/QUOT]

    我认为这是问题。 如果您已在 OTP 中设置引导配置、则不会有与 CPU1的 IPC 握手、CPU2将直接引导至闪存。 请参阅"图4-7。 CPU2独立和休眠引导流程"。

    Vivek Singh

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

    Vivek、

    我取出 IPC 握手、出现以下情况:

    在 JTAG 上:

    CPU1正在执行代码、CPU2似乎没有脱离复位状态。

    独立运行:

    CPU2似乎在 CPU1之前脱离复位状态、CPU1正在执行正确的代码、CPU2没有执行、这可能是因为缺少 CPU1的初始化

      

    请提供建议。

    此致、

    Mike

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

    Mike、

    是的、这就是我在上一篇文章中提到的内容。 由于您已经为 CPU2编写了闪存引导程序、因此它在 CPU1引导代码 释放后开始运行应用程序以复位到 CPU2。 您能在下面尝试一下吗-

    连接到 CPU1/CPU2后-

    复位 CPU1

    加载(或如果已加载)运行 CPU1

    加载(或如果已加载)运行 CPU2

    另外、如果您有另一个装置、则不要在 CPU2上对引导设置进行编程、然后尝试。

    Vivek Singh

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

    不成功、CPU2挂起、CPU1正在执行。

    您的意思是不对 CPU2的 OTP 部分 Z1-Bootctrl 进行编程? 但是、以相同的方式刻录其他安全设置? 是否将 CPU1 BOOT Ctrl 烧写为0x025A?

    在我这样做之前,我想我需要了解到底发生了什么。 如果可能、我不想再刻录另一个芯片。

    我的理解是、CPU 1应该退出复位状态、并最终释放 CPU2以退出复位状态、我该如何控制此操作? 我必须控制这个吗? 如果 CPU2的闪存引导无法立即正常工作、我什么时候使用它?  

    我完全不明白我在这里错过了什么!  

    谢谢!

    Mike

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

    是否对此问题有任何进一步的反馈? 是否不烧录 CPU2上的引导控制位?

    谢谢!

    Mike

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的意思是不对 CPU2的 OTP 部分 Z1-Bootctrl 进行编程? 但是、以相同的方式刻录其他安全设置? 将 CPU1引导控制烧写为0x025A?

    是的、这就是我的意思。 你试过这个吗?  

    Vivek Singh