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.

[参考译文] TMS320F28069:28035定制引导加载程序

Guru**** 2589265 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/762232/tms320f28069-28035-custom-bootloader

器件型号:TMS320F28069

您好!

 我正在为28035开发定制引导加载程序。 我创建了两个不同的项目、一个用于引导加载程序、另一个用于应用程序。 我能够同时运行这两者。 引导加载程序位于扇区 A 中、而其他扇区用于闪存。 这两个应用都从闪存运行。

当我使用调试器时、我注意到引导加载程序能够跳转到主应用程序、之后主应用程序运行正常。 但当我复位电路板时、我注意到引导加载程序正在执行、但应用 程序不运行。

我尝试了其他一些方法、发现如果我使用函数指针跳转到主应用程序、它工作正常。 但我认为这不是一种正确的方法、因为它不会使堆栈和所有其他寄存器处于静止状态。  

对于引导加载程序、我使用了 controlsuit 中的闪存内核示例。

/***** 引导加载程序链接器********

第0页:
程序:origin = 0x008000,length = 0x001000 //片上 RAM (L0-L2)*/
OTP:origin = 0x3D7800,length = 0x000400 //片上 OTP */
FLASHH:origin = 0x3E8000、length = 0x004000 //片上闪存*/
// FLASHG:origin = 0x3EA000,length = 0x002000 //片上闪存*/
FLASHF:origin = 0x3EC000、length = 0x002000 //片上闪存*/
FLASHE:origin = 0x3EE000、length = 0x002000 //片上闪存*/
FLASHD:origin = 0x3F0000,length = 0x002000 //片上闪存*/
FLASHC:origin = 0x3F2000,length = 0x002000 //片上闪存*/
FLASHA:origin = 0x3F6000,length = 0x001F80 //片上闪存*/
csm_RSVD:origin = 0x3F7F80,length = 0x000076 // FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 *
begin:origin = 0x3F7FF6,length = 0x000002/* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 *
CSM_PWL:origin = 0x3F7FF8,length = 0x000008 // FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/

部分

/*分配计划领域:*/
codestart:> begin,page = 0
ramfuncs:load = FLASHA,
运行=程序、
load_start (_RamfuncsLoadStart)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
PAGE = 0
.text:> FLASHA,page = 0
InitBoot:> FLASHA,page = 0
.cinit:> FLASHA,page = 0
.pinit:> FLASHA,page = 0
.switch:> FLASHA,PAGE = 0
.reset:> FLASHA,page = 0,type = DSECT /* not used,*/

csmpasswds:>csm_PWL page = 0
csm_rsvd:>csm_RSVD page = 0

/*分配未初始化的数据段:*/
.stack:>RAMM0,page = 1.
.ebss:> DataRAM,page = 1.
.esysmem:> DataRAM,page = 1.

/***** 主应用程序链接器*********

第0页:
程序:origin = 0x008000,length = 0x001000 //片上 RAM (L0-L2)*/
OTP:origin = 0x3D7800,length = 0x000400 //片上 OTP */
FLASHH:origin = 0x3E8002、length =(0x006000 - 0x2)//片上闪存*
// FLASHG:origin = 0x3EA000,length = 0x002000 //片上闪存*/
// FLASHF:origin = 0x3EC000、length = 0x002000 //片上闪存*/
FLASHE:origin = 0x3EE000、length = 0x002000 //片上闪存*/
FLASHD:origin = 0x3F0000,length = 0x002000 //片上闪存*/
FLASHC:origin = 0x3F2000,length = 0x002000 //片上闪存*/
// FLASHA:origin = 0x3F6000,length = 0x001F80 //片上闪存*/
csm_RSVD:origin = 0x3F7F80,length = 0x000076 // FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 *
begin:origin = 0x3E8000,length = 0x000002/* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 *
CSM_PWL:origin = 0x3F7FF8,length = 0x000008 // FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/

IQTABLES:origin = 0x3FE000,length = 0x000B50 //引导 ROM 中的 IQMath 表*/
IQTABLES2:origin = 0x3FEB50,length = 0x00008C //引导 ROM 中的 IQMath 表*
IQTABLES3:origin = 0x3FEBDC,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/

