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.

[参考译文] LAUNCHXL-F280039C:SCI 串行编程器无法正常工作

Guru**** 2448320 points
Other Parts Discussed in Thread: C2000WARE, LAUNCHXL-F280039C

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1514521/launchxl-f280039c-sci-serial-programmer-not-working

器件型号:LAUNCHXL-F280039C
主题中讨论的其他器件:C2000WARE

工具/软件:

好的一天、  

我正在联系以了解是否有人可以 帮助我确定我的固件更新无法正常工作的原因。  

1 — 在 C:\ti\C2000Ware_5_04_00_00\driverlib\f28003x\examples\flash 文件夹中、我构建了 flash_kernel_ex3_sci_flash_kernel、并将其刷写到 BANK0_LDFU 和 BANK1_LDFU 构建配置。  

2 — 我修改了  C:\ti\C2000Ware_5_04_00_00\driverlib\f28004x\examples\flash 中的 flashapi_ex5_lfu_no_reset 工程、以在 f28003x LAUNCHXL 板上工作。 有 2 个构建、一个用于 BANK0、另一个用于 BANK1。

所做的修改包括:  

将工程名称更改为“flashapi_ex5_lfu_no_reset_F200839C"。“。

在“project properties“下、我使 f28003x 板的所有属性都与 f28004x 相同、但我更改了变量的路径:

C2000 钳位器:

C2000 链接器:

在 C2000 编译器下、我添加了预定义符号_LAUNCXL_F280039C、以便我可以为 LED 和 SCI TX 和 RX 使用正确的引脚 (LED 为 20 22、SCI 为 28 和 29)。

然后、我将这两个项目刷写到电路板中。 所有闪存均已设置为仅擦除必要的设置:

必须修改 Bank0 构建和 Bank1 构建的 cmd 文件、以便与 F280039C 配合使用、但地址相似。  

然后、我构建了这两个配置并刷写到电路板中。  

3 — 我随后使用  flash_kernel_ex3_sci_flash_kernel 创建文本输出文件。 我将其构建到 CPU1_RAM 配置中。 我将该文件放置在与串行编程器相同的文件夹中、位置为 C:\ti\C2000Ware_5_04_00_00\utilities\flash_programmers\serial_flash_programmer

4 — 我然后从修改后的  flashapi_ex5_lfu_no_reset 编译版本之一复制了该文本文件、并将其粘贴到与串行编程器相同的文件夹中。  

5 — 我打开了命令提示符,并将其定向到串行编程器目录,路径为 C:\ti\C2000Ware_5_04_00_00\utilities\flash_programmers\serial_flash_programmer。

6 — 然后输入 serial_flash_programr.exe -d f28003x -k flash_kernel_ex3_sci_flash_kernel.txt -a flashapi_ex5_lfu_no_reset_F200839C.txt -b 9600 -p COM8 -v 并按 ENTER 键。

我获得了以下输出:

有人可以帮助我解决可能出现的问题吗? 或有任何技巧试图使其正常运行?

谢谢、

