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.

[参考译文] CCS/TMS320F28377S:DCSM、OTP ECC、卡在 ROM WaitBoot()中

Guru**** 2487425 points
Other Parts Discussed in Thread: UNIFLASH, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/698531/ccs-tms320f28377s-dcsm-otp-ecc-stuck-in-rom-waitboot

器件型号:TMS320F28377S
主题中讨论的其他器件:UNIFLASH、controlSUITE

工具/软件:Code Composer Studio

你(们)好

我在链接器输出文件中提供了一些具有 DCSM Z1设置的 FW。 这对于首次闪烁是正常的。 如果第二次编程尝试没有取消保护、也是很好的、只是失败了、但设备继续使用旧的固件。 但我必须取消保护、调试和刷新新版本。

我拉动了其中一个引导引脚来选择等待模式、我编辑了 GEL 文件、在 IDE 中单击 CPU 复位按钮时使用已知的 Z1密码使 Z1不受保护。我在 RAM 中进行了一些调试(不更改 OTP 中的任何位)、 然后,我将新代码刷新为我的失败*在链接器输出文件*中使用相同的旧 OTP 区域配置时,该代码失败。 然后、我在没有内置 Out 文件区域配置设置的情况下刷写代码。 它成功了,但代码未启动(当然,两个引导引脚都拉高)! 如果用空密码将区域链接指针更改为下一个区域、则会启动该操作。 为什么? OTP ECC 是否损坏? 如何以及在哪里可以在寄存器中看到这方面的证据? 我从 ROM out 文件加载了符号、每次单击"CPU reset"并继续时、 它都会在 Estop 指令的 WaitBoot 例程中停止。 我尝试调试 ROM 是因为它 为什么会在那里结束、但使用大量不同的 OTP 设置很难理解。 如果在单击"CPU Reset"(CPU 重置)后、我编辑指向 FW 入口点的 PC 指针、它将按预期工作。 我确信、引导 ROM 不会尝试调用闪存中的任何内容。

有人可以帮您解决这个问题吗? 为什么它不再运行? 如果是由于 OTP ECC,如何验证这一点? 在单击 CPU 复位后的那一刻、我在 ROM 的 WaitBoot()中的 Estop 上没有看到任何单一的闪存 ECC 寄存器变化。

 

此外、我还想知道为什么要使用 OTP 来实现安全性、以便单次故障很容易导致器件损坏、甚至生产出昂贵的器件? 为什么不闪存、即使没有已知解锁密码也可以擦除闪存? 也许对 TI 来说并不容易、好的、但为什么一切都被逆转了!?? Uniflash 会列出从第3个到第0个的密码。 CCS 闪存设置将它们从第0个到第3个列出。 按照区域配置中设置的地址顺序为 EXEONLYRAM-EXEONLYSECT-GRABRAM-GRABSECT。 为什么 CCS 会在闪存设置中将它们换为双模? 好的、它是原样的、但应该如何轻松处理它? CCS–否 Uniflash–否 首次在 ELF 文件中提供 DCSM 设置很容易。 如果需要一些维修、解锁、然后再次锁定、该怎么办? 如何在不麻烦的情况下做到这一点?

更新了:我在0x2C 上检查了引导 ROM 状态寄存器。  比较 CPU 复位-恢复序列、 不安全  与受保护的关系是0x0000F000与0x0000D000。 在安全位9中、闪存启动未设置。 错误位17.. 30在这两种情况下都很清楚。

Update2:尝试使用 Z2。  首先、CCS (V8)拒绝对 Z2的 PSWDLOCK=0进行编程。 看起来像 CCS 错误。

对于 Z2、它是相同的、启用的安全-不运行、禁用的安全-运行正常。

关于引导 ROM 状态。 结果,我对 EMUKEY 等的理解是错误的。 由于我在启动引脚设置为等待的情况下被固定在板上,难怪它已到达 WaitBoot()函数。 但是、将 EMUKEY 设置为0x0B5A (从闪存引导)、单击"CPU Reset"和"Resume"、与 CPU 的连接始终会丢失、如果没有电路板上电周期、则无法连接。

 

