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.

[参考译文] TMDSCNCD28379D:使用 USB 闪存编程器现场更新固件的流程

Guru**** 2502205 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1230420/tmdscncd28379d-flow-of-updating-firmware-in-the-field-with-usb-flash-programmer

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

目前、对于 USB 闪存编程器演示、您可以执行以下操作:

  • 在 Code Composer 中启动一个程序、
  • 在 Code Composer 中选择"CPU Reset"
  • 在存储器窗口中将存储器位置0x0D00更新为0x0C5A 以进入引导加载程序模式
  • 在 Code Composer 中选择"运行"
  • 将 USB 电缆从控制板(J8)连接到计算机
  • 按如下方式使用 USB 闪存编程器可执行文件- usb_flash_programr.exe F2837xD_usb_flash_kernels_cpu01.dat my_project.dat
    • 闪存内核加载到 RAM 中。
    • USB 上的 my_project.dat 批量传输发生在 USB 闪存内核将映像写入闪存时。
    • 写入完成后、它会跳转到所加载固件的位置并开始运行

我的问题是、在我们需要为我们的现场项目更新固件的实际场景中、这如何工作(即、没有 Code Composer、我可以重置 CPU 并在0x0D00设置引导模式)?

我正在尝试了解我们需要执行哪些步骤/更改才能在现场正常工作?

