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

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
  5. 2配置引导模式
    1. 2.1 独立引导
      1. 2.1.1 引导模式选择引脚 (BMSP)
      2. 2.1.2 引导定义表 (BOOTDEF)
      3. 2.1.3 引导 ROM OTP 配置寄存器
      4. 2.1.4 CPU2 启动流程
    2. 2.2 仿真引导
  6. 3对闪存编程
    1. 3.1 闪存 API
    2. 3.2 闪存内核
  7. 4将代码引导加载到闪存
    1. 4.1 C2000 Hex Utility
    2. 4.2 常见引导模式
      1. 4.2.1 引导至闪存
      2. 4.2.2 SCI 引导
      3. 4.2.3 CAN 引导
      4. 4.2.4 CAN-FD 引导
      5. 4.2.5 USB 引导
  8. 5常见问题解答
    1. 5.1 通过基于软件的实现施选择 BMSP GPIO
    2. 5.2 从闪存而非 RAM 运行闪存内核
    3. 5.3 在调试引导 ROM 时没有定义符号
    4. 5.4 使用片上闪存工具向 OTP 中写入值
    5. 5.5 使用闪存 API 插件向 OTP 中写入值
  9. 6总结
  10. 7参考资料

从闪存而非 RAM 运行闪存内核

问题: 如何修改闪存内核以便从闪存(而非 RAM)运行?

回答:在多组器件上,用户可以在闪存中实现自定义引导加载程序,以便直接将应用程序代码加载到其他闪存组中。在单组器件上,闪存中的自定义引导加载程序可以在同一闪存组内的单个扇区上执行固件升级,但闪存 API 必须从 RAM 执行。

注: 闪存 API 函数和调用闪存 API 的应用程序函数不得从同一组中执行。在进行数据编程和擦除时,在同一组执行闪存 API 会导致竞态条件。闪存 API 需要从 RAM 或另一个闪存组执行(如果同一核心存在另一个组)。[6]

使用自定义引导加载程序可在引导流中为用户提供更大的灵活性,允许使用不同的外设 GPIO 而不是仅可以访问引导 ROM 中有限的预定义 GPIO 分配集。使用自定义引导加载程序还可以有效减少引导加载过程中的步骤数,因为无需将中间闪存内核加载到 RAM 中以对闪存编程。

此外,如果固件升级过程失败,具有基于闪存的引导加载程序也可提供失效防护。引导至未升级的代码(即基于闪存的引导加载程序)可以最大限度地减少器件尝试引导至已损坏代码的几率,因为引导加载程序可以使用多种方法验证现有固件(键值、校验和等)。基于 RAM 的闪存内核也可以实现相同的功能,但在每次器件启动时加载它并不实用。

实现自定义引导加载程序的一种方法是修改 C2000Ware 中的现有闪存内核工程,以便从闪存而非 RAM 执行。这需要修改内核的连接器命令文件,后者指定在存储器中加载应用程序的位置并添加编译器要使用的预定义符号。

注:

以下步骤用于修改 F28P55x SCI 闪存内核以便从闪存执行,但相同流程可以应用于在 C2000Ware 中有现有闪存内核工程的任何 C2000 器件。

  1. 右键点击工程,然后选择 Add Files/Folders

     将工程文件添加到 CCS 中
    图 5-1 将工程文件添加到 CCS 中
  2. 在 C2000Ware 中导航到以下路径,并为目标器件选择通用闪存连接器命令文件。
    1. C2000Ware_X_XX_XX_XX\device_support\DEVICE_NAME\common\cmd
  3. 右键单击 RAM 连接器命令文件并选择 Exclude from Build,这样该闪存连接器命令文件将用于编译器构建。

     从编译器构建中排除 RAM 连链接器命令文件
    图 5-2 从编译器构建中排除 RAM 连链接器命令文件
    注:

    通过通用闪存连接器命令文件,内核加载到闪存组 0(进入点在 0x80000)。如果用户希望将内核放置到不同的闪存组,请将连接器命令文件中分配给闪存组 0 的 SECTIONS 修改到目标闪存组。

    此外,在连接器命令文件的 MEMORY 部分,BEGIN 也必须根据需要更新为目标闪存入口点位置 (codestart),包括闪存组原点和长度规范,以考虑入口点的 codestart 分配。

    有关连接器命令文件指令的更多详细信息,请参阅 [33]。

  4. 通过右键点击工程并导航至 Build Configurations > Manage...创建新的构建配置

     为工程创建新构建配置
    图 5-3 为工程创建新构建配置
    1. 将构建配置命名为 CPU1_FLASH 并选择从 CPU1_RAM 配置复制设置。

       创建 CPU1_FLASH 构建配置
      图 5-4 创建 CPU1_FLASH 构建配置
  5. 将有效构建配置设置为 CPU1_FLASH
  6. 在 device.c 中,时间关键型代码和闪存设置代码(称为 Ramfuncs)被复制到 RAM。此外,用于设置闪存等待状态的闪存初始化函数必须驻留在 RAM 中。由于内核正在闪存流中执行,必须定义符号 _FLASH 才能出现这些条件。
    1. 右键单击并导航至 Properties > Tools > C2000 Compiler > Predefined Symbols。定义符号 _FLASH

       添加预定义符号 _FLASH 以来初始化闪存函数
      图 5-5 添加预定义符号 _FLASH 以来初始化闪存函数
  7. 使用 CPU1_FLASH 构建配置重新构建闪存内核工程。现在,闪存内核已构建为从闪存执行并可以编程到器件闪存中。
    注: 由于内核已加载到器件中,因此必须使用 C2000Ware 中的 serial_flash_programmer_appIn.exe。可使用与常规串行闪存编程器相同的命令行参数调用此可执行文件,但不需要使用内核参数 (-k)。