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.

[参考译文] TMS320F280039C:使用 CAN 闪存内核和闪烁应用进行 DCAN 闪存编程

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1380352/tms320f280039c-dcan-flash-programming-using-can-flash-kernal-and-the-blinky-application

器件型号:TMS320F280039C

工具与软件:

我没有下载内核,我追上了冲刺51。 我将以100kbps 的速率发送内核文件、每个 CAN 堆栈2个字节。 但我的内核不会下载到 RAM。 我已将 GPIO 引脚分别分配为24个高电平和32个低电平。  

由于程序仅使用 RAM、是否有必要按照本文档中提到的那样使用此 align (8)?

如果是、那么我应如何输入以下代码?


谢谢!

此致、

Ashan

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

    器件型号:TMS320F280039C

    工具与软件:

    您好!

    我仍在尝试使用 DCAN 闪存内核方法执行 CAN 闪存编程。 我正在使用 ESP 32传输 CAN 数据集。 如 sprad51 Doc 中所述、我以100kbps 的速率传输每个 CAN 堆栈2个字节的闪存、然后等待5秒钟、然后以1Mbps 的速率以每个堆栈8个字节的速率传输应用。 但是 C2000在1Mbps 速率下无法接收、因此我随后以100kbps 速率发送了应用和内核。 但闪存甚至没有擦除。 需要解决此问题、使我的 Launchpad 能够使用 CAN 上传程序。

    谢谢您、

    此致、

    Ashan

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

    尊敬的 Ashan:

    您是否尝试了运行示例 flash_kernel_ex5_dcan_flash_kernel?  如果希望将比特率设置为1Mbps、可以在 bootloader_can_timing.h 头文件中将#define CAN_CALC_BITRATE 修改为1000000U (默认值为100000U)。

    此致、

    Joseph

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

    尊敬的 Joseph:
    感谢您的答复。 我现在也尝试过了。 但仍然只以100kbps 的速率传输内核。 我根据 Sprad 51发送 CAN 数据、方法是将应用程序和内核定义为代码内的2个单独变量。 然后、我以100kbps 的速率在每个堆栈之间以10ms 的延迟传输 dcan 闪存内核文件、每个堆栈2个字节。 完成内核传输后、代码延迟5秒、然后开始以1Mbps 的速率(每个堆栈8个字节)传输应用十六进制文件、每个堆栈之间有10ms 的延迟。 如果需要、我可以发送在 ESPIDF 中为 ESP32构建的代码屏幕截图。 通过观察我认为、即使内核通过 CAN 总线发送到 C2000 LaunchPad、但传输后它不会在 LaunchPad 中运行。 我无法找到合适的解决方案、因为我遵循了 sprad 51文档中提到的方法。 我将 GPIO24设为1、将32设为0、同时如文档中所述将 LaunchPad 中的 S4设为关闭。 希望能提供一些帮助、以便我可以使用 CAN 上传 C2000 IC 的程序。  

    谢谢!  
    此致、
    Ashan  

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

    尊敬的 Ashan:

    是否有指示 LaunchPad 正在从 CAN 总线获取消息的情况?  抱歉、我不确定能否根据您的反馈得出这个结论、只是为了确保您能确认在代码中将 GPIO4和 GPIO5用作 CANTX 和 CANRX 吗?  在 LaunchPad 中、这些是连接到 CAN 收发器的 GPIO。  只需确保使用的 GPIO 正确无误。  如果您正在运行示例5、最好逐步执行 DCAN_Boot 函数以查看例程中断的位置。

    您有正确的引导模式引脚设置配置、因此无法确定问题可能出在何处、从而开始时会显示确认 LaunchPad 正在从 ESP32接收 CAN 帧。

    此致、

    Joseph

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

    尊敬的 Joseph:
    我能够使用 JTA 通信将 DCAN Flash kernal Ex5应用上传到 LaunchPad、并使用 CCS 进行调试。 然后、我使用 CAN 分析仪通过堆栈以100kbps 的数据速率发送了闪烁的应用十六进制文件。

    我尝试手动设置前4、8字节堆栈。 前2个堆栈成功发送、但在发送第3个堆栈时、程序出现 "ESTOP0;//如果频率超出范围、请停止此处"。 我使用断点进行了调试、发现 programm 会走到绕过 PLL 的点、但状态变量从不变为"true"。 我已在下面附上了这部分代码(也显示了断点)。 希望在这方面得到进一步的援助。

    谢谢!

    此致、

    Ashan

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

    尊敬的 Ashan:

    这会指向时钟设置不正确的问题。  当程序执行进入 DCAN_Boot()函数或者它位于 Device_init()中时、您是否遇到过这个问题。  添加供参考的屏幕截图:

    此致、

    Joseph

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

    尊敬的 Joseph:

    程序在 DCAN_Boot()函数内执行。 我能够将 first2、8字节堆栈接收到 rxMsg 变量中。 接收第3叠板时出现问题。

    此致、

    Ashan

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

    尊敬的 Ashan:

    为了澄清、您是否在使用 ESP32而不是 CAN 闪存主机编程器来发送内核和应用文件?

    需要注意的一些事项是、一旦将 CAN 闪存内核发送到器件、器件将以您在 CAN 闪存内核中设置的波特率重新初始化 CAN 通信。

    当向器件发送2个8字节堆栈、然后在第3个堆栈(对于应用)停止时、您是否能够暂停 CCS、并查看其在内核中停止的位置? 可以加载内核项目的符号以获得调试帮助。

    谢谢。此致、

    Charles

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

    您好、Charls:

    您是否使用 ESP32而不是 CAN 闪存主机编程器来发送内核和应用程序文件?

    有。 我为 ESP32构建了一个应用程序、方法是重新填充 f021_DownloadImage.cpp 和 sprad 51文档以发送内核文件、然后将两者定义为单独的变量来创建应用程序文件。  

    由于无法正常工作、我使用 JTAG 通信直接上传了内核。 然后逐堆栈将应用程序作为8字节堆栈发送。

    向器件发送2个8字节堆栈后在第3个堆栈(对于应用)停止时、您是否能够暂停 CCS 并查看它在内核中停止的位置? 可以加载内核项目的符号以获得调试帮助。[/QUOT]

    有。 我将在下面附上三张截图。  

    它将停在屏幕截图中的第二个断点。  

    谢谢!

    此致。

    Ashan

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

    尊敬的 Ashan:

    您还可以添加在命中 SYSCTL.c 第二个断点之前先前函数的内容吗?

    谢谢。此致、
    Charles

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

    Bool
    SysCtl_setClock (uint32_t CONFIG)

    uint16_t divSel、pllen、oscclksrcsel、pllLockStatus、xtalval;
    uint32_t oscSource、pllMULT、mult;
    uint32_t timeout、refdiv;
    Bool 状态= false;

    //
    //检查参数。
    //
    assert ((CONFIG & SYSCTL_OSCSRC_M)<= SYSCTL_OSCSRC_M);
    断言(((CONFIG & SYSCTL_PLL_CONFIG_M)== SYSCTL_PLL_ENABLE)||
    ((CONFIG & SYSCTL_PLL_CONFIG_M)== SYSCTL_PLL_BYPASS)||
    ((CONFIG & SYSCTL_PLL_CONFIG_M)== SYSCTL_PLL_DISABLE));

    //
    //如果检测到 MCD 故障、请不要继续执行 PLL 初始化。
    //
    if (sysctl_isMCDClockFailureDetected ())

    //
    //检测到 OSCCLKSRC2故障。 返回 FALSE。 您需要清除
    // MCD 错误。
    //
    状态= false;
    }
    设计

    //
    //旁路 PLL
    //
    EALLOW;
    HWREGH (CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1)&=
    ~SYSCTL_SYSPLLCTL1_PLLCLKEN;
    EDIS;

    //
    // PLL 旁路后至少需要120个 OSCCLK 周期的延迟
    //
    SYSCTL_DELAY (23U);

    //
    //导出当前振荡器时钟源值
    //
    oscclksrcsel = HWREGH (CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1)&
    (uint16_t) SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M;

    xtalval =(HWREGH (CLKCFG_BASE + SYSCTL_O_XTALCR)&
    (uint16_t) SYSCTL_XTALCR_SE);

    oscSource =(CONFIG & SYSCTL_OSCSRC_M)>> SYSCTL_OSCSRC_S;

    //
    //检查振荡器时钟源是否已更改
    //
    if (((oscclksrcsel | xtalval)!= oscSource)

    //
    //关闭 PLL
    //
    EALLOW;
    HWREGH (CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1)&=
    ~SYSCTL_SYSPLLCTL1_PLLEN;
    EDIS;

    //
    //两者之间至少需要66个 OSCCLK 周期的延迟
    //加电至 PLL 的加电
    //
    SYSCTL_DELAY (12u);

    //
    //配置振荡器源
    //
    SYSCTL_selectOscSource (CONFIG & SYSCTL_OSCSRC_M);

    //
    //至少延迟60个 OSCCLK 周期
    //
    SYSCTL_DELAY (11U);
    }

    //
    //将分频器设置为/1以确保最快的 PLL 配置
    //
    SysCtl_setPLLSysClk (1U);

    //
    //如果在配置中启用或绕过了 PLL 使用情况、请配置 PLL
    //
    if ((((CONFIG & SYSCTL_PLL_CONFIG_M)== SYSCTL_PLL_ENABLE)||
    ((CONFIG & SYSCTL_PLL_CONFIG_M)== SYSCTL_PLL_BYPASS)

    //
    //从配置中获取 PLL 倍频器设置
    //
    pllMULT =((CONFIG & SYSCTL_IMULT_M)<<
    SYSCTL_SYSPLLMULT_IMULT_S);

    pllMULT |=(((CONFIG & SYSCTL_REFDIV_M)>>
    SYSCTL_REFDIV_S)<<
    SYSCTL_SYSPLLMULT_REFDIV_S);

    pllMULT |=(((CONFIG & SYSCTL_ODIV_M)>>
    SYSCTL_ODIV_S)<<
    SYSCTL_SYSPLLMULT_ODIV_S);

    //
    //获取当前已编程的 PLL 倍频器
    //
    MULT =((HWREG (CLKCFG_BASE + SYSCTL_O_SYSPLLMULT)&
    SYSCTL_SYSPLLMULT_IMULT_M)>>
    SYSCTL_SYSPLLMULT_IMULT_S);

    MULT |=(HWREG (CLKCFG_BASE + SYSCTL_O_SYSPLLMULT)&
    SYSCTL_SYSPLLMULT_REFDIV_M);

    MULT |=(HWREG (CLKCFG_BASE + SYSCTL_O_SYSPLLMULT)&
    SYSCTL_SYSPLLMULT_ODIV_M);

    PLlen =(HWREGH (CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1)&
    SYSCTL_SYSPLLCTL1_PLLEN);

    //
    //仅当乘法器需要更新或 PLL 需要时锁定 PLL
    //要打开/启用
    //
    if (((mult!= pllMULT)||(pllen!= 1U))

    //
    //关闭 PLL
    //
    EALLOW;
    HWREGH (CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1)&=
    ~SYSCTL_SYSPLLCTL1_PLLEN;
    EDIS;

    //
    //两者之间至少需要66个 OSCCLK 周期的延迟
    //加电至 PLL 的加电
    //
    SYSCTL_DELAY (12u);

    //
    //写入乘法器、它会自动打开 PLL
    //
    EALLOW;
    HWREG (CLKCFG_BASE + SYSCTL_O_SYSPLLMULT)= pllMULT;

    //
    //启用/打开 PLL
    //
    HWREGH (CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1)|=
    SYSCTL_SYSPLLCTL1_PLLEN;

    //
    //等待 SYSPLL 锁定计数器或超时
    //此超时需要基于 OSCCLK 计算
    //具有系数 REFDIV。
    //锁定时间是1024 OSCCLK *(REFDIV+1)
    //
    refdiv =((CONFIG & SYSCTL_REFDIV_M)>> SYSCTL_REFDIV_S);

    超时=(1024U *(refdiv + 1U));
    pllLockStatus = HWREGH (CLKCFG_BASE + SYSCTL_O_SYSPLLSTS)&
    SYSCTL_SYSPLLSTS_LOCKS;

    while ((pllLockStatus!= 1U)&&(TIMEOUT!= 0U)

    pllLockStatus = HWREGH (CLKCFG_BASE + SYSCTL_O_SYSPLLSTS)&
    SYSCTL_SYSPLLSTS_LOCKS;
    超时--;
    }
    EDIS;

    //
    //使用 DCC 检查 PLL 频率
    //
    状态= SYSCTL_isPLLValid (
    (CONFIG & SYSCTL_DCC_BASE_M)、
    (CONFIG & SYSCTL_OSCSRC_M)、
    (Config &(SYSCTL_IMULT_M | SYSCTL_ODIV_M |
    SYSCTL_REFDIV_M));

    }
    设计

    //
    //由于乘法器、因此不需要 Re 锁定
    //未更新
    //
    状态= true;
    }
    }
    否则 if ((CONFIG & SYSCTL_PLL_CONFIG_M)== SYSCTL_PLL_DISABLE)

    //
    //在配置中禁用 PLL 时关闭 PLL
    //
    EALLOW;
    HWREGH (CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1)&=
    ~SYSCTL_SYSPLLCTL1_PLLEN;
    EDIS;

    //
    // PLL 被旁路且不使用
    // Status 被更新为 true 以允许稍后配置分频器
    //
    状态= true;
    }
    设计

    //
    //空
    //
    }

    //
    //如果 PLL 锁定成功、配置分频器
    //或者如果 PLL 被绕过、则仅配置分频器
    //
    if (status)

    //
    //设置分频器以产生较慢的输出频率以限制电流
    //增加。
    //
    divSel =(uint16_t)(CONFIG & SYSCTL_SYSDIV_M)>> SYSCTL_SYSDIV_S;

    如果(divSel == 126U)

    SysCtl_setPLLSysClk (divSel);
    }
    设计

    SysCtl_setPLLSysClk (divSel + 2U);
    }

    //
    //仅当启用了 PLL 使用时才从 SYSPLL 提供系统时钟
    //
    if (((CONFIG & SYSCTL_PLL_CONFIG_M)== SYSCTL_PLL_ENABLE)

    //
    //启用 PLLSYSCLK 是从系统 PLL 时钟输入的
    //
    EALLOW;
    HWREGH (CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1)|=
    SYSCTL_SYSPLLCTL1_PLLCLKEN;
    EDIS;

    }

    //
    //~200 PLLSYSCLK 延迟以使稳压器达到稳定
    //在增加整个系统时钟频率之前。
    //
    SYSCTL_DELAY (40U);

    //
    //将分频器设置为 user 值
    //
    SysCtl_setPLLSysClk (divSel);
    }
    设计

    ESTOP0;//如果频率超出范围、请停止此处。
    }
    }

    退货(状态);
    }

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

    尊敬的 Ashan:  

    我们会查看一下、 第二天前给您回复。

    此致、

    Charles

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

    谢谢 Charles、

    此致、

    Ashan

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

    Ashan:

    您是否使用 XTAL 或 INTOSC 作为 DCAN 内核内的时钟源?

    谢谢。此致、

    Charles

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

    Charles

    我将 XTAL 用于该项目 DCAN 闪存内核

    谢谢。此致、

    Ashan

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

    尊敬的 Ashan:

    如果使用 XTAL、则这是该项目的正确时钟。 您是否可以为此器件运行仿真 DCAN 引导模式、然后尝试发送内核、接着发送应用?

     C2000微控制器的 CAN 闪存编程 应用手册中列出了仿真引导模式的步骤。

    谢谢。此致、

    Charles

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

    尊敬的 Charles:

    我尝试了 EMU_BOOT_ram 仿真模式、但问题仍然存在  

    谢谢。此致、

    Ashan

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

    尊敬的 Charles:

    是否有其他方法可以解决此问题? 通过使用我的 ESP32通过 CAN 总线发送 hex 文件、我能够在 RAM 中运行 DCAN 闪存 Kernal 程序。 我还收到了2个测试 CAN 堆栈、这有助于我确认内核已成功开始在 RAM 中运行。 然而,当我发送应用程序(闪烁应用程序)在同一过程中,我不能运行它。

    谢谢。此致、

    Ashan

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

    尊敬的 Ashan:

    发送应用时、 内核是否期望应用以100kbps 或1Mbps 的速率进入? 在 DCAN 闪存编程器示例项目中、bootloader_can_timing.h 文件是否显示  CAN_CALC_BITRATE、CAN_CALC_CANCLK 和 CAN_CALC_BITTIME 的值? 这些值设置为什么?

    >然后我以100kbps 的速率在每个堆栈之间以每堆栈2个字节的延迟传输 dcan 闪存内核文件。 完成内核传输后、代码延迟5秒、然后开始以1Mbps 的速率(每个堆栈8个字节)传输应用十六进制文件、每个堆栈之间有10ms 的延迟。

    根据本线程前面所述、如果使用 ESP32以1Mbps 的速率进行传输、您可能需要设置 bootloader_can_timing.h 值以用于1Mbps。  flash_kernel_ex5_dcan_flash_kernel.c 文件顶部有一个注释、提供了1Mbps CAN 位时序的示例。

    谢谢。此致、

    Charles

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

    尊敬的 Charles:

    感谢您的友好帮助、这有助于我解决这个问题。 此外、主要问题是由于"flash_kernal_ex5_boot.c"文件(即0x400)中分配了"Buffer size"变量的大小、因此 RAM 中发生了存储器溢出。 我必须将其更改为0x300才能解决该问题。 此外、位时序可以通过你提到的给定示例值来更改。

    谢谢。此致、

    Ashan

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

    尊敬的 Ashan:

    我也在做类似的事情,只是 我无法使用 CAN 引导模式更新内核我使用相同的100kbs 和2帧一次我无法接收2 CAN 帧你能帮我解决这个问题吗?

    如果可能,我们可以进行短的个人聊天。

    提前感谢。

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

    尊敬的 Prasath:

    您愿意如何发送 CAN 帧? 您使用什么器件来实现该目的?

    谢谢。此致、

    Ashan

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

    尊敬的 Ashan:

    感谢您的更新。 我使用 USB 转 CAN 转换器、并在 Python 脚本中创建了两个数组、一个用于内核、一个用于应用。 对于内核、我将以100kbps 的速率发送2个字节和10ms 的延迟。 对于 LED 应用、我将以1Mbps 的速率以10ms 的延迟发送8个字节。

    我尝试了使用 JTAG 来刷写内核。 之后、我可以在 RX 缓冲区中读取我正在通过 CAN 发送的任何内容。 但是、在接收到 LED 应用的最后一个帧后、将出现紧急停止。

    谢谢!
    Hariprasath

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

    尊敬的 Prasath:

    将 buffer_size 变量定义为0x300 (下图中所示)。

    bootloader_can_timing.h 文件中的值应如下所示、

    此外、当您使用100kbps 发送内核时、您不需要 CAN 帧之间的延迟。 但是、当您以1Mbps 的速率发送应用时、请使用100ms 的延迟、而不是10ms。

    谢谢。此致、

    Ashan

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

    尊敬的 Ashan:

    非常感谢。 我有一个疑问。 您为何考虑缓冲区大小为0x300? 我正在使用 F2800157 Launchpad、其缓冲区大小为0x20。 这就是我问的原因。

    谢谢。此致  

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

    尊敬的 Prasath:

    我使用了 F280039c。 它在运行原始代码时出现内存溢出、将缓冲区大小分配为0x400。 因此、我必须将其更改为0x300才能正常运行该程序。

    谢谢。此致、

    Ashan

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

    尊敬的 Ashan:

    我通过 JTAG 和应用程序刷写了内核通过 CAN 它工作,但我无法使用 CAN 引导模式刷写内核和应用程序,你怎么闪存内核和应用程序?

    谢谢

    Hariprasath