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**** 2039090 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程序?

此致、

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

    您好!  

    对于 CPU1编程和重新引导、程序的起始位置是什么? 它是闪存入口点吗? 是否有显示如何到达非法 ISR 的调用堆栈?  

    对于 SPI 问题、我已请求 SPI 专家发表意见。  

    谢谢、  

    Anu

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

    您好!

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2 ]CPU1重新启动后、我尝试将 SPI-A 所有权更改为 CPU2、但似乎无法正常工作。 为什么?

    您能否提供用于更改所有权的代码?  

    您是否正在修改 CPUSEL6寄存器、特别是位0 (SPIA)?

    此致、

    Marlyn

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

    您好、Marlyn、

    这是我使用的代码:  

    Fullscreen
    1
    2
    3
    EALLOW;
    DevCfgRegs.CPUSEL6.bit.SPI_A = 1; // SPIA controlled by CPU2
    EDIS;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我能否在闪存中写入数据之后,但在重新启动 CPU1之前执行此代码?
    因为我希望 SPI-A 仅 在 CPU1重新编程后由 CPU2驱动;在正常操作中,SPI-A 将由 CPU1驱动。

    此致、

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

    Anu、

    是的、它是闪存入口点。

    在最终操作中,CPU1和 CPU2将在闪存上重新启动,这就是我使用该指令的原因:  

    Fullscreen
    1
    IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    但对于调试测试、我删除了该指令。

    是否有显示如何到达非法 ISR 的调用堆栈?

    我不理解您的请求,如何继续?

    对我来说,出现问题可能是正常的,因为我处于调试模式,重新启动后,Code Composer 将断开连接,不会?

    此致、

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

    我今天进行了几次测试。 我已经尝试了整个循环,不进行闪存操作并重新引导:  

    • CPU1读取十六进制文件信息(在 SD 卡上)
    • CPU1为 CPU2提供 SPI-A 所有权、将 IPC0标志发送到 CPU2、然后保留 SD 卡读取功能。 我没有重新启用中断、因此 CPU1处于"空闲"状态、因为我的软件基于外部中断。 CPU1执行主循环(内部无函数)
    • 在 CPU2上触发 IPC0中断、因此我启动 SD 读取函数。
    • 我可以使用 CPU2读取 SD 卡信息、这意味着 SPI-A 所有权在 CPU2上。

    所以它可以正常工作。 问题是当我擦除 CPU1和 CPU2上的闪存扇区以及尝试重新启动两个内核时。

    • 在 CPU1侧:  
      • 擦除闪存扇区并使用十六进制文件重新写入闪存后,如何继续向 CPU2发送 IPC0标志并将 SPI-A 所有权更改为 CPU2?
      • 如果我在写入闪存后重新启动 CPU1、我将重新启动软件和所有 Init 函数、因此在正常操作中、SPI-A 由 CPU1驱动。
      • 因此,CPU1必须在重新启动之前处于“空闲状态”,但如何继续?
    • 在 CPU2侧:  
      • 同样的问题,我必须如何处理?

    感谢您的支持。

    此致、

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

    您好!  

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3904811 #3904811"]在擦除闪存扇区并使用我的十六进制文件重新写入闪存之后,我必须如何继续向 CPU2发送 IPC0标志并将 SPI-A 所有权更改为 CPU2?

    这可能是您要写入闪存的新十六进制文件的一部分。 这些指令可以放置在您的 init 函数之后。

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3904811 #3904811"]
    • 如果我在写入闪存后重新启动 CPU1、我将重新启动软件和所有 Init 函数、因此在正常操作中、SPI-A 由 CPU1驱动。
    • 因此,CPU1必须在重新启动之前处于“空闲状态”,但如何继续?
    [/报价]

    此处不清楚、如果 CPU1在重新启动前不空闲、它处于什么状态? 基于这一点、这里的情况似乎就是这样:

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3904811 #3904811"]CPU1为 CPU2提供 SPI-A 所有权、将 IPC0标志发送到 CPU2、然后保留 SD 卡读取功能。 我没有重新启用中断、因此 CPU1处于"空闲"状态、因为我的软件基于外部中断。 CPU1执行主循环(内部无函数)[/quot]

    为此:  

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3904811 #3904811]CPU2端:  
    • 同样的问题,我必须如何处理?
    [/报价]

    是否可以在此处不重复重写之前在 CPU2操作中执行相同的功能? 在 CPU2开始执行之前、是否使用新映像正确写入闪存-您可能正在从擦除的闪存读取?

    谢谢、  

    Anu

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

    您好!

    [引用 userid="453770" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3905854 #3905854"]这可能是您要写入闪存的新十六进制文件的一部分。 这些指令可以放在 init 函数之后。[/quot]

    可以、但只有在我们进行重新编程时、才能执行这些函数(将 IPC 标志发送到 CPU2并将 SPI-A 所有权更改为 CPU2)。
    在正常操作(重新启动时不重新编程)中、CPU1必须驱动 SPI-A、并且不会向 CPU2发送 IPC0标志。

    如果有重新编程,则在 CPU1重新引导后:  

    • CPU1 向 CPU2发送 IPC 标志(中断)
    • CPU1 将 SPI-A 所有权更改为 CPU2
    • CPU1"等待"、直到完成 CPU2重新编程

    如果没有重新编程,则在简单重新启动后:  

    1. CPU1  拥有 SPI-A
    2. CPU1 执行其 标准循环。

    为了解决这个问题、如果我有一个重新编程、但在所有重新编程过程之前、我在闪存的一部分写入一个值(在重新编程期间不会被擦除)。
    当我重新启动 CPU 时、我读取了这个值、我知道是否有重新编程。
    希望我对此很清楚。

    我遇到的主要问题是 CPU 重新启动。 正如我在下面解释的那样、当我移除闪存(擦除和写入)操作并重新启动时、CPU1和 CPU2之间的循环正确完成。

    如果我在调试模式下使用重新启动功能,在 Code Composer 上有中断是正常的? 我尝试仅在  CPU1上执行闪存操作和重新引导,我有此中断:  

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //
    // Illegal Operation Trap
    //
    interrupt void ILLEGAL_ISR(void)
    {
    //
    // Insert ISR Code here
    //
    //
    // Next two lines for debug only to halt the processor here
    // Remove after inserting ISR Code
    //
    asm (" ESTOP0");
    for(;;);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我的 CPU1重新启动功能是否正确?  

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    EALLOW;
    WdRegs.SCSR.all = 0x0000; // Configuration : Generate a reset signal
    EDIS;
    EALLOW;
    WdRegs.WDKEY.all = 0x0055; // Clear the WDCNTR bits
    WdRegs.WDKEY.all = 0x00AA; // Clear the WDCNTR bits
    EDIS;
    EALLOW;
    WdRegs.WDCR.all = 0x0028; // Enable the watchdog
    EDIS;
    EALLOW;
    WdRegs.WDKEY.all = 0x0055; // Do not clear the WDCNTR bits to generate the reset signal
    WdRegs.WDKEY.all = 0x0000; // Do not clear the WDCNTR bits to generate the reset signal
    EDIS;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    WD 是否仅重新引导 CPU1或两个 CPU?

    此致、

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

    您好!  

    我 将检查在调试模式下重新启动 CPU 是否会导致 ITRAP。 此链接还可以帮助您了解 CPU 加入 ITRAP 的原因: https://software-dl.ti.com/C2000/docs/c28x_interrupt_faq/html/index.html

    是否正在尝试生成看门狗超时? 您似乎在按照正确的步骤操作。  

    看门狗复位会按如下方式影响 CPU1和 CPU2:  

    谢谢、  

    Anu

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

    Anu、您好!

    是的、我只希望 CPU 重新启动、这就是我使用看门狗超时的原因。  这是正确的方法吗?

    好的、CPU1上的看门狗复位会影响两个 CPU。

    因此 ,如果我想使用调试模式并在重新启动后执行联机测试,我需要在运行前为两个 CPU 设置仿真闪存启动,对吗?  

    我做了一个非常简单的测试:  

    • 我已在 CPU1和 CPU2上加载软件
    • 在运行之前、我已经为两个 CPU (CPU2和 CPU1)在 EMU_BOOT_FLASH 上设置了仿真闪存启动。
    • 两个程序都在运行。
    • 当有请求时、CPU1只读取 SD 卡信息、然后重新引导。
    • 我已经在 CPU1的初始化函数中放置了一个断点、以查看 CPU1是否正确重新启动、但程序似乎从未停止在这里。
    • 则程序不再工作。

    我如何知道我在计划中的位置?

    我是否需要将此指令用于 CPU1?

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

    同时等待您对 ITRAP 的回答。

    感谢您的支持。

    此致、

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

    您好!  

    在调试模式下自行重新启动 CPU 不会导致 ITRAP -闪存入口点是否填充了 CODE_START 函数? 如果 codestartbranch 文件的内容未写入闪存入口点、CPU 可能正在执行一些垃圾指令、这可能是生成 ITRAP 的原因。 您能否检查应在重新引导后运行的映像的映射文件、并查看 codestartbranch 文件是否映射到闪存入口点?

    要产生看门狗超时、对 SCSR 寄存器和 WDCR 寄存器的写入应该足够了。  

    要查看您在程序中的位置、在 ITRAP 期间查看栈的内容可能也很有帮助、返回地址应该在那里。  

    谢谢、  

    Anu

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

    Anu、您好!

    正如我解释的那样,在我上次测试期间,我不再使用 ITRAP,但我不知道我的程序是否正确重新启动;我的过程(下面)是否正确 ?

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3907468 #3907468"]

    我做了一个非常简单的测试:  

    • 我已在 CPU1和 CPU2上加载软件
    • 在运行之前、我已经为两个 CPU (CPU2和 CPU1)在 EMU_BOOT_FLASH 上设置了仿真闪存启动。
    • 两个程序都在运行。
    • 当有请求时、CPU1只读取 SD 卡信息、然后重新引导。
    • 我已经在 CPU1的初始化函数中放置了一个断点、以查看 CPU1是否正确重新启动、但程序似乎从未停止在这里。
    • 则程序不再工作。
    [/报价]

    感谢您的支持。

    此致、

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

    我将与一名员工核实、并在几天内回复您。

    谢谢

    Anu

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

    您好!

    是否有更新?

    此致、

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

    您好!

    Anu 今天不在办公室。  我们将在 下周早些时候进行回顾并与您再次进行讨论。

    谢谢、此致、

    Vamsi

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

    您好!

    任何更新?!

    此致、

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

    您好!

    很抱歉耽误你的回答。  

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3910034 #3910034"]
    • 当有请求时、CPU1只读取 SD 卡信息、然后重新引导。
    • 我已经在 CPU1的初始化函数中放置了一个断点、以查看 CPU1是否正确重新启动、但程序似乎从未停止在这里。
    [/报价]

    在这种情况下,CPU1是否在从 SD 卡读取信息后经过复位周期? 重新引导后停止 CPU 时,PC 值是多少?

    此致、

    Vivek Singh

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

    好的、我从您的原始帖子中看到您正在使用 WD 重置重新启动 CPU1。 您还了解 CPU1 WD 重置将重置 CPU1和 CPU2、因此我希望您在流程中进行了更改、以便对 CPU1和 CPU2进行编程、然后使用 WD 重置重新启动 CPU1、这也将重新启动 CPU2。  

    是这样吗?

    此致、

    Vivek Singh

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

    您好、Vivek、

    是的、我使用 WD 来重置 CPU1。 我很清楚、CPU1 WD 也会重置 CPU2。

    首先我要检查的是 WD 是否重新启动 CPU1;这是我继续执行的方法:  

    • 在 CPU1软件中、我 在主 循环之前的 init 函数中放置一个断点。
    • 我在 CPU1和 CPU2上加载软件
    • 在运行之前、我为两个 CPU (CPU2和 CPU1)在 EMU_BOOT_FLASH 上设置仿真闪存引导。
    • 我运行这两个程序。
    • 程序在 CPU1初始化函数断点处停止(正常)、我重新启动它。
    • 两个程序都在运行。
    • 当有请求时、CPU1只读取 SD 卡信息、然后使用 WD 复位重新启动。
    • 我的程序不会在  CPU1 init 函数断点处停止。

    您知道原因吗? 我希望我对我的解释很清楚。

    这是第一个要解决的问题、在我解释我要继续对两个 CPU 进行编程时、我将进行解释。

    此致、

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

    WD 复位(用于重新启动)后,是否已检查 仿真闪存启动 (EMU_BOOT_FLASH)是否仍然设置? 当您停止 CPU1时,它在何处停止(PC 值)?  请在暂停后检查 RESC 和 NMISHDFLG 寄存器中的值。

    此致、

    Vivek Singh  

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

    您好、Vivek、

     如何在复位后检查仿真闪存启动?

    我将于周一进行测试

    此致、

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

    您好!

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3934322 #3934322"] 复位后如何检查仿真闪存启动?

    您在复位矢量(在引导 ROM 中)中放置了一个硬件断点(基本上是 CPU 在您发出调试复位后指向的 PC)、CPU 应该在 WD 复位后暂停、然后您可以检查该值。 您还可以检查新映像并查看其编程是否正确。

    此致、

    Vivek Singh

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

    您好、Vivek、

    当我停止 CPU1时,寄存器的值为:  

    • RESC:0xC0000004
    • NMISHDFLG:0x0000

    程序在中断中停止,这意味着    它在 Init 之后没有在我的点(ASM (" ESTOP0")中停止;),它 真的会重新启动?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="19481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3935942 #3935942"]在复位矢量(在引导 ROM 中)中放置硬件断点(基本上是 CPU 在发出调试复位后指向的 PC)、CPU 应在 WD 复位后停止、然后可以检查该值。 您还可以检查新映像并查看其是否已正确编程。

    抱歉,如何继续操作? 我以前从未这么做过。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3937266 #3937266"]程序在中断中停止,这意味着它在    我的 Init 之后没有在我的点(ASM (" ESTOP0")中停止; 引用它真的会重新启动?[/DIT]

    CPU 在上述点暂停后,您是否检查了地址0xD00的值?

    此致、

    Vivek Singh

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

    您好、Vivek、

    您是说当我暂停 CPU 时? 明天我将检查 EMUBOOTCTRL (地址0xD00)的值

    如何继续在复位矢量中放置硬件断点?

    感谢 Vivek 的支持。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3938273 #3938273"]如何继续在复位矢量中放置硬件断点?

    如前所述、当您复位 CPU 时、将断点置于 PC 指向的位置(打开反汇编视图并添加断点)。

    Vivek Singh

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

    Vivek、

    很抱歉、如果我问一些问题、我不太清楚。

    如果我理解,我必须第一次重置 CPU,请参阅 PC 指向的位置(通过打开反汇编视图),并添加一个断点?
    如何在 反汇编视图中添加断点?
    那么我必须重新启动我的程序吗?

    感谢您的支持、很抱歉回答这些问题。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3938698 #39386989"]如果我理解,我必须第一次重置 CPU,查看 PC 指向的位置(通过打开反汇编视图),并添加断点?

    只需双击要设置断点的行。  

    [引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3938698 #39386989"]然后我必须重新启动我的程序?

    您不必重新启动该程序。 只需在设置断点后运行它。 程序已加载到闪存中、因此它应该可以正常工作。

    此致、

    Vivek Singh

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

    您好!  

    您是否能够使其正常工作?

    此致、

    Vivek Singh

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

    您好、Vivek、

    很抱歉、我在度假。

    旧问题得到解决、CPU1在仿真模式下的看门狗复位后重新启动。 但主要问题不是。 只是为了解释这种情况:  

    我想重新编程 CPU1和 CPU2;对于这两个 CPU,目标是转换十六进制文件中的.out 文件,将其存储在 SD 卡上,读取该文件,然后将十六进制文件写入闪存。

    我有问题

    2种不同的情况(我只解释 CPU1):  

    • 在仿真模式下,我注释以下行:  

    Fullscreen
    1
    //IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我构建.out 文件、转换为.hex 文件、将其复制到 SD 卡上、读取 SD 卡、正确写入闪存。 它的工作原理。

    • 在独立模式下,我 添加以下行:  

    Fullscreen
    1
    IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我构建.out 文件、转换为.hex 文件、将其复制到 SD 卡上、读取 SD 卡、写入闪存;它不起作用。
    .out 文件、即.hex 文件、并不完全相同、我同意这一点。
    在我的.hex 文件中、某些行已更改、尤其是一行。


    此行的字节数已更改、现在我已经在闪存中写入并发出了命令。

    是因为我在 函数 Fapi_issueProgrammingCommand()中使用了 Fapi_AutoEccGeneration 吗?

    要进行编程,我遵循第10章中的说明:  

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/951668/faq-faq-on-flash-api-usage-for-c2000-devices

    当我想对地址0x8BA66进行编程时、它不起作用。  

    您知道原因吗?

    感谢您的支持。

    此致

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

    您好!

    为什么需要在仿真模式下注释掉 IPC 引导命令代码。 您还应该能够在仿真模式下运行准确的代码、如果代码失败、则对其进行调试。 您应该能够重置 CPU1/CPU2、然后运行 CPU1、然后运行 CPU2、它应该像独立运行一样工作。

    此致、

    Vivek Singh

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

    Vivek、

    我按照以下步骤操作: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/735910/ccs-tms320f28377d-cpu2-boot-from-flash

    现在、我可以使用闪存模式重新引导进入仿真模式。 您说得对、我不必注释 IPC 引导命令代码。

    但它不能解决我的问题。 我无法在闪存中写入某些数据,我不明白为什么:  

     闪存中的数据写入(.hex 文件):  

    擦除和重新编程后在闪存中写入的数据:  

    看起来@0x8BA66处的数据没有写入、但我不知道为什么。

    此致、

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

    您好!

    现在您可以在连接了仿真器的情况下运行相同的代码、您应该能够单步执行代码并在尝试对闪存进行编程时找到错误代码。 我觉得奇怪的是、您只面临一个特定地址的问题。 我还将邀请我们的闪存专家来研究这一点。

    此致、

    Vivek Singh

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

    您好!

    在链接器 cmd 文件中、是否所有段都在128位边界上对齐? 您可以使用 align (8)来实现此目的。

    请查看 C2000Ware 中提供的用于 alert()的基于闪存的链接器 cmd 文件。

    谢谢、此致、

    Vamsi  

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

    您好、Vamsi、

    请在随附的我的 cmd 文件中找到。 我按照您的说明操作,地址有偏移量,但问题相同:  

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    MEMORY
    {
    PAGE 0 : /* Program Memory */
    /* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */
    /* BEGIN is used for the "boot to Flash" bootloader mode */
    BEGIN : origin = 0x080000, length = 0x000002
    RAMM0 : origin = 0x000122, length = 0x0002DE
    RAMD0 : origin = 0x00B000, length = 0x000800
    RAMLS03 : origin = 0x008000, length = 0x002000
    //RAMLS0 : origin = 0x008000, length = 0x000800
    //RAMLS1 : origin = 0x008800, length = 0x000800
    //RAMLS2 : origin = 0x009000, length = 0x000800
    //RAMLS3 : origin = 0x009800, length = 0x000800
    RESET : origin = 0x3FFFC0, length = 0x000002
    /* Flash sectors */
    FLASHABCDEFG : origin = 0x080002, length = 0x01FFFE /* on-chip Flash */
    //FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */
    //FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */
    //FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    感谢您的支持。

    此致、

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

    您好!

    1) 1)到目前为止、您正在使用自定义闪存编程器将十六进制映像加载到闪存-正确吗?

    2) 2) 2)如果您使用 CCS 对十六进制映像进行编程、会发生什么情况?  它是否会导致相同的问题?  请检查并告知我。

    谢谢、此致、
    Vamsi

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

    Vamsi

    1) 1)是的、我正在使用 SD 卡加载十六进制闪存映像。

    2) 2)您是说我是否使用 CCS 加载十六进制映像? 如何继续操作?

    谢谢、此致

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

    您好!

    2。 CCS 也允许您加载十六进制文件。  加载时是否遇到问题?

    谢谢、此致、

    Vamsi

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

    Vamsi、

    使用 CCS 加载 hex 文件时没有问题。

    数据写入正确:  

    感谢您的支持。

    此致、

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

    您好!

    那么、我 认为问题不在于十六进制文件或闪存。

    谢谢、此致、

    Vamsi

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

    我同意, 那么错误可以从哪里来?!

    目标是使用 SD 卡加载 hex 文件而不是 CCS、因此我的问题无法得到解决。

    此致、

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

    您好!

    您需要从 SD 卡检查/调试加载程序/编程器。  

    谢谢、此致、
    Vamsi

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

    Vamsi、

    这正是我在之前的帖子中所做的。 我将一些断点放在不同的位置以找到问题、但我找不到它。

    这不是对齐内存问题。 我发现问题的地址是0x8BA6A,如下所述: e2e.ti.com/.../faq-faq-on-flash-api-usage-for-c2000-devices

    (iii)如果地址为“128位对齐地址+2”,则一次最多可编程六个16位字。

    我有16个要写入的字、因此我已经写入了2个字、4个字、4个字和2个字。 如上所述,2个字不是写的,但其他所有字都是:  

    有什么想法吗?

    谢谢、此致。

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

    您好!

    感谢您阅读我的常见问题解答。

    如果我理解正确、您将讨论最后两个未正确写入的字。   

    如果您使用 Fapi_AutoEccGeneration 或 Fapi_DataAndEcc 模式对 ECC 进行编程、则每当您对小于4个字(对齐64位)的字进行编程时、您需要 确保不会再次对该4个字(对齐64位)中的其余未编程位置进行编程-即使这些位置为0xFFFF、程序操作也将失败。  原因:假定在该64位内未提供数据为0xFFFF、已经为该64位对 ECC 进行了编程。  现在、当您尝试对这些被擦除的位置进行编程时、新的 ECC 值将与现有的 ECC 值相冲突-程序将失败。

    谢谢、此致、
    Vamsi

    闪存常见问题解答: e2e.ti.com/.../faq-flash-frequently-asked-questions

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

    Vamsi、

    感谢您的解释、现在我很清楚。

    我将使用 Fapi_DataOnly、它对我的应用更灵活。

    此致、

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

    您好!

    很高兴它帮助了我们。

    请注意: 无论您使用哪种编程模式(Fapi_DataOnly 或 Fapi_AutoEccGeneration 等)、都应对给定的128位对齐存储器进行编程、时间不超过4次(包括 ECC 写入)。  

    如果您有任何疑问、请告诉我。

    谢谢、此致、
    Vamsi   

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

    您好、Vamsi、

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3956942 #3956942"]请注意: 无论您使用哪种编程模式(Fapi_DataOnly 或 Fapi_AutoEccGeneration 等)、都应对给定的128位对齐内存进行不超过4次编程(包括 ECC 写入)。  [/报价]

    为什么会这样呢? 我不会一次对128位对齐存储器进行编程、最大为64位对齐。

    重启后(由于看门狗复位)、程序在 NMI 中断中停止。 是因为我使用  Fapi_DataOnly 而不是 Fapi_AutoEccGeneration 吗?
    我禁用 ECC 来解决它。 是否有特定的地方可以编写此代码?

    最后一个问题是,在擦除闪存并重新写入闪存后,程序在重新启动后停止,但我不知道问题是什么:  

    我已经检查了、所有闪存扇区 都进行了良好的编程。 是因为 ECC 吗?  

    感谢您的支持。

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

    您好!

    今天是我们的假期。  我将在一两天内回来。

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    我已修改代码以使用  Fapi_AutoEccGeneration 而不是 Fapi_DataOnly。 我还删除了禁用 ECC 的函数。
    我在 CPU1闪存写入函数的末尾放置了一个断点;闪存扇区似乎被很好地编程。

    但是,当我重新启动 CPU1并重置看门狗时,我会收到以下消息:  

    可以帮帮我吗?

    是否必须在 CPU1或 CPU2上使用"CpuSysRegs.RESC.bit.WDRSn = 1;"指令?

    此致、

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

    您好!

    屏幕截图中的该地址是引导 ROM 空间中的 NMI 处理程序(根据 TRM 的4.9.2等待点部分)。

    请检查 NMIFLG/NMISHDFLG 寄存器以了解 NMI 的原因并修复它。

    谢谢、此致、

    Vamsi

1 2