Scott

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

    您好、

    我们的闪存内核 SME 是 OOO、我们将回到星期一。 请预计响应会延迟。

    此致、

    Rajeshwary

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

    您好、Scott:

    您期望的行为是什么? 是否要通过 SCI 引导并将内核加载到 RAM、然后执行固件升级? 或者、您要引导至闪存(LFU 工程的 Bank0 或 Bank1 构建)并执行固件升级吗? 使用后一种选项时、应该使用 serail_flash_programr_appIn.exe、这样主机就不会尝试发送基于 RAM 的内核。 仅当您使用 SCI 引导模式时、才需要发送基于 RAM 的内核。

    您是否查看过 本指南? 该文档介绍了工程的设置以及应该如何运行。

    根据主机编程器的输出、我怀疑您的 SCI 配置中存在 GPIO 不匹配问题。  

    此致、

    Skyler

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

    您好、Skyler、  

    我正在尝试将内核加载到 RAM、然后 使用 JTAG 连接执行固件升级。

    我看了一下指南、特别是第 6.2 节。 我使用 LAUNCHXL-F280039C、而非 F28004x 控制卡、但假设其工作原理是相同的。  

    我将仔细检查 SCI GPIO。

    若要确认、需要将开关 3 (S3) GPIO 24 设置为“0",“,需要、需要将 GPIO 32 设置为“1",“,以便、以便始终执行 SCI 引导?

    谢谢、  

    Scott

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

    您好、Scott:

    我正在尝试将内核加载到 RAM、然后 使用 JTAG 连接执行固件升级。

    您能在这里澄清一下吗? 如何将内核加载到 RAM? 引导 ROM 吗?  此工程展示了如何通过 SCI 执行实时固件升级。 LFU 解决方案基于闪存、因此无需将内核加载到 RAM 中。 LFU 解决方案旨在通过以下方式使用:引导至闪存、然后通过 SCI 执行固件升级。 闪存内核用于在引导加载程序不驻留在闪存中的 SCI 引导模式下执行固件升级。  

    您能否简要介绍一下所需的实现方案? 在我最后对哪一种解决方案最适合这种情况感到困惑。  

    此致、

    Skyler

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

    您好、Skyler、

    我一直在 CPU1_RAM 构建配置中的 f28003x 闪存示例中构建闪存内核 (flash_kernel_ex3_sci_flash_kernel)、然后打开终端并发送 “ serial_flash_programr.exe -d f28003x -k flash_kernel_ex3_sci_flash_kernel.txt -a flashapi_ex5_lfu_no_reset_F200839C.txt -b 9600 -p COM8 -v“。 不确定这是否正在将闪存内核加载到 RAM。

    我正在尝试了解如何使用 SCI 执行固件更新。 目标是通过示例来更好地了解固件更新如何通过 SCI 进行。 我 从 f28004x 示例修改了 flashapi_ex5_lfu_no_reset 工程、以在 LAUNCHXL-F280039C 开发板上运行。 但是、如果有更直接的方法通过另一个示例进行简单的固件更新、我想听听。

    我想了解如何执行 具有复位和无复位的 LFU。 阅读文档后、具有复位功能的 LFU 将更简单、因此我将从此处开始。  

    我想运行应用程序、进行固件更新并切换到最新固件、同时更大限度地减少停机时间。

    谢谢、

    Scott  

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

    您好、Scott:

    感谢您的澄清!  

    我已经 CPU1_RAM 构建配置的 f28003x 闪存示例中构建闪存内核 (flash_kernel_ex3_sci_flash_kernel)、然后打开终端并发送 “ serial_flash_programr.exe -d f28003x -k flash_kernel_ex3_sci_flash_kernel.txt -a flashapi_ex5_lfu_no_reset_F200839C.txt -b 9600 -p COM8 -v“。 不确定这是否正在将闪存内核加载到 RAM。

    是的、通过 bootROM 加载内核会将内核放入 RAM 中。 本 应用手册 讨论了闪存内核以及如何使用闪存内核从 RAM 执行固件升级(图 1-1 简要说明了流程)。 这是通过 SCI 进行固件升级的更基本示例、因此这是一个很好的起点。 但是、这是与 LFU 示例中使用的方法不同的方法。 主要区别在于、内核需要通过 SCI 引导、而 LFU 解决方案需要引导至闪存、并在需要执行固件升级时分支回引导加载程序。 它们是不同的解决方案。 希望这能澄清每种解决方案的用途。

    由于您的最终目标是在不复位的情况下执行实时固件更新、我建议从具有复位功能的 LFU 开始、因为它更简单。 在这种情况下、您不必通过 SCI 将内核加载到 RAM、因为它将已经作为带复位示例的 LFU 的一部分刷写到器件中。  

    此致、

    Skyler

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

    您好、Skyler、  

    感谢您的澄清。 我必须在闪存中使用引导加载程序、而不是 RAM 来执行 LFU。

    对于具有复位功能的 LFU、对于 3 种构建配置 (BANK0_LDFU、BANK1_LDFU 和 BANK2_LDFU)、我是否必须使用 sci 闪存内核 (flash_kernel_ex3_sci_flash_kernel) 刷写 LAUNCHXL-F280039C? 这会 将闪存内核加载到闪存组的开头。

    之后、我是否可以将示例工程(即 led_ex1_blinky)加载到闪存中? 在 CCS 中构建项目并使用输出 txt 文件。  

    然后、我是否可以打开终端并发送“serial_flash_programr.exe -d f28003x -k flash_kernel_ex3_sci_flash_kernel.txt -a led_ex1_blinky.txt -b 9600 -p COMX -v“?

    在将使用终端发送的串行闪存编程器行(关于“flash_kernel_ex3_sci_flash_kernel.txt"部分“部分)部分)中、这是否是我在 CCS 中为特定闪存组构建该文本文件时创建的文本文件? 例如、如果我想使用代码对闪存组 0 进行编程、我必须构建 BANK0_LDFU 并使用在该特定构建目录中创建的文本文件?

    此外、在开发板上设置开关 3 (S3) 引脚、如下所示:

    GPIO 24 -> 0

    GPIO 32 -> 1

    这是正确的吗?  

    谢谢、  

    Scott

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

    您好、Scott:

    对于具有复位功能的 LFU、对于 3 种构建配置 (BANK0_LDFU、BANK1_LDFU 和 BANK2_LDFU)、我是否必须使用 sci 闪存内核 (flash_kernel_ex3_sci_flash_kernel) 刷写 LAUNCHXL-F280039C? 这会 将闪存内核加载到闪存组的开头。

    是的、正确。

    之后、我能否将示例工程(即 led_ex1_blinky)加载到闪存中? 在 CCS 中构建项目并使用输出 txt 文件。

    是、但确保示例工程正在使用预期的闪存组。 例如、应使用链接器文件构建组 1 示例应用程序、该文件将所有已初始化的段放置在组 1 中。

    然后我能否打开终端并发送“serial_flash_programr.exe -d f28003x -k flash_kernel_ex3_sci_flash_kernel.txt -a led_ex1_blinky.txt -b 9600 -p COMX -v“?

    是的、正确。

    在将使用终端发送的串行闪存编程器行中(关于“flash_kernel_ex3_sci_flash_kernel.txt"部分“部分)部分)、这是在 CCS 中为特定闪存组构建该文件时创建的文本文件吗? 例如、如果我想使用代码对闪存组 0 进行编程、我必须构建 BANK0_LDFU 并使用在该特定构建目录中创建的文本文件?

    是的、内核文本文件是在 CCS 中编译工程的结果。 使用 serial_flash_programmer.exe 时、会立即发送此文件(前面带有-k 选项)。 此功能用于通过 bootROM 加载基于 RAM 的内核、因此您不需要使用它。 因此、应使用 serial_flash_programmer_Appin.exe。 此-k 选项仍然是必需的(目前)、但实际上不会被发送、因为此 exe 假定基于闪存的内核已经在执行。 我们将在未来版本的 serial_flash_programmer_apppin.exe 中移除此-k 要求。

    此外、我还在开发板上设置了交换机 3 (S3) 引脚、如下所示:

    对于闪存引导模式、两个引脚都应设置为 1。 有关详细信息、请参阅 TRM 的表 4-4。

    此致、

    Skyler

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

    您好、Scott:

    您对链接器文件进行的修改是正确的、用于将 LED 闪烁存储在组 1 与组 0 中。 但是、分支地址应为 0x90000、而不是 0x90002。 一种仔细检查正在编程的内容以及在 Memory Browser 中查看内容的好方法。 完成 DFU 命令后、您应该会看到 LED 闪烁已编程到闪存组 1。 此外、如果您计划在两个闪存组的开头保留一个版本的引导加载程序、则不应将 LED 闪烁状态存储在为引导加载程序保留的闪存组 0/1 的同一区域中。 否则、如上所述、您将覆盖它。

    存储在闪存中的初始化输出段需要更新、以反映组 0 ->组 1 的变化。 存储在 RAM 中的未初始化存储器段不需要修改、但应验证引导加载程序和应用程序在运行时不共享相同的 RAM 地址空间。  

    此致、

    Skyler

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

    您好、Skyler、

    查看“Memory Browser“时、地址 0x00092000 中的数据不正确。 根据“在 C2000 MCU 上进行器件复位的实时固件更新“文档、我应该参阅 5A5A 5A5A 5A5A (START) 5B5B 5B5B (KEY)、然后是 16 位值来指示 REV。 我得到的值如下:

    当我使用 CCS 用应用程序刷写开发板时、可以在相同地址中获得相同的值。 不确定应用程序是否写入 START、KEY 和 REV 值。  

    我是否应该更改 BANK1 第 2 段中的地址值? 在闪存中为起始值、KEY 值和 REV 值留出间隙?

    另外、 BANK0 闪存的串行闪存内核 划分如下:应用闪存 (led_ex1_blinky) 是否应该与第 0 段和第 1 段的值相同?  

      BANK0_SEC1    :origin = 0x081000、length = 0x000017
      /*组 0 */
      FLASH_BANK0_SEC0 :origin = 0x08004C、length = 0x000FB4
      FLASH_BANK0_SEC1 :origin = 0x081017、长度= 0x000FE9
      FLASH_BANK0_sec2 :origin = 0x082000、length = 0x001000
      FLASH_BANK0_SEC3 :origin = 0x083000、length = 0x001000
      FLASH_BANK0_SEC4 :origin = 0x084000、length = 0x001000
      FLASH_BANK0_SEC5 :origin = 0x085000、length = 0x001000
      FLASH_BANK0_SEC6 :origin = 0x086000、length = 0x001000
      FLASH_BANK0_sec7 :origin = 0x087000、length = 0x001000
      FLASH_BANK0_SEC8 :origin = 0x088000、length = 0x001000
      FLASH_BANK0_SEC9 :origin = 0x089000、length = 0x001000
      FLASH_BANK0_SEC10:origin = 0x08A000、length = 0x001000
      FLASH_BANK0_SEC11:origin = 0x08B000、length = 0x001000
      FLASH_BANK0_SEC12:origin = 0x08C000、length = 0x001000
      FLASH_BANK0_SEC13:origin = 0x08D000、length = 0x001000
      FLASH_BANK0_SEC14:origin = 0x08E000、length = 0x001000
      FLASH_BANK0_SEC15:origin = 0x08F000、length = 0x001000

    谢谢、

    Scott

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

    您好、Scott:

    是的、应用程序链接器文件不应存储放置 START、KEY 和 REV 值的程序。 对于应用程序链接器段、无需更新存储器段。 您只需确保输出段不会映射到与内核/LFU 保留段重叠的存储器。 您可以根据需要更新存储器段、但除非将输出段映射到这些段、否则它们不会影响.out 文件。

    此致、

    Skyler

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

    您好、Skyler、  

    当我在 CCS 中构建 led_ex1_blinky 并加载到 LAUNCHXL-F280039C 开发板时、工程会在第 2 部分加载到闪存中、如下图所示、LED 会闪烁。  

    然后、我复制了闪存链接器文件并进行了修改以进行 BANK1 复制。 将起始原点更改为 0x00090000、将 FLASH_BANK1_SEC0 原点更改为 0x090002、长度= 0x000FFE。 在文件的“Sections"区域“区域中、将所有“BANK0"更“更改为 BANK1“。 然后、我为 BANK0 和 BANK1 构建两个构建配置。  

    然后、我使用 CCS 仅将 BANK0 和 BANK1 sci 串行闪存内核加载到开发板。 然后、我将 BANK0 串行闪存内核文本文件和 BANK0 Blinky 示例文本文件复制到串行 闪存编程器文件夹、并在终端中运行以下命令:“serial_flash_programr_appln.exe -d f28003x -k flash_kernel_ex3_sci_flash_kernel.txt -a led_ex1_blinky.txt -b 9600 -p COM8 -v“。 出现“Menu(菜单)“ 、按“8"选择“选择“Live DFU“、当下载完成时、按“7"选择“选择“Reset CPU1“。 指示灯不闪烁。 当我使用 CCS 查看存储器(从 sci 闪存编程器调试 Bank2_LDFU)时、存储器如下所示:

    第 3 个和第 4 个字是 F、而不是所示的数据、当我使用 CCS 对开发板进行编程时。

    如果我再次运行 BANK0 串行闪存内核和 BANK0 blinky 示例应用、并查看如下所示的存储器。 0x00082000 地址不变、但 0x00092000 地址显示 REV、START 和 KEY:

    如果我现在运行 BANK1 sci 串行闪存内核和 BANK1 闪烁示例:我在 0x00082000 和 0x00092000 地址中都获得了以下内容。

    前 4 个字显示 REV、START 和 KEY。 在将应用程序与使用 CCS 加载电路板时进行比较时、缺少应用程序的前 4 个字。  

    如果我现在返回并运行 BANK0 串行闪存内核和 BANK0 blinky 示例应用、则存储器如下所示:

    我可以在 BANK0 和 BANK1 之间来回刷写、REV 似乎正确递减。 但是、应用程序的前 4 个字缺失。 我不确定必须更改闪存链接器文件中的内容才能解决此问题。 我将.text 移到了 SEC3、SEC4 和 SEC5 中、而不是 sec2、SEC3 和 SEC4 中、但是 LED 不会闪烁。  

    当我在第 3 部分启动.text 文件时、应用程序的前 4 个字是正确的、内容为 0x00083000 或 0x00093000、并且两个组的 REV、START 和 KEY 都位于 0x00082000 和 0x00092000、但 LED 不闪烁。  

    您能指导我必须对闪存链接器文件进行哪些更改才能防止这种情况发生吗? 还是我还需要做些什么? 我始终将 GPIO24 和 GPIO32 引脚设置为“1"。“。

    是否 需要更改工程属性中的任何内容? 在线研讨会链接器中找到? 是否需要启用 C2000 Hex Utility?

    谢谢、  

    Scott

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

    您好、Scott:

    示例 LED 闪烁的前几个字几乎总是 codestart 输出段。 此段通常包含分支指令并映射到 BEGIN MEMORY 段。 我怀疑这个内容会被覆盖、因为您将 led_blinky 工程的 begin 部分放置在 0x90000。 引导加载程序的开始部分可能也是 0x90000、因此这里存在一些重叠。 您能否发送链接器文件进行验证?

    此致、

    Skyler

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

    您好、Scott:

    似乎您仍会将一些输出节分配给闪存区域、这些区域保留给内核和 LFU 解决方案所需的开始/键/修订计数器。 内核占用两个组中的大部分扇区 0 和 1、而扇区 2 的开头 (0x82000 和 0x92000) 保留用于起始/键/修订版本值。 需要修改这些应用程序的链接器文件、以便输出段存储在扇区 2 及更高的非保留区域中。 您可以参阅 flashapi_ex3_live_firmware_update 工程 (C2000Ware_xx_xx_xx\driverlib\f28004x\examples\flash) 中包含的链接器文件。

    此致、

    Skyler

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

    您好、Skyler、  

    我对闪存链接器文件进行了一些修改、用于对闪存进行编程、而不是写入 START/KEY/Rev 但是、 为了连续使用串行闪存编程器 2 次、我必须使用 CCS 将串行闪存内核刷写到 Bank2 中。  

    我只是尝试将应用程序代码刷写到 Bank0 和 Bank1 中。  

    当我使用 CCS 将内核编程到组 0、然后根据 C2000 MCU 上具有器件复位的实时固件更新中的说明将组 0 的内核和应用程序编程到组 1 时、LED 不会闪烁、当我查看存储器时、地址 0x92000 如下所示。 无开始、密钥或修订  

    我还必须将内核编程到闪存组 1、将应用程序编程到闪存组 0、使 LED 闪烁。 不过、START、KEY 和 rev 填充在地址 0x82000 中、而不填充地址 0x92000 中。  如果我尝试对闪存组 1 执行 LFU(闪存组 1 的内核文本文件和闪存组 1 的应用程序文本文件)、编程器会停在这里。 它无法执行自动波特率。 过去、我想说的一种方法是使用 CCS 构建并刷写电路板、其中包含我没有计划使用的 Bank2 串行闪存内核。  

    我使用 CCS 用 Bank2 的串行闪存内核刷写电路板后、可以使用终端中的串行闪存编程器刷写 BANK1、LED 将闪烁。 当我尝试刷写 BANK0(使用 BANK0 的串行闪存内核文本文件和 BANK0 的应用文本文件)时、我会收到相同的消息、无法执行自动波特率。 如果我随后使用 CCS 将串行闪存内核刷写到 Bank2 并在终端中重试、则会正常工作、Bank0 的固件会按预期闪烁。

    关于 C280049C 示例、只有 2 个闪存组、但 F280039C 具有 3 个闪存组。 F280039C 是否要求代码位于所有 3 个闪存存储体(即首先闪存存储体 0、然后是闪存存储体 1、然后是闪存存储体 2 等)中? 即使我只需要 2 个不同的应用文件、也必须使用所有 3 个闪存存储体?

    谢谢、  

    Scott

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

    您好、Scott:

    当我使用 CCS 将内核编程到 闪存组 0、然后根据 C2000 MCU 通过器件复位进行实时固件更新中的说明将闪存组 0 的内核和应用程序编程到闪存组 1 时、LED 不会闪烁、当我查看存储器时、地址 0x92000 如下图所示。 无开始、密钥或修订 [/报价]

    您正在使用 LDFU 命令加载气缸组 1 应用程序、对吗? 您是否在串行主机编程器中看到任何错误输出? 成功完成 LDFU 命令后、会 对 START、KEY 和 REV 字段进行编程、因此应对它们进行编程。 复位后、LED 不会闪烁、因为组选择逻辑不会检测组 1 中的任何现有固件(因为没有对 start、key 和 rev 字段进行编程)。

    我还必须将内核编程到闪存组 1、将应用程序编程到闪存组 0、以便 LED 闪烁。 不过、START、KEY 和 rev 填充在地址 0x82000 中、而不填充地址 0x92000 中。  如果我尝试对闪存组 1 执行 LFU(闪存组 1 的内核文本文件和闪存组 1 的应用程序文本文件)、编程器会停在这里。 它无法执行自动波特率。 过去、我想说的一种方法是使用 CCS 构建并刷写电路板、其中包含我没有计划使用的 Bank2 串行闪存内核。  [/报价]

    加载组 1 内核和组 0 应用程序后发送此 LFU 命令时、LED 是否闪烁? 听起来您的内核或应用中的 SCI 配置可能存在一些问题。 您能仔细检查一下吗?

    关于 C280049C 示例、只有 2 个闪存存储体、但 F280039C 具有 3 个闪存存储体。 F280039C 是否要求代码位于所有 3 个闪存存储体(即首先闪存存储体 0、然后是闪存存储体 1、然后是闪存存储体 2 等)中? 即使我只需要 2 个不同的应用文件、我也必须使用所有 3 个闪存库?
    [/quote]

    否、您不必使用全部三个闪存组。  

    此致、

    Skyler

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

    您好、Skyler、  

    是的、我正在使用 LDFU 命令将应用程序加载到 BANK1。 首先使用 CCS 加载 BANK0 的串行闪存内核、然后打开终端并发送“serial_flash_programr_appln.exe -d f28003x -k flash_kernel_ex3_sci_flash_kernel.txt -a led_ex1_blinky.txt -b 9600 -p COM8 -v“。  flash_kernel_ex3_sci_flash_kernel.txt 是通过构建 BANK0 串行闪存内核创建的文本文件。  led_ex1_blinky.txt 是 BANK1 的应用固件。 通过终端加载应用程序时没有出现错误。 当我查看存储器时、应用程序被编程到 BANK1 闪存中、而不包含 START、KEY 或 REV、但 START、KEY 和 REV 在 BANK2 闪存中从地址 0xA2000 开始进行编程。  

    是的、如果我在加载 BANK0 内核和 BANK1 应用后加载 BANK1 内核和 BANK0 应用、则 LED 将闪烁。 我没有修改内核、直接取自 F280039 示例的 TI 串行闪存内核。  我 在应用程序中没有为 SCI 配置任何配置。 应用只是使一个 LED 闪烁。 未配置/初始化 SCI。 是执行 LFU 吗? 如果使用 LFU 将应用程序编程到闪存、则是否所有应用程序都需要配置 SCI?

    问题:

    应用程序代码中是否需要包含 FlashAPI? 我注意到 F280049 示例中使用了该文件“F021_API_F28004x_FPU32.lib"。“。  

    在此注意事项中、是否需要在应用程序属性中配置与编译器、链接器或任何其他设置相关的任何内容?

    谢谢、

    Scott

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

    您好、Scott:

    应用程序代码中是否需要使用 FlashAPI? 我注意到 F280049 示例中使用了该文件“F021_API_F28004x_FPU32.lib"。“。  [/报价]

    否、除非您的应用对闪存进行编程、否则不需要执行该操作。

    当我查看存储器时、应用程序被编程到 BANK1 闪存中、没有 START、KEY 或 REV、但 START、KEY 和 REV 在 BANK2 闪存中从 0xA2000 的地址开始进行编程。  [/报价]

    我浏览了您基于实现的 f28003x flash_kernel_ex3_sci_kernel 工程的源代码、看起来您需要对 flash_kernel_ex3_ldfu.c 进行一些更改以解决此行为。  

        //
        // For the BANK0 configuration, set-up to erase sectors 2-15 of Bank with highest revision
        // set the address of the 'START' value to B1_START_ADD
        //
        #ifdef BANK0
    
            if(BtwoRev >= BoneRev)
            {
                //
                // beginAddress is set to the index that corresponds to the start address
                // of sector 2, bank 2
                //
                beginAddress = 34; //need to be set according to revision number
    
                //
                // endAddress is set to the index that corresponds to the start address
                // of sector 15, bank 2
                //
                endAddress = 47;
    
                //
                // startAdd is set to the address specified by B2_START_ADD
                //
                startAdd = B2_START_ADD;
            }

    您可以看到、当没有对任何组进行任何修订计数器编程时、默认设置为闪存组 0 作为密钥、开始和修订版编程的目标。 您可以通过更新 if 语句来修改此项。 必须在第 805 行进行类似的更改:

            //
            // For the BANK0 configuration, the destination address cannot be less
            // than B1_RESERVED or B2_RESERVED. This is to prevent overwriting of the flash kernel
            //
            #ifdef BANK0
    
            if(BtwoRev >= BoneRev)
            {
                //
                // Check if the destination address is less than B2_RESERVED
                //
                if((BlockHeader.DestAddr < (uint32_t)B2_RESERVED) && (BlockHeader.DestAddr >= (uint32_t)B2_START_ADD))
                {
                    //
                    // Loop Forever. In the terminal of the Serial Flash Programmer,
                    // new bytes will stop showing
                    //
                    while(1){};
                }
            }

    与第 1147 行相同:

        //
        // For the BANK0 configuration, adjust the value of the higher revision bank,
        // store the value in 'BUFF', and set the address of where the 'KEY' and
        // revision values need to be written to
        //
        #ifdef BANK0
    
        if(BtwoRev >= BoneRev)
        {
            //
            //
            // decrement bank 2's revision value by 1
            BtwoRev = BtwoRev - 1;
    
    
            //
            // Store the bottom half of bank 2's revison value in 'BUFF'
            //
            BUFF[2] = (uint16)BtwoRev;
    
            //
            // Store the upper half of bank 2's revision value in 'BUFF'
            //
            BUFF[3] = (uint16)(BtwoRev >> 16);
    
            //
            // Set the write address to the address specified by B1_KEY_ADD
            //
            u32Index = B2_KEY_ADD;
        }

    一个简单的开关将闪存组 1 设置为 BANK0_LDFU 内核的默认值、将闪存组 0 设置为 BANK1_LDFU 内核的默认值、这应该会解决此问题。 您还应删除可能对闪存组 2 进行编程的任何逻辑、您提到的闪存组永远不会成为固件升级的目标。

    SCI 未配置/初始化。 是执行 LFU 吗? 如果使用 LFU 将应用程序编程到闪存、则是否所有应用程序都需要配置 SCI?
    [/quote]

    是的、LFU 应用中需要 SCI、因此应用程序可以识别来自主机的 LDFU 命令并分支回引导加载程序以执行固件升级。 flashapi_ex3_live_firmware_update 示例配置了 SCI 以用于此目的。 如 应用手册中所述、这将是与 LFU 实现兼容的简单应用的最佳参考。  

    此致、

    Skyler

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

    您好、Skyler、  

    感谢您提供信息并回答我的问题。  

    我 将 flashapi_ex3_live_firmware_update 配置为使用 LAUNCHXL-F280039C 开发板、而不是 F28004x、我有一个有关自动波特率的问题。 当我按照 C2000 MCU 上有器件复位的实时固件更新示例第 6.2 节第 6 步中的步骤操作时、我应该会在复位电路板时看到 LED 闪烁。 指示灯不闪烁。 autobaud 是一个阻塞函数、那么如果 main() 中的 autobaud 阻止代码运行、那么应用程序如何在电路板复位后运行? 即使我使用 CCS 用代码刷写开发板、如果 autobaud 留在 main () 中、它也不会闪烁。

    此代码位于 F28004x 的 flashapi_ex3_live_firmware_update 示例的第 411 行。

        // Perform an autobaud lock.
        // SCI expects an 'a' or 'A' to lock the baud rate.
        //
        SCI_lockAutobaud(SCIA_BASE);
    
        //
        // Store the character received in order to echo back
        //
        uint16_t byteData = SCI_readCharBlockingFIFO(SCIA_BASE);
    
        //
        // Echo back to the host
        //
        SCI_writeCharBlockingFIFO(SCIA_BASE, byteData);

    谢谢、  

    Scott

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

    您好、Scott:

    LED 将在 CPU 计时器 ISR 内切换。 因此、即使自动波特率功能阻塞、计时器也会中断。 您能否验证此 CPU 计时器中断正在运行? 工程中映射到 LED 的 GPIO 与硬件可能不匹配。

    此致、

    Skyler

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

    您好、Skyler、  

    感谢您的澄清。 它现在按预期运行、我唯一剩下的事情是对 sci 闪存内核进行一些小修改、以便 将 REV、START 和 KEY 写入正确的闪存组。 有时、它会对 REV、START 和 KEY 进行编程到 BANK2、并且在 BANK0 或 BANK1 中对应用进行编程。   

    将 LFU 代码写入闪存后、会自动将 CPU 复位、另一个闪存组代码开始运行。  

    在  flashapi_ex3_live_firmware_update 示例中、该代码以自动波特率被阻止、并且 CPU 计时器 ISR 会切换 LED 的开关状态。 那么、如果 应用  仅在 main while 循环中使用代码、如何执行自动波特率呢? 例如、如果我想使 LED 在 while 循环中闪烁、但没有中断、那么如何在不阻塞代码的情况下执行自动波特率?  

    谢谢、  

    Scott  

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

    您好、Scott:

    如果要执行自动波特率并在中断之外使 LED 闪烁、则必须修改此示例。 您必须确定某种类型的启动序列、以保证自动波特率将在某个时间点完成。 否则、您说自动波特率将无限期阻塞是正确的。 您还可以对波特率进行硬编码并绕过自动波特率、而改用其他握手方法。 您是否有特殊原因不想使用中断?

    此致、
    Skyler

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

    您好、Skyler、  

    不、我没有理由不想使用中断。 想想我将为项目编写的应用程序代码、这些代码将在 while 循环和多个函数中包含代码。 因为闪烁的 LED 工作正常。 我只是想知道一些为我的代码执行自动波特率 的方法、在这种方法中、除了闪烁的 LED 之外、发生了更多的事情。

    谢谢、  

    Scott

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

    您好、Scott:

    我懂了。 您是否对当前实施有任何疑问/顾虑? 如果没有、我将关闭该线程。 如果您有更多问题、欢迎在将来重新打开或发表新主题!

    此致、

    Skyler

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

    您好、Skyler、  

    我不再有任何疑问或顾虑。 感谢您的帮助。 我更好地了解实时固件更新 及其实施方法。

    谢谢、  

    Scott

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

    您好、Scott:

    很棒、乐于助人!

    -斯凯勒