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.

[参考译文] TMS320F2.8035万:引导加载程序问题

Guru**** 2583985 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/653840/tms320f28035-bootloader-problem

部件号:TMS320F2.8035万

大家好,我是来自阿根廷的费尔南多

我正在使用TMS320F2.8035万。 我有一个正常工作的程序。

现在,我正在尝试使用bootloader刷新此应用程序。

我完全按照 C2000  Tm微控制器的应用报告SPRABV4B串行闪存编程中所述的步骤操作

我编译提供的闪存内核。 我还生成了我的应用程序的sci8。

我像这样运行应用程序。

serial_flash_programmer -d F2803x -k f2803x_flash_kernel.txt -a CARGADOR.txt -p COM11


观察信号。 一切似乎都很好。 在加载闪存内核时,您可以看到由目标完成的回波。

在加载应用程序时,我只看到一些字节,这些字节应该是cheksums。

没有主机应用程序的错误消息。 但加载的应用程序n´t不起作用。

内核n´t擦除Piccolo,因为在我尝试引导加载程序之前运行的应用程序不再工作。 但新n´t没有

我不n´t从何处开始,或者我的应用程序中是否需要进行某些配置。

    此致

     费尔南多

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

    出现“Message Application AutoBaud Successful (消息应用程序AutoBaud成功)”。 但没有其他信息。 因此,加载应用程序时可能会出现问题。 可能我必须更改我的应用程序。 n´t我不知道是什么

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

    闪存内核将首先擦除闪存的内容,然后通过SCI加载闪存应用程序,并使用闪存API将其编程到闪存中。

    确保闪存应用程序完全驻留在闪存中。 无RAM内容。 确保您的闪存应用程序完全链接到闪存。

    您可以通过调试器加载内核并使用串行闪存编程器执行来开始调试。 只需注释掉串行闪存编程器中的downloadKernel()函数即可。

    希望这有所帮助。
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Sal,
    感谢您的快速响应。

    关于整个应用程序必须驻留在闪存中的问题,我有以下疑问

    在此应用程序中,我正在使用闪存API。 由于此函数必须驻留在RAM中,因此我在需要调用Flash API的所有地方使用#pragma code_section (FlashAPISaver,"ramfuncs")指令。

    在主菜单开始时,我使用

    memcpy(((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart,(unsigned Long)&RamfuncsLoadSize);

    我尝试刷新另一个我为测试PWM而制作的小程序,在此情况下引导加载程序工作正常。

    因此,这显然是我的应用程序如何关联的问题。 但我不知道如何解决这个问题

    这是我的链接器命令,也许你会看到一些错误

    内存

    第0页:/*程序存储器*/
    /*内存(RAM/FLASE/OTP)块可移至Page1以进行数据分配*/
    RAML0 :原点= 0x0.8万,长度= 0x0.08万 /*片上RAM块L0 */
    RAML1 :原点= 0x0.88万,长度= 0x0.04万 /*片上RAM块L1 */
    OTP :原点= 0x3D7800,长度= 0x0.04万 /*片上OTP */
    //FLASHG :原点= 0x3EA000,长度= 0x0.2万 /*片上闪存*/
    FLASHF :原点= 0x3EC000,长度= 0x0.2万 /*片上闪存*/
    FLASHE :原点= 0x3EE000,长度= 0x0.2万 /*片上闪存*/
    FLASHD :原点= 0x3F0000,长度= 0x0.2万 /*片上闪存*/
    //FLASHC :原点= 0x3F2000,长度= 0x0.2万 /*片上闪存*/
    //FLASHA :原点= 0x3F6000,长度= 0x001F80 /*片上闪存*/
    FLASHA :原点= 0x3F2000,长度= 0x005F80 /*片上闪存*/
    CSM_RSVD:原点= 0x3F7F80,长度= 0x0.0076万 /* FLASHA的一部分。 在使用CSM时使用所有0x0000编程。 */
    开始 :原点= 0x3F7FF6,长度= 0x0.0002万 /* FLASHA的一部分。 用于“引导至闪存”引导加载程序模式。 */
    CSM_PWL_P0:原点= 0x3F7FF8,长度= 0x0.0008万 /* FLASHA的一部分。 FLASHA */中的CSM密码位置

    IQTABLES:原点= 0x3FE000,长度= 0x000B50 /*引导ROM中的IQ数学表*/
    IQTABLES2:原点= 0x3FEB50,长度= 0x0.0008万C /*引导ROM中的IQ数学表*/
    IQTABLES3:原始= 0x3FEBDC,长度= 0x0000AA /*引导ROM中的IQ数学表*/

    ROM :原点= 0x3FF27C,长度= 0x000D44 /*启动ROM */
    重置 :原点= 0x3FFFC0,长度= 0x0.0002万 /*启动ROM的一部分*/
    引导程序 :原点= 0x3FFFC2,长度= 0x0.0003万E /*启动ROM的一部分*/

    第1页:/*数据存储器*/
    /*内存(RAM/FLASE/OTP)块可以移动到PAGE0以进行程序分配*/
    /*寄存器保留在Page1上 */
    Boot_RSVD:原始= 0x0万,长度= 0x0.005万 /* M0的一部分,引导ROM将使用此堆栈*/
    RAMM0 :原点= 0x0.005万,长度= 0x0003B0 /*片上RAM块M0 */
    RAMM1 :原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */
    RAML2 :原点= 0x008C00,长度= 0x0.04万 /*片上RAM块L2 */
    RAML3 :原点= 0x0.9万,长度= 0x0.1万 /*片上RAM块L3 */
    //FLASHB :原点= 0x3F4000,长度= 0x0.2万 /*片上闪存*/
    FLASHH :原点= 0x3E8000,长度= 0x0.2万 /*片上闪存*/
    FLASHG :原点= 0x3EA000,长度= 0x0.2万 /*片上闪存*/

    }

    /*将部分分配给内存块。
    注意:
    DSP28_CodeStartBranch.asm中的codegstart用户定义部分用于重定向代码
    引导至闪存时执行
    RAMfuncs用户定义的部分,用于存储将从闪存复制到RAM的函数
    */

    章节


    /*分配方案领域:*/
    cinit :> FLASHA 页面= 0
    。销钉 :> FLASHA 页面= 0
    文本 :> FLASHA 页面= 0
    代码启动 :>开始 页面= 0
    Ramfuns :负载= FLASHD,
    RUN = RAML0,
    load_start(_RamfuncsLoadStart),
    load_size (_RamfuncsLoadSize),
    run_start(_RamfuncsRunStart),
    页面= 0

    csmpasswds :> CSM_PWL_P0页= 0
    csm_rsvd :> CSM_RSVD页面= 0

    /*分配未初始化的数据段:*/
    堆栈 :> RAMM0 页面= 1.
    .ebss :> RAML2,填充= 0x00 页面= 1.
    esysmem :> RAML2 页面= 1.

    /*初始化部分进入Flash */
    /*要让SDFlash对这些进行编程,必须将它们分配到第0页*/
    econst :> FLASHA 页面= 0
    开关 :> FLASHA 页面= 0

    AJUSDES_RUN :> FLASHH 页面= 1.
    AJUSTES_CAL :> FLASHG 页面= 1.

    /*分配IQ数学领域:*/
    IQMath :> FLASHA 页面= 0 /*数学代码*/
    IQmathTables :> IQTABLES,PAGE = 0,TYPE = NoLoad

    /*如果调用IQNexp()或IQexp(),则取消注释以下部分
    从IQMath.lib库中执行函数,以便利用
    引导ROM中的相关IQ Math表(这可节省空间和引导ROM
    为1等待状态)。 如果此部分未取消注释,请使用IQmathTables2.
    将加载到其他存储器(SARAM,闪存等)中并将占用
    打开空间,但0等待状态是可能的。
    */
    /*
    IQmathTables2:> IQTABLES2,page =0,type = NoLoad


    IQMath.lib<IQNexpTable.obj>(IQmathTablesRam)

    }
    */
    /*如果调用IQNasin()或IQasin(),请取消对以下部分的注释
    从IQMath.lib库中执行函数,以便利用
    引导ROM中的相关IQ Math表(这可节省空间和引导ROM
    为1等待状态)。 如果此部分未取消注释,请使用IQmathTables2.
    将加载到其他存储器(SARAM,闪存等)中并将占用
    打开空间,但0等待状态是可能的。
    */
    /*
    IQmathTables3:> IQTABLES3,page =0,type = NoLoad


    IQMath.lib<IQNasinTable.obj>(IQmathTablesRam)

    }
    */

    /*.reset是编译器使用的标准部分。 它包含*/
    /* C代码的_c_int00起始地址。 /*
    /*当使用引导ROM时,此部分和CPU矢量*/
    不需要/*表。 因此,默认类型在此处设置为*/
    /* DSECT */
    重置 :>重置, 页=0,类型= DSECT
    引导程序 :>引导程序 页=0,类型= DSECT

    }


    此致
    费尔南多
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Fernando,链接器命令文件对我来说很好。 只要ramfuncts被加载到闪存中并从RAM运行,只要不直接加载东西到RAM,一切都应该正常。这似乎不是这样做的。

    我不知道现在的问题是什么。 bootloader执行回送,内核执行校验和。 所以您看到的是正确的。

    您可以通过调试器加载内核并使用串行闪存编程器执行来开始调试。 只需注释掉串行闪存编程器中的downloadKernel()函数即可。 您可以在完成加载应用程序后看到正在进行的操作,然后从内核分支到应用程序。此时设置一个断点并查看正在进行的操作。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,我将尝试按照您的建议进行调试

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Sal,
    在两个程序同时进行调试后,我意识到内核正在接收一段数据,该数据通过0指向RAM初始化,FlashApi显然返回了一个错误。

    检查此项后,我注意到链接器中有

    .ebss:> RAML2,填充= 0x00页= 1

    填充选项是问题所在

    ´s,我在内核程序中添加了一个有效闪存指示的过滤器,解决了问题

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

    很棒!

    您能´s这样的说法吗:“我在内核程序中添加了有效的闪存指示和解决的问题的过滤器”? 或者请给我举个例子。


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

    您好,Sal,

          我的意思是这样

    如果( BlockHeader.DestAddr >= 0x3E8000)&&( BlockHeader.DestAddr < 0x3F8000 )

        状态= Flash_Program(UINT16 *) BlockHeader.DestAddr,(UINT16 *)progBuf,BlockHeader.blocksize,&FlashStatus;
        IF (STATUS!= STATUS_SUCCESS)
        {
           返回;
        }
    }

    如果方向不是TMS320F2.8035万的有效方向,则不会调用Flash_Program函数

    此致

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

    谢谢!
    SAL