BootROM:origin = 0x3FF27C,length = 0x000D44 // Boot ROM */
复位:origin = 0x3FFFC0,length = 0x000002 //引导 ROM 的部分*/
向量:origin = 0x3FFFC2,length = 0x00003E //引导 ROM 的部分*/

第1页:
BOOT_RSVD:origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/
RAMM0:origin = 0x000050、length = 0x0007B0 //片上 RAM 块 M0 *
// RAMM1:origin = 0x000400,length = 0x000400 //片上 RAM 块 M1 */
DataRAM:origin = 0x009000,length = 0x001000 //数据 RAM (L3)*/
FLASHB:origin = 0x3F4000,length = 0x002000 //片上闪存*/

CLA_CPU_MSGRAM:origin = 0x001480,length = 0x000080 /* CLA-R/W,CPU-R 消息 RAM *
CPU_CLA_MSGRAM:origin = 0x001500,length = 0x000080 // cpu-R/W,cla-R 消息 RAM *



部分

/*分配计划领域:*/
.cinit:> FLASHH,PAGE = 0
.pinit:> FLASHH,PAGE = 0
.text:> FLASHH,PAGE = 0

codestart:> begin page = 0
ramfuncs:load = FLASHD,
运行=程序、
load_start (_RamfuncsLoadStart)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
PAGE = 0

csmpasswds:>csm_PWL page = 0
csm_rsvd:>csm_RSVD page = 0

/*分配未初始化的数据段:*/
.stack:>RAMM0,page = 1.
.ebss:> DataRAM,page = 1.
.esysmem:> DataRAM,page = 1.

/*********

在引导程序代码中、

返回 SCI_Boot ();不能使用 whtout JTAG。  

但是 (*((void (*)(void)) AppEntryAddr)(); 起作用。  

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

    调试时、您会看到在执行 exitboot 例程时放入 RPC 的正确地址在 exitboot 中、位于 exitboot.asm?
    函数指针跳转是一种可接受的方法、请确保它正在调用 c_int00位置、以便 RTS 库可以初始化所有内容。

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

    是的,它正在单步执行 exitboot.asm,它可以跳转到主应用程序,但在下电上电后它不工作。
    可能是什么问题。我对函数指针不满意、因为我不知道它会在函数指针之后重置栈调用帧。

    在我的主应用程序中、.cinit 位于 FLASHH 中、也 为 FLASHH 定义了 codestart。

    .cinit:> FLASHH,PAGE = 0
    .pinit:> FLASHH,PAGE = 0
    .text:> FLASHH,PAGE = 0

    开始    :origin = 0x3E8000,length = 0x000002  

    codestart:> begin page = 0

    这是否保证它将经过 codestart.asm?

    我无法单步执行 DSP2803x_CodeStartBranch.asm。 是否有任何方法可以确保它经过 DSP2803x_CodeStartBranch.asm?

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    与引导加载程序不同、应用的 codestart 不在闪存入口点(0x3F7FF6)。
    因此、如果您引导至闪存、然后进入引导加载程序、引导加载程序跳转到0x3E8000以启动您的应用程序、则会经历 codestart。
    如果您将应用程序设置为始终从此处启动、则可以将引导加载程序中的函数指针更改为始终使用硬编码地址0x3E8000跳转到应用程序。

    此致
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 这就是我拥有的东西。 我的主应用程序的 codestart 是由编译器定义的_c_int00。 我无法单步执行_c_int00。 那么、我担心它是否会执行正确的初始化?
    我还检查了在执行引导加载程序代码时,如果返回应用程序的起始地址,则 RPC 在中添加了正确的内容。此方法仍然不能按预期工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    c_int00的源代码位于 CCS 内的编译器安装目录内。 在运行 c_int00之前、尝试(如果尚未)禁用看门狗
    当器件无法启动时、器件是否复位? 您是否确定了它最终的位置?

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

    我已经听不到您的意见了两周,因此我假设您能够解决您的问题。 如果情况并非如此,请拒绝此解决方案并回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

    此致
    Chris