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.

[参考译文] TMS320F2800137:自定义引导加载程序

Guru**** 2798555 points

Other Parts Discussed in Thread: TMS320F2800137

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1622886/tms320f2800137-custom-bootloader

器件型号: TMS320F2800137

大家好:

我正在为开发自定义引导加载程序 Texas Instruments TMS320F2800137 微控制器

目前、我创建了两个单独的应用工程:

  • App1 位于地址 0x082000

  • 应用 2 位于地址 0x090000

我的目标是实现 引导加载程序(位于 0x080000) 可以跳转到这些应用程序 (APP1 或 APP2) 中的任何一个并执行它们。

到目前为止:

  • 我能够 在应用程序各自的地址成功刷写应用程序

  • 直接从这些库运行代码 Code Composer Studio 、应用程序将正确执行。

  • 复位后、MCU 从开始执行 0x080000 、这是引导加载程序应驻留的位置。

我需要帮助的是:

  1. 写入 可以跳转到 APP1 或 APP2 的引导加载程序代码

  2. 确保 栈指针和中断向量设置正确 然后跳转到所选应用。

为了便于参考、我还附上了 APP1 的自定义链接器命令 (.cmd) 文件 存储器位置的命令。

在该器件或其他设备上实现了类似功能 C2000 非常感谢 MCU、指导或示例代码。

谢谢你。

移动数据
  /*------------------------ 闪存布局-------------------- */

  BOOT_RSVD    :origin = 0x080000、length = 0x002000 /*扇区 0 - 8KB Bootloader */

  App_SLOT_A   :origin = 0x082000、length = 0x00E000 /*扇区 1-7 = 56KB */

  /*组 1(将来的插槽 B)*/
  app_SLOT_B   :origin = 0x090000、length = 0x00E000 /* 56KB */

  校准   :origin = 0x09E000、length = 0x002000 /* last 8KB sector */

  /*------------------------ RAM ---------------- */

  RAMM0       :origin = 0x00000128、length = 0x000002D8
  RAMM1       :origin = 0x00000400、length = 0x000003F8

  RAMLS0      :origin = 0x00008000、length = 0x00002000
  RAMLS1      :origin = 0x0000A000、length = 0x00001FF8

  复位       :origin = 0x003FFFC0、length = 0x00000002
}

很重要
  codestart    :> app_slock_a

  .text       :> app_SLOT_A, align(8)
  .cinit      :> app_SLOT_A, align(8)
  .switch      :> app_SLOT_A, align(8)
  .const      :> app_SLOT_A, align(8)
  .pinit      :> app_SLOT_A, align(8)
  .init_array   :> app_slock_a, align(8)

  .reset      :> RESET、TYPE = DSECT

  .stack      :> RAMM1
  .bss       :> RAMLS0
  .bss:output   :> RAMLS0
  .data       :> RAMLS0
  .sysmem      :> RAMLS0
  .cio       :> RAMLS0

  /*不得从引导扇区加载 RAM 函数*/
  .TI.ramfunc:
   LOAD = APP_SLOT_A、
   RUN = RAMLS0、
   LOAD_START (RamfuncsLoadStart)、
   load_size (RamfuncsLoadSize)、
   LOAD_END (RamfuncsLoadEnd)、
   RUN_START (RamfuncsRunStart)、
   RUN_SIZE (RamfuncsRunSize)、
   RUN_END (RamfuncsRunEnd)、
   对齐 (8)

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

    您好:

    我指的是无复位实现的 LFU: https://www.ti.com/lit/an/spruiu9/spruiu9.pdf

    F28003x/F28P55x 器件有一个示例代码、演示了如何在应用程序版本之间进行分支(我们通常使用 LCR 生成应用程序的 codestart)、 F280013x 应该具有相同的代码。 我还会注意到栈指针由 codestartbranch 正确设置、并且中断必须由下一个应用程序重新初始化。

    此致、

    马特

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

    我们是否有一些简单的东西、例如指针函数之类的“

    typedef void (* appEntry)(void)

    void JumpToApp (uint32_t addr)
      appEntry 条目=(appEntry) addr;

      DINT;
      IER = 0
      IFR = 0

      条目 ();
    }

    “  

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

    您好:

    只要入口地址指向应用程序的 codestart、函数指针也很好用。

    此致、
    马特