感谢你的帮助。

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

    您好!  

    共有两种引导模式: 仿真模式或独立模式。 上述步骤适用于仿真模式。  

    对于仿真模式,  在仿真器被连接的情况下,当器件被复位时,将模拟启动过程。  对于独立启动、该 过程需要  对用户可配置的 DCSM OTP (一次性可编程)寄存器进行编程。  

    对于测试/开发、您可以使用仿真模式、但如果您需要独立启动、则必须对 OTP 寄存器进行编程。

    请参阅 TRM 中的"4.2引导 ROM 寄存器"部分、以使器件引导至 USB 引导加载程序。   可通过 BOOTCTRL 寄存器自定义获取引导模式选择。 请参阅表4-8。 获取 CPU1上的模式解码。   0xD00地址对应于 EMU_BOOTCTRL 寄存器。  您可以使用 Z1_BOOTCTRL 进行独立启动。  

    注意: 如果您更改引导配置,您的更改将是永久性的。 每次引导至 USB 时。

    此致

    西达尔特

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

    感谢您提供这些信息。

    对于我们的器件、我们希望从闪存引导、但需要定期更新闪存中的固件。 因此、我想我们希望保持 BOOTCTRL 寄存器中的默认值。

    在此用例中、  通过 USB 执行闪存中固件更新的常用方法是什么?

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

    只是为了跟进此问题。 我想了解一下我们如何使用 USB 闪存编程器执行现场固件更新、固件在上电/复位时默认从闪存启动?

    如果我们要使用从闪存引导的 BOOTCTRL 寄存器中的默认设置为器件上电、我不确定是否需要执行什么操作才能使 USB 闪存编程器正常工作、因为没有为 USB 引导加载程序设置 BOOTCTRL 寄存器?  

    这是不可能的?

    我认为这是器件从闪存引导并希望通过 USB 更新闪存固件的常见用例?

    感谢你的帮助。

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

    您好、Brent:

    您可以参阅器件技术参考手册中的4.6配置获取引导选项一节。 它在第页上。 607进行下载

    本节介绍如何在不同的引导模式之间切换、以执行您提到的固件更新类型。 如果有任何其他问题、请告诉我。

    谢谢。
    罗纳克

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

    感谢您的答复。 我以前读过第4节。 我想我只是不理解某些东西。 或很多事情。  

    在生产环境中、您使用 OTP 引导 ROM 寄存器 Z1_BOOTCTRL 和 Z2_BOOTCTRL (非仿真模式)。

    在图4-6页614中、它包含以下步骤:

    1. 找出要读取的引导引脚–用户配置或出厂默认设置。
    2. 检查 Zx_BOOTCTRL 寄存器、查看值是否为0x5A。 如果值为0x5A、请执行以下步骤、否则使用默认引导引脚。
    3. 检查 Zx_BOOTCTRL 寄存器、查看引脚0是否有效。 如果是、设置引导引脚0。
    4. 检查 Zx_BOOTCTRL 寄存器、查看引脚1是否有效。 如果是、设置引导引脚1。
    5. 当两个引脚都为高电平时、您将获得引导模式3 -获取读取 OTP 引导模式值的模式。
    6. 例如、如果 OTP 设置为0x0C、您的引导模式为 USB、且您通过 USB 开始引导加载。

    在我们的器件中、用户将定期插入器件并从闪存引导。 因此、我们希望默认为闪存引导。  因此、这意味着在 OTP Zx_BOOTCTRL 寄存器中、密钥未设置为0x5A 或设置为0x5A、并且 BMODE 值是表4-8中未包含的内容。

    然后是我要通过 USB 编程器更新闪存的用例。 由于 OTP Zx_BOOTCTRL 寄存器的密钥未设置为0x5A (也可以设置为0x5A、但 BMODE 值不同于表4-8中的值)并且 BMODE 未设置为0x0C 进行 USB 引导、我该如何使用 USB 闪存编程器? 如何切换引导模式?

    您能帮助澄清一下我的误解吗?

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

    只是想跟进这一点吗?

    我的理解是否正确、即设置 OTP BOOTCTRL 寄存器后您无法更改引导模式? 无论您在 BOOTCTRL 寄存器中设置什么、都是唯一的引导方式?

    在 技术参考 第4.5节、第606页、表4-6位8-15确定了引导模式。 第16-23和24-31位用于配置引导选择引脚。

    因此、要从闪存引导、您应在 BOOTCTRL 寄存器中将位8-15设置为0xB (根据表4.8)。 我认为、  在本例中、您会将 BOOTCTRL 寄存器中的引导选择引脚保留为默认引脚、因为第4.10.6节中列出了 GPIO 引脚分配、但没有用于闪存的引脚?

    为了从 USB 引导以 使用 ROM USB 引导加载程序、我们要将 BOOTCTRL 寄存器中的位8-15设置为0xC (根据表4.8)。  对于 USB、BOOTCTRL 寄存器中的位16-23和24-31将根据 定义了 GPIO 引脚分配的第4.10.6节设置为42和43。

    同样、在我们的器件中、我们大部分时间都希望从闪存引导。  当我们要通过 USB 更新固件时、我们会希望将引导模式从闪存切换到 USB。

    我必须相信有一种切换引导模式的方法、并且我只是不了解什么是正确的?

    感谢您的任何帮助或见解。

    布伦特

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

    只是再次跟进此问题。  

    我在上面陈述的理解是否正确或我是否误解了什么?

    有趣的是、如果您查看 C2000串行闪存编程指南、您可以看到4x 器件的以下内容。

    您可以根据引导模式选择引脚将引导模式从闪存切换到 CAN。

    在37x 情况下、您拥有:

    因此、当这些引导模式选择引脚都为高电平时、您要么从闪存引导、要么处于获取 引导模式、其中 OTP BOOTCTRL 中的 BMODE 值决定了您将如何引导。 没有像在4x 器件中那样进行切换的选项?

    如果您无法切换引导模式、在本例中、当我想更新固件时从闪存切换到 USB、那么我唯一能想到的是:

    1)将在 C:\ti\c2000\C2000Ware_4_03_00_00\libraries\boot_rom\f2837xd\revB 中找到的启动代码/库包含到我们的工程中

    2) 2)默认情况下、我们将从闪存引导项目、而在我们的项目中、我们需要在启动时通过 GPIO 引脚确定是否连接了 USB。

    3)如果连接了 USB,则调用 USB_Boot.c 中的 USB_Boot()。 这将能够读取闪存内核、将其写入 RAM、跳转到其主代码、然后开始执行。

    4) 4) RAM 中的闪存内核随后会在应用程序中读取、将其写入闪存、跳转到闪存中的主代码并开始执行。  

    这样可行吗?

    是否有这方面的工作示例?

    在此用例中、您需要复制 ROM 中的 USB 启动代码、并将其放在应用闪存中、从而占用宝贵的空间。

    感谢您的任何见解或评论、

    布伦特

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

    尊敬的 Siddhart:

    我希望您能够回答我以上的问题。 我的理解是否正确、即一旦对 OTP BOOTCTRL 寄存器进行编程、您就无法切换? 具体而言、在两个引导引脚都很高的情况下 、您将获得引导模式3 -获取模式、其中您将读取 OTP 引导模式的值。 真的无法切换? 我希望我对某些东西产生误解。  

    为了切换引导模式、在我的用例中、99%的时间从闪存引导、1%从 USB 引导以更新固件、我需要在 我们的应用中加入 C:\ti\c2000\C2000Ware_4_03_00_00\libraries\boot_rom\f2837xD\revB 的引导 ROM 代码。 然后检测是否有 USB 连接在我们的代码中,并从我们的代码调用 USB_Boot ()?

    感谢您的帮助。

    布伦特

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

    答案是否、一旦设置引导模式、您就无法更改引导模式。

    要在应用程序中执行此操作、您 需要 在  C:\ti\c2000\C2000Ware_4_03_00_00\libraries\boot_rom\f2837xd\revB 处加入引导 ROM 代码/库 。 然后检测 代码中是否连接了 USB 并调用 USB_Boot ()。

    TMS320F28379D:配置 OTP BOOTCTRL 寄存器- C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1249359/tmdscncd28379d-update-blink-led-application-by-calling-usb_boot-in-application-code/4727236#4727236

    我想说的是、不幸的是、您需要将引导 ROM 代码/库包含到您的应用中、从而占用宝贵的闪存应用空间。  

    布伦特