谢谢

Edward

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

    尊敬的 Edward:

    让我们尝试从一开始就解决这个问题、然后我们可以讨论您对 OTP 而不是主闪存组中安全设置的其他查询。

    很高兴看到您已尝试调试该问题、并修复了 EMUBOOT 设置中的某些问题。 安全运行设备与不安全的环境不同。 当您以安全方式运行器件时、如果 CCS 在安全代码中暂停、则由于 ECSL、JTAG 连接会断开。 您在安全代码中是否有任何断点? 您是否还检查了电路板上的 XRSn 引脚、以查看器件安全时是否会复位?  

    此致、

    Vivek Singh

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

    感谢您的回答。

    XRSn 引脚应该可以、我明天会检查它。

    事实上、ROM 确实会跳转到闪存并在闪存中运行代码。 一些添加的功能破坏了闪存中的安全执行。 我想知道、如果所有 RAM 和闪存代码只从安全 RAM /闪存执行、那么 GRABSECT/GRABRAM 中的所有 RAM /闪存都被设置为安全。 甚至引导加载程序也能正常工作。 我不知道会有什么中断以及如何进行调试。 printf-和 pines-使用 F28377S 中如此慢的闪存编程进行调试将需要很长时间:-)

    由于已确认在 CCS 中单击 Unlock、我认为应该可以从 ROM 运行到闪存中的断点。 这似乎是不可能的。 即使我只有在安全模式下正确运行的引导加载程序、我也无法从 ROM 运行、直到闪存中的入口点为止。 JTAG 连接中断、引导加载程序运行。 无法调试此类问题?

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

    爱德华

    您应该能够在复位后恢复运行之前禁用 ECSL、然后能够单步执行代码。 ECSL 密码低64位。 在 CCS 闪存插件中、只需输入正确的 ECSL 密码并单击 UNLOCK、您就不应看到 CCS 正在断开连接。

    此致、

    Vivek Singh

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

    您好、Vivek、

    我希望能够做到你所说的,但我不能做到。 只提供2个密码或全部4个密码,不能从 ROM 单步执行到闪存。

    首先、仅使用2个钥匙解锁即可实现以下功能:

    C28xx_CPU1:正在解锁器件...
    C28xx_CPU1:锁定状态:1.
    C28xx_CPU1:解锁器件时出错。 器件仍被锁定。 请重新检查输入的密码。

    使用全部4个钥匙解锁可获得成功和锁定状态0。

    解锁后,调试加载到 RAM 或闪存的代码就没有问题。 调试器必须将 PC 设置为闪存/RAM 中已存在的入口点、因为这样所有操作都可以。 我想说的是,EMUKEY 中的0xB5A 无法从 ROM 单步执行到闪存。 (BTW 默认情况下、EMUKEY 为0x25A 并不是很友好。 我知道这是因为引导引脚设置为等待、但我们还可以如何连接到锁定的器件并解锁它? 不可能。) 我的意思是在调试器中单击"CPU Reset"、然后单击"Resume"-无法到达闪存中的入口点。

    我从中加载 ROM 符号

    C:\ti\controlSUITE\libs\utilities\boot_rom\F2837x_RevB\RevB_ROM_Sources\CCS_files\cpu01\Release\F2837x_cpu01_bootROM_RevB_Golden_020314.out

    这些看起来与我的器件中的 ROM 匹配、反汇编与标签和其他所有内容一致。 因此、从 CPU 复位开始、我可以逐步执行 c1brom_Init_Boot.asm 中的 ExitBoot 例程。 在_ExitBoot 中推入 ACC 行会将0x80000压入堆栈、这是闪存中的正确入口点。 上次调试器会话处于活动状态的时间是在 ExitBoot 中的 LRETR 指令… 我现在明白了为什么会重新锁定器件。

    再次步进并检查闪存可见性。 CPU 复位–解锁-_c1brom_system_init()并且器件再次锁定,从调试器看不到闪存。 让我们来看看哪里有问题。 在 InitDCSM()闪存可见之后,在接下来的几行之后,使闪存不再可见

    //如果密码为 all_1,则不触发 ECSL,
    //新擦除的部件就是这种情况。
    EALLOW;
    DcsmRegsZ1.Z1_CSMKEY0 = 0xFFFFFFFF;
    DcsmRegsZ1.Z1_CSMKEY1 = 0xFFFFFFFF;
    DcsmRegsZ1.Z1_CSMKEY2 = 0xFFFFFFFF;
    DcsmRegsZ1.Z1_CSMKEY3 = 0xFFFFFFFF;
    DcsmRegsZ2.Z2_CSMKEY0 = 0xFFFFFFFF;
    DcsmRegsZ2.Z2_CSMKEY1 = 0xFFFFFFFF;
    DcsmRegsZ2.Z2_CSMKEY2 = 0xFFFFFFFF;
    DcsmRegsZ2.Z2_CSMKEY3 = 0xFFFFFFFF;
    EDIS;

    点击 CCS 下方的 Unlock、即可从 ROM 跳转到闪存…。 这实际上是该器件上的工作方式吗? 非常"友好"。

    我已经检查了您关于 XRS 的建议,看起来不会错。
    我将尝试在 ExitBoot 中的 LRETR 处使用断点进行调试,并重新统一,我希望能够发现问题。

    编辑:我忘记了在不同的器件上是 相同的、在第二个器 件上、我确定 OTP 没有编程两次、因此问题与 OTP ECC 无关。 在安全的情况下会中断执行。


    此致、
    Edward

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

    更新:无。 简而言之、我在闪存中有运行不安全的软件。 在安全的情况下、它不起作用。 我的想法是尝试使用安全密钥解锁 MCU、然后从 ROM 开始调试。 正如我之前所写的、ROM 再次重新锁定 MCU、并且无法从 ROM 步出到 MCU。 我执行1) CPU 复位、2)解锁、3)在 LRETR (0x3ff224)设置断点、4)运行直至断点、5)再次解锁、然后单击运行、我的软件、惊喜、正常工作。 因此、无法使用调试器在安全模式下调试代码。 软件重新上传需要几分钟时间。 看起来我在修复它之前会得到银色...

    Update2:我缩小了问题范围。 引导至引导加载程序正常、进一步引导至主应用程序也正常。 我将使用 LED 进行调试、我已将引脚方向设置为输出、然后移动 for (;;) YELLOWLEDTOGGLE = 1;距离 main ()更深、其中 TOGGLE 定义是 相应 的 GPIO 切换位。  指示灯在 InitADC()例程中停止闪烁,如图所示

    静态 InitADC ()

    EALLOW;

    AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4

    AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4

    AdcSetMode (ADC_ADCB、ADC_Resolution_16BIT、ADC_SIGNALMODE_differential);

    for (;;)

    YELLOWLEDTOGGLE = 1;

    AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);

    //将脉冲位置设置为晚期

    AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1

    AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

    我想知道为什么它在较旧的应用程序中以安全模式工作。 版本。


    Edward

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

    我最后缩小了这个问题的范围。 如果我从 controlSUITE 的 AdcSetMode 函数调用中删除了对 CalAdcINL()的调用,也从我的代码中调用到 controlSUITE 的 InitTempSensor(),那么即使在安全模式下,一切都开始工作... 这两个调用都访问 OTP 中的校准常数、ROM 或 OTP 中的校准函数。 有人知道我可以做些什么来使这些函数停止工作吗? 最奇怪的是早期的软件版本,初始化效果相似,即使在 CalAdcINL()和 InitTempSensor()中也是如此... 啊啊啊啊啊啊啊啊啊啊啊啊啊啊!


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

    爱德华

    这是否意味着引导代码实际上会跳转到您的应用程序? 您是否能够解锁 ECSL 并单步执行代码? 您可以在这些函数调用之前设置断点、然后查看调用这些函数时会发生什么情况。 OTP 在此器件上不安全、因此不会导致任何问题。

    您还使用哪个 RAM 进行堆栈?

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我错过了您之前的更新。 您可以忽略解锁错误、因为这是针对 CSM 的、因为您只输入两个密码、CSM 未解锁。 您还可以在 CCS 寄存器视图中打开密钥寄存器位置、输入 ECSL 密码、然后单步执行代码。

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

    您好、Vivek、

    • 这是否意味着引导代码实际上会跳转到您的应用程序?

    是的。

    • 您是否能够解锁 ECSL 并单步执行代码? 您可以在这些函数调用之前设置断点、然后查看调用这些函数时会发生什么情况。 OTP 在此器件上不安全、因此不会导致任何问题。

    我想我已经提到过它。 我仅使用2 (ECSL?)解锁 和所有4个有效密钥。 默认情况下、两种情况下的 EMUKey = 0x25A。 因此、我首先需要将其设置为0xB5A、以使 ROM 不进入其 WaitBoot 例程、而是从 ROM 退出到闪存入口点。 提供两个闪存不可读、但提供全部 4个闪存可读。  然后、在退出 ExitBoot() ROM 函数时、我必须再次解锁、否则 JTAG 断开连接并结束调试会话。 执行上述两个操作将在任何步进之前解锁,在 ExitBoot()中,退出到闪存成功,所有操作都正常,甚至调用 CalibrateINL 等

    为了使我的软件在安全模式下无法复位,我需要抑制对 CalibrateINL()和 InitTempSensor()的调用。 两个例程都在从 OTP 读取一些设置、我不知道这些函数是如何 以及为什么会挂起的、我会尝试找出它们。

    • 您还使用哪个 RAM 进行堆栈?

    堆栈 位于 D1 RAM 中。

    • 您还可以在 CCS 寄存器视图中打开密钥寄存器位置、输入 ECSL 密码、然后单步执行代码。

    这将是更糟糕 的时间浪费。 复制粘贴两个及多个键需要额外的时间。 在 调试设置中、如果目标连接或程序加载失败、我选中了 Continue debug launch。 这有助于不关闭调试视图并保持闪存设置打开。 我只需执行连接目标/断开目标、由于这些命令向上滚动闪存设置、我需要将它们向后滚动、然后单击解锁。

    更深入地了解校准功能为何在安全模式下停止。

    编辑:必须更改 BTW 默认 GEL。 解锁后、无法将代码加载到 RAM 中、除非此处抑制了 GEL_Reset ()

    OnPreFileLoaded()

     //GEL_Reset ();

    Edward

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

    您好!

    最终得到解决。 感谢 Vivek 回答有关堆栈的问题。 由于需要添加大量需要使用堆栈的 FP printf、因此缺少堆栈、因此我将堆栈移动到了 D-RAM、这是安全的。 这是 ADC INL 和 OTP 中的其他校准例程的问题。 有些确实会将恢复寄存器保存到堆栈、而所有这些都在末尾具有 LRETR 从不安全的存储器执行并具有安全的堆栈时、无法使用堆栈进行存储。 我认为 LRETR 应该可以、但不能、它从堆栈中拉取 RPC、当堆栈安全时、从安全存储器执行时再次被禁止...

    不应该是 OTP 中的校准例程、安全堆栈应该由 controlSUITE 处理? 也许数据表中指定了不安全堆栈的需求、我没有这样做? 我认为最好不要在 OTP 中调用例程、而是从 OTP 读取校准数据。 不是吗?

    Edward

    P.S. 如何将某人的消息标记为有用? 我只看到"已解决"按钮。

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

    关于 printf、还要注意以下主题: https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/620616

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

    在我的示例中、速度不是问题、printf 必须使用标准 printf 说明符和标准 printf 响应为可下载的配置数据提供服务。 我之前已经针对不同的架构、更少的堆栈、更高的速度执行了自己的实现、但是堆栈在几个月后仍保留在安全 RAM 中、并且在执行不同的项目之后... 但至少我已经更熟悉 F28377S 上的 DCSM、OTP 等、好的。

    此致、
    Edward