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:针对 CPU1和 CPU2对闪存重新编程

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2

器件型号:TMS320F28379D
主题中讨论的其他器件: C2000WARE

您好!

我在 TMS320F28379D 上使用 CPU1和 CPU2  

在我的软件中、我 想使用 SD 卡上的十六进制文件(使用 SPI-A)对 CPU1和 CPU2的闪存进行重新编程。
如需相关信息、在之前的程序中、我仅使用 CPU1、此函数(使用 SD 卡对闪存重新编程)工作正常。

重新编程过程如下:  

  • 读取 hex 文件信息
  • 擦除 CPU1闪存扇区
  • 在闪存中写入十六进制文件数据
  • 使用看门狗重新引导 CPU1

下面是我要继续的方式:  

  • 在正常状态下、CPU1程序和 CPU2程序与 IPC 标志同步。
  • 如果正在对 CPU1进行重新编程、则 CPU2处于"空闲"状态。 SPI-A 由 CPU1驱动。
  •  完成 CPU1重新编程后、CPU1向 CPU2发送 IPC (IPC0)标志以开始 重新编程(CPU2上的中断)、更改 SPI-A 所有权(CPU1->CPU2)、然后重新启动。
  • CPU2正在重新编程;CPU1处于"空闲"状态。  SPI-A 由 CPU2驱动。
  •  完成 CPU2重新编程后、CPU2 将重新启动。
  • 当两个内核都将重新启动时、我们将处于正常状态。

我可以正确重新编程 CPU1闪存,但我对 CPU2重新编程有一些疑问:  

  • 在 CPU1闪存编程过程中、CPU1驱动 SPI-A。 在 CPU1重新启动后、我尝试将 SPI-A 所有权更改为 CPU2、但似乎无法正常工作。 为什么?

  • CPU1编程并重新引导后、我已经有"ILLEGAL_ISR"、这可能是由于重新引导后 Code Composer 上的调试模式造成的。 如何调试 CPU2程序?

