ZHCUCY3 April 2025 TMS320F2800132 , TMS320F2800133 , TMS320F2800135 , TMS320F2800137 , TMS320F2800152-Q1 , TMS320F2800153-Q1 , TMS320F2800154-Q1 , TMS320F2800155 , TMS320F2800155-Q1 , TMS320F2800156-Q1 , TMS320F2800157 , TMS320F2800157-Q1 , TMS320F280021 , TMS320F280023 , TMS320F280023C , TMS320F280025 , TMS320F280025C , TMS320F280034 , TMS320F280036-Q1 , TMS320F280036C-Q1 , TMS320F280037 , TMS320F280037C , TMS320F280038-Q1 , TMS320F280038C-Q1 , TMS320F280039 , TMS320F280039C , TMS320F280040-Q1 , TMS320F280040C-Q1 , TMS320F280041 , TMS320F280041C , TMS320F280045 , TMS320F280048-Q1 , TMS320F280048C-Q1 , TMS320F280049 , TMS320F280049C , TMS320F28076 , TMS320F28374D , TMS320F28374S , TMS320F28375D , TMS320F28375S , TMS320F28376D , TMS320F28376S , TMS320F28377D , TMS320F28377S , TMS320F28378D , TMS320F28378S , TMS320F28379D , TMS320F28379S , TMS320F28384D , TMS320F28384S , TMS320F28386D , TMS320F28386S , TMS320F28388D , TMS320F28388S , TMS320F28P550SG , TMS320F28P550SJ , TMS320F28P559SG-Q1 , TMS320F28P559SJ-Q1 , TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1
问题: 如何修改闪存内核以便从闪存(而非 RAM)运行?
回答:在多组器件上,用户可以在闪存中实现自定义引导加载程序,以便直接将应用程序代码加载到其他闪存组中。在单组器件上,闪存中的自定义引导加载程序可以在同一闪存组内的单个扇区上执行固件升级,但闪存 API 必须从 RAM 执行。
使用自定义引导加载程序可在引导流中为用户提供更大的灵活性,允许使用不同的外设 GPIO 而不是仅可以访问引导 ROM 中有限的预定义 GPIO 分配集。使用自定义引导加载程序还可以有效减少引导加载过程中的步骤数,因为无需将中间闪存内核加载到 RAM 中以对闪存编程。
此外,如果固件升级过程失败,具有基于闪存的引导加载程序也可提供失效防护。引导至未升级的代码(即基于闪存的引导加载程序)可以最大限度地减少器件尝试引导至已损坏代码的几率,因为引导加载程序可以使用多种方法验证现有固件(键值、校验和等)。基于 RAM 的闪存内核也可以实现相同的功能,但在每次器件启动时加载它并不实用。
实现自定义引导加载程序的一种方法是修改 C2000Ware 中的现有闪存内核工程,以便从闪存而非 RAM 执行。这需要修改内核的连接器命令文件,后者指定在存储器中加载应用程序的位置并添加编译器要使用的预定义符号。
以下步骤用于修改 F28P55x SCI 闪存内核以便从闪存执行,但相同流程可以应用于在 C2000Ware 中有现有闪存内核工程的任何 C2000 器件。


通过通用闪存连接器命令文件,内核加载到闪存组 0(进入点在 0x80000)。如果用户希望将内核放置到不同的闪存组,请将连接器命令文件中分配给闪存组 0 的 SECTIONS 修改到目标闪存组。
此外,在连接器命令文件的 MEMORY 部分,BEGIN 也必须根据需要更新为目标闪存入口点位置 (codestart),包括闪存组原点和长度规范,以考虑入口点的 codestart 分配。
有关连接器命令文件指令的更多详细信息,请参阅 [33]。


