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.

[参考译文] TMS320F28335:双引导配置

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1439041/tms320f28335-dual-boot-configuration

器件型号:TMS320F28335

工具与软件:

尊敬的团队:

我目前将 TMS320F28335 MCU 与基于 SPI 的外部 EEPROM 配合使用。

目前、我通过 UART 接收十六进制文件帧并将其存储在 EEPROM 中、接收到所有十六进制文件数据后、我将其从 EEPROM 刷写到内部闪存、从而有效地更新固件。 这种办法运作良好。

我现在的目标是通过将 hex 文件帧直接存储在内部闪存的另一个可用扇区而不是使用外部 EEPROM 来增强此设置。 接收到所有十六进制文件数据后、我计划执行软件复位来启动新固件、基本上是实施双组固件更新。

您能否指导我完成这一过渡的实施步骤? 如果有任何相关代码示例、请您与我们分享这些示例以及有关为双组固件更新配置链接器文件的说明。

谢谢、此致、
Dipak

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

    尊敬的 Dipak:

    如果不使用 EEPROM、我相信我们的某个闪存内核实现方案将更适合您的问题。   有关示例的实现和讨论、请参阅 C2000微控制器的串行闪存编程(修订版 H)闪存内核 A。

    如果您仍想仿真 EEPROM 单元、 请参考 第2代 C2000实时 MCU 的 EEPROM 仿真中的示例实施(修订版 A)

    另请注意、由于该器件只有一个闪存泵、因此任何修改闪存的代码都必须从 RAM 运行。

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

    大家好、Alex Wasinger、

    感谢您的答复!

    我的目标是在主应用程序继续运行时、通过 UART 接收新的固件文件。 固件完全接收完毕后、我的应用程序将执行软件复位以切换到新固件。

    请注意、我为数据接收和确认设置了自定义帧格式。

    如果提供有关实施此类配置的任何指导、我将不胜感激。

    感谢您的帮助!

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

    Dipak,

    没问题、随着您的进度、可以随时打开更多线程。

    此致!

    Alex

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

    您好、Alex、

    我想知道如何设置组2的配置以进行固件更新?

    -Dipak

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

    Dipak,

    要将引导到闪存的入口点更改为闪存、您需要将分支指令编程为0x33 FFF6  、如 TMS320x2833x、TMS320x2823x 技术参考手册 的第1.1.3.3节和 TMS320F2833x、TMS320F2823x 实时微控制器数据表(修订版 Q)的表8-22所述。

    该器件只有一个闪存存储体、因此如果要在闪存中同时使用两个固件版本、然后再交换、就必须将应用编程到不同的扇区并更改入口点。 您还可以使用闪存内核直接更新固件、而无需更改入口点。

    此致!

    Alex

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

    Dipak,

    可以尝试以下几种操作:

    • 构建时更新链接器 CMD 文件以将应用存储在 FLASHF 中、而不是 FLASHD 中。 这将确保将程序写入到闪存中的正确位置
    • 验证分支地址和应用程序起始地址(开始/ codestart 段)是否相同
    • 如果要在更新后从闪存引导、请更新 BEGIN 部分以从0x33FFF6开始、这将更新 TMS320F2833x、TMS320F2823x 实时微控制器数据表(修订版 Q) 表8-22中提到的分支指令 、以指向新的固件而不是引导加载程序。

    此致!

    Alex

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

    您好、Alex、

    • 构建时更新链接器 CMD 文件以将应用存储在 FLASHF 中、而不是 FLASHD 中。 这将确保将程序写入到闪存中的正确位置
    • 回答:这是关键点、我的十六进制文件始终包含扇区 d 地址、但我将在引导加载程序代码中将扇区 d 地址替换为扇区 F、并将整个十六进制数据放入扇区 F

     

    我是否还必须更改复位矢量表?

    此致、

    Dipak

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

    Dipak,

    您如何更改代码内的引用/分支指令? 如果不更新链接器文件以使用正确的地址、则无法实现此目的。

    此致!

    Alex

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

    您好、Alex、

    我已经收到具有基地址的固件到扇区 D (0x320000)、但我正在通过更改基地址将其写入扇区 F (0x310000)上(在引导加载程序代码中成功处理此问题)

    一旦将全部十六进制数据写入扇区 F、我将为分支指令提供扇区 F 的返回地址、但代码是不起作用的。

    注意:每次我不想在链接器文件中手动更改扇区 D 和扇区 F 地址

    因此、我将生成具有扇区 D 基地址的十六进制文件

    我将处理引导加载程序代码中的活动和非活动扇区。

    此外、我还想知道是否可以在 TMS320F28335中实施 LFU?

    -Dipak

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

    Dipak,

    更改 固件的基地址也将影响分支指令、加载指令等、所有这些指令仍然指向扇区 D。这就是您的代码没有运行的原因--更新链接器文件以使用扇区 F 将确保所有这些指令是正确的。

    LFU 实现是可能的、但非常困难。

    此致!

    Alex

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

    我们可以手动更改引导加载程序代码中的分支指令、加载指令等吗?

    您能指导我如何操作吗?

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

    Dipak,

    不支持、TMS320F28335不支持与位置无关的代码。

    如果希望链接器文件保持不变、则必须覆盖扇区 D 中的应用程序  

    如果冗余很重要、引导加载程序可以在分支之前验证应用程序、如果无效、则等待通过外设进行更新。

    此致!

    Alex

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

    Alex、

    那么我对 LFU 感到困惑?

    LFU 的操作与我们在上面讨论的不同?

    此致!

    Dipak  

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

    Dipak,

    LFU 是指在系统运行时对其进行固件更新、具有通过器件复位或无需器件复位切换到新固件的机制。 C2000 MCU 在有器件复位时的实时固件更新 更详细地讨论了这方面的一个示例。

    根据我的理解(如果我错了、请更正我)、您的"闪存内核"/bootloader"必须在接收应用时独占运行 、这会将其取消 LFU 资格、因为在更新过程中旧固件不会继续运行。

    此致!

    Alex

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

    Dipak,

    我还没有收到你的回复  所以我要将这个主题标记为已解决。

    此致!

    Alex

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

    您好、Alex、

    对延迟响应深表歉意。

    我很不舒服,不能更早地回复。

    我只是想确认 LFU 链接器文件是保持不变还是不同。

    [具体而言、它会在应用程序运行时接收固件、并且一旦成功接收到固件数据、就会以与之前写入的固件相同的地址更新固件?]

    此致、
    Dipak

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

    Dipak,

    链接器文件应与您将应用编程到的存储器区域匹配。

    例如、如果我们的应用位于扇区 D 中、想用更新版本覆盖它、也可以在扇区 D 中使用相同的链接器文件。

    但是、如果更新写入到不同的存储器区域(例如扇区 F)、则必须更新链接器文件以将应用放在扇区 F 中

    C28器件不 支持 A/B 交换存储器/为不同的底层闪存单元使用相同的地址、如前所述、C2000编译器工具不支持与位置无关的代码、因此添加偏移量的编程将不起作用(请参阅 此 e2e、会询问一个类似问题)。

    此致!

    Alex