此致、

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

    您好、Vamsi、

    此处是正则值;




    我找到问题的原因,因为我需要写入28个字节,所以我遇到了对齐问题:  

    因此,我将程序修改为使用"Fapi_DataOnly"指令,并且我也禁用了 ECC:

    Fullscreen
    1
    2
    3
    EALLOW;
    Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0x0;
    EDIS;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    在使用 "Fapi_DataOnly"指令重新编程之前:  

    重新编程后:  

    我仍然有问题。 您知道原因吗?

    我是否需要在 CPU1和 CPU2上使用此指令? 如果是,何时?

    Fullscreen
    1
    CpuSysRegs.RESC.bit.WDRSn = 1;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    感谢 Vamsi 的支持

    此致

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

    您好!

    寄存器显示您收到 ECC 错误(因此也是 NMI)。    

    闪存 ECC 校验在加电时被启用。  因此、如果您不对 ECC 进行编程、ECC 错误将在应用程序在运行时禁用它之前发生。  

    我建议您对 ECC 进行编程。  如果您对此有任何疑问、请告诉我。

    闪存常见问题解答、可帮助:

    1.有关 C2000器件闪存 API 用法的[常见问题解答]常见问题解答:  

         https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/951668 

    2.针对 C2000器件中闪存 ECC 用法的[常见问题解答]常见问题解答-包括 ECC 测试模式、链接器 ECC 选项:  

         https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/951658 

    关于设置 RESC 的 WDRSn 位的问题: 这有助于清除该位。  您需要修复根本原因(ECC)。

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    如前所述,我无法使用 ECC 进行编程;由于.hex 文件的架构,有时我必须对1个字、2个字、3个字或4个字进行编程
    因此与64位对齐不兼容。

    如果我不对 ECC 进行编程,在上电时确认此错误的步骤是什么?

    此致、

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

    您好!

    好的-不确定为什么不能将所有的64位或128位流式传输到 RAM 缓冲区、然后立即进行编程。   

    也许您可以在末尾对 ECC 进行编程->在没有 ECC 的情况下对整个闪存映像进行编程后、从主闪存阵列中读取每个128位、并使用相同的数据调用程序函数、但使用 Fapi_AutoEccGeneration。  但是、对于给定的128位(两次擦除之间)、不应提供超过4个程序命令。

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    正如您说过的、我立即使用缓冲器进行编程。 我可以使用  Fapi_AutoEccGeneration 对我的所有闪存进行编程。
    我在擦除之前和重新编程之后已经检查过、闪存的编程很好。

    但是、在闪存重新编程之后、在看门狗复位之前或之后、我有一个非法的 ISR。
    是因为我只编写并运行 CPU1吗?
    由于我只使用 CPU1进行测试,这行是否会成为问题?

    Fullscreen
    1
    IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我如何知道问题的来源?

    感谢 Vamsi 的支持。

    此致、

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

    您好!

    我可以在下周周二(2月1日)回顾并返回给您

    谢谢、此致、
    Vamsi

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

    您好!

    是的、我建议将 CPU2保持在等待引导状态、因为您的应用程序未使用它。  如果 CPU1应用程序指示 CPU2从闪存引导、并且 CPU2中没有有效代码、则会导致 CPU2上的 ITRAP ->这将重置 CPU2并导致 CPU1上的 NMI。

    如果您还有其他与引导或重置相关的问题、我建议您打开一个新帖子-我们会将其分配给我们的系统控制/引导专家以帮助您。

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    即使我使用两个 CPU、在 CPU1看门狗复位后、CPU2上也会有一个 NMI。 为什么?

     在 CPU1上使用此行时出现问题:  

    Fullscreen
    1
    IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    如何找到导致 NMI 的原因并解决它?

    奇怪的是、这个问题只在看门狗复位引起的重新启动后发生。 电源重新启动后、两个 CPU 均正常运行。

    此致

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

    您好!

    我会将此帖子分配给我们的系统控制专家、以帮助您解决您的最新问题。

    谢谢、此致、
    Vamsi

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

    您好!

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3978576 #3978576">即使我同时使用两个 CPU、在 CPU1看门狗复位后、我在 CPU2上也具有 NMI。 为什么?

    我不认为 CPU2上的 NMI。 您是否在从 CPU1调用引导命令之前在 CPU2上加载代码? 此外、当您连接到 CCS 时、两个内核均会根据仿真引导而不是正常引导进行引导。 请在器件 TRM 中查找仿真启动并进行适当设置、看看这是否有用。

    此致、

    Vivek Singh

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

    您好、Vivek、

    我继续如下所述:  

    • 在 CPU1上加载程序
    • 在 CPU2上加载程序
    • 复位 CPU1
    • 为 CPU1在闪存上设置 EMU 引导模式
    • 复位 CPU2
    • 运行 CPU2
    • 运行 CPU1


    是这样吗?

    此致、

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

    您好!

    仿真启动适用于 CPU1和 CPU2。 如果您要将两个 CPU 连接到 CCS、则需要为这两个 CPU 设置仿真启动。 您可以为 CPU2 (FF5A)设置"Emulate Standalone boot"、以便其像正常引导过程一样引导。 您还需要运行 CPU1 ist、然后运行 CPU2。

    此致、

    Vivek Singh

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

    Vivek、如果我像您说的那样继续:  

    • 在 CPU1上加载程序
    • 在 CPU2上加载程序
    • 复位 CPU1
    • 为 CPU1在闪存上设置 EMU 引导模式
    • 复位 CPU2
    • 为 CPU2在闪存上设置 EMU 引导模式
    • 运行 CPU1
    • 运行 CPU2

    我的程序无法运行。

    如果我按如下方式继续,程序将运行; 您知道原因吗?

    • 在 CPU1上加载程序
    • 在 CPU2上加载程序
    • 复位 CPU1
    • 为 CPU1在闪存上设置 EMU 引导模式
    • 复位 CPU2
    • 运行 CPU2
    • 运行 CPU1

    但在 CPU1看门狗复位后、CPU2停止或不重新启动、但我不知道在哪里。 如何知道我在哪里?

    通常情况下,使用此行时,CPU2必须在复位后在闪存上重新启动?

    Fullscreen
    1
    IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


    RESC 寄存器= 0xC0000000、因此我不再具有 NMI。

    此致、

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

    您好、Vivek、

    是否有更新?

    此致、

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

    我提到的步骤仅在 CPU1和 CPU2之间没有任何握手(如等待 IPC 标志)时才有效。 如果您具有该值、则不应在运行 CPU1后重置 CPU2。 这一切都取决于您的代码流程。 设置双核工程的正确方法是在 CPU1设置所有 GPIO 和其他系统配置(如时钟/存储器等)后、从 CPU1向 CPU2发出引导命令 然后、CPU1应等待 CPU2的引导状态(CPU2代码应将引导状态发送到 CPU1)、然后两者 都可以开始运行各自的任务。 只要 CPU2在 CPU1设置之前未使用任何系统配置(例如、默认情况下仅可从 CPU1访问全局共享 RAM)、您正在使用的步骤就可以。 CPU1代码启用对 CPU1的访问后、CPU2只能执行或写入 CPU2)。

    希望这一点很清楚。

    此致、

    Vivek Singh

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

    您好、Vivek、

    有两点:  

    -在仿真模式下启动程序时,会出现一个问题
    另一个问题是 CPU1看门狗复位后的重启问题。

    如果我们只关注第二个问题,那么它是否低于采取行动的好方法?

    在 CPU1侧:  

    - IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);
    -等待 CPU2引导状态(使用  IpcRegs.IPCBOOTSTS  寄存器)?

    在 CPU2侧:  

    -是否将引导状态发送到 CPU1 (使用  IpcRegs.IPCBOOTSTS 寄存器)?

    对吗?

    如果我总结:  

    -电源关闭后,程序将正确重新启动。
    - CPU1看门狗复位后、它不会。

    这两种情况之间的区别是什么?! 我只想了解关闭重启和 CPU2侧 CPU1看门狗复位之间的变化。

    很抱歉、我不清楚。

    此致、

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

    您好!

    这很奇怪。 上电和 CPU1看门狗复位之间对于器件引导没有太大差异。 我希望您不是通过某些外部驱动器来驱动引导模式引脚、这些驱动器在 CPU1看门狗复位发生时保持驱动、而是在电路板上电后停止驱动。

    您是否可以提供此问题的示例测试代码并将其发送给我,我可以在这里的设置中运行该代码? 此外,您是否有任何 FAE 与您一起处理此问题?  

    此致、

    Vivek Singh

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

    您好、Vivek、

    是的、它看起来很奇怪。
    在我的硬件上,引导模式引脚永久连接到 Vcc 以使用闪存模式:  

    我进行了测试;如果我删除了所有 IPC 功能,请按照下面的行操作,如果我只加载 CPU1程序,则 CPU1程序将在看门狗复位后重新启动。 看起来它与 CPU2链接、您是否同意? 但我不明白为什么在上电后一切正常、但在看门狗复位后一切正常。

    Fullscreen
    1
    IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    如果我们没有发现上述信息有问题、我可以向您发送示例测试代码、但修改源代码需要时间。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3988458 #3988458"]但我不理解为什么在上电后一切都正常工作、但在看门狗复位后不能正常工作。

    我假设在下电上电后、您不连接 CCS、但它是独立工作的。 正确?  

    如果是 WD 复位,是否已连接到 CCS? 或者、这也是独立模式、通过某些 GPIO 切换、您知道 WD 已发出复位。  

    是的、看起来 CPU1/CPU2存在一些同步问题。  

    您看了我创建示例项目的请求、我可以在这里的设置中运行该项目了。

    此致、

    Vivek Singh  

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

    您好、Vivek、

    [引用 userid="19481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3989368 #3989368)]如果 WD 复位,是否已连接到 CCS? 或者、这也是独立模式、通过某些 GPIO 切换、您知道 WD 已发出复位。  [/报价]

    我已经尝试了这两种情况。 在独立模式下、我知道看门狗有复位问题、因为我使用 LED。 (在我的程序执行期间、LED 被切换、如果复位被执行、LED 被关闭、然后打开)。

    我会将项目发送给您。

    此致、

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

    好的、谢谢。 将尝试该项目、并告知您是否能够复制该项目。

    此致、

    Vivek Singh

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

    Vivek、

    总结一下,因为我觉得有误解,我会先解释一下我的女仆测试,然后问问题:

    2个测试(独立模式)和2个不同的结果:

    第1次测试:  

    • 我对两个 CPU 进行了编程
    • 我已经运行 CPU1和 CPU2
    • 我已断开两个 CPU 的连接(运行-->已断开连接),并退出调试模式。
    • 在关闭/打开开关后、LED 闪烁。
    • 我触发了看门狗复位;指示灯在复位后闪烁,因此工作正常。

    第二次测试:

    • 我对两个 CPU 进行了编程
    • 我已经在 CCS 中复位了两个 CPU。
    • 我已经运行 CPU1和 CPU2
    • 我已断开两个 CPU  的连接(运行-->已断开连接),并退出调试模式。
    • 指示灯闪烁。
    • 我触发了看门狗复位、之后 LED 不闪烁。

    1 μ s) Code Composer 复位(°->复位-> CPU 复位)和开关打开/关闭复位之间有何区别?
    2 μ s) CPU1上的看门狗°后,是否等待 CPU2引导模式? 等待? 闪存?

    感谢您的支持。

    此致

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

    您好!

    此详细信息非常有用。

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3998599 #3998599]1°) Code Composer 重置(运行-->重置--> CPU 重置)与打开/关闭重置之间的区别是什么?

    CCS 复位和上电复位(打开/关闭)之间存在很大差异。 CCS 复位仅复位 CPU 子系统、它不会通过 XRSn 或上电复位来复位逻辑复位。 上电复位还会复位 JTAG 锁定并终止 CCS 连接、这在 CCS 复位或 XRSn 时不会发生。  

    如何断开 CCS 的连接? 您只是单击断开连接还是终止整个调试会话? 如果只单击 DISCONNECT、则尝试终止完整的调试会话、并查看这是否有用。  

    此致、

    Vivek Singh  

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

    您好、Vivek、

    我断开 CCS 连接(Run -> Disconnected)、然后单击 Terminate Session (红色方框)。
    我将不再使用 CCS 复位、而只使用上电复位。

    我进行了另一项测试 (我只使用 CPU1并对其进行编程,我擦除 CPU2闪存);CPU1在闪存重写 +看门狗复位后不会重新启动,但:  

    • 如果我注释闪存重新编程部分 (我只使用看门狗复位来重新启动)、CPU1会在它之后重新启动。
    • 我 检查了闪存写入功能是否正确完成;重新编程之前和之后所有闪存的值都相同。

    如果我在初始化函数中注释以下行、CPU1将在闪存写入+看门狗复位后重新启动。

    Fullscreen
    1
    IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我需要使用这一行、因为我将在最终程序中使用两个 CPU。

    1 μ s)
     这行°会影响 CPU1程序、即使 CPU2未编程也是如此?  
    2 μ s)为什么 在上电°后该行不会影响 CPU1程序、而是在闪存写入+看门狗复位后影响我的程序?
    2°μ s)我将此函数放在 CPU1初始化的末尾,以避免 CPU1和 CPU2之间的重新来源冲突; 这是否是继续操作的好方法?
    3 μ s)°在看门狗复位后执行上电复位、CPU1也不会重新启动。 为什么?

    感谢您的支持。

    此致、

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

    我已向您发送了一份个人答复。

1 2