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.

[参考译文] F28M35H52C:从 C28引导加载程序应用程序跳转到 C28闪烁应用程序后出现未知行为。

Guru**** 2033340 points
Other Parts Discussed in Thread: UNIFLASH, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/699676/f28m35h52c-unknown-behavior-after-a-jump-made-from-c28-bootloader-application-to-c28-blinky-application

器件型号:F28M35H52C
主题中讨论的其他器件:UNIFLASHC2000WARE

大家好、

我几乎完成了为 Concerto 控制器开发自定义第二级 C28引导加载程序应用的工作。 但是、在调试一种场景时遇到了困难、在我将闪烁 c28应用程序编程到 C28的相应闪存扇区并跳转到闪烁应用程序的起始地址0x13A000后、闪烁应用程序似乎并不在从那里执行、而是在某种程度上卡在其中 从 CCS 的反汇编视图中可以看到的循环。

 

现在、如果我使用 JTAG 独立运行闪烁应用、我可以写入相同的闪存扇区、也可以运行执行完全正常的应用。 但是、当我使用引导加载程序执行程序时、我最终会遇到上述情况。  

要给出我的应用程序的要点:

我从笔记本电脑接收.hex 数据到 M3 UART1、然后通过 IPC 将该数据传递到 C28。 因此、我在验证我在 C28端接收到的内容、然后进行编程时、不会看到任何数据差异。   

我能否获得一些提示,说明在 M3引导加载程序侧或 C28引导加载程序侧可以检查或调试什么?   

我可能在这里提供的详细信息较少、但请告诉我、我还可以向我分享哪些内容。

谢谢  

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

    当您让引导加载程序仅加载不带引导加载程序的应用程序时、您是否验证了引导加载程序加载的内容与 CCS 加载的内容是否匹配? 默认情况下、十六进制实用程序会创建两个十六进制文件*。hex 和*。I01、一个用于高位字节、另一个用于低位字节。 如果您在 cmd 文件的第1页中有任何常量数据/代码、那么您将有更多的十六进制文件、*。I10和*。i11。 如果忽略这些*。i1、最有可能的代码将不起作用? 文件。

    如果下载正常、则调试 APP+bootloader 不会出现问题、您可以随时从不同的*。out 文件加载或添加调试符号、调试不会出现问题。

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

    尊敬的 Edward:

    感谢您提供这些提示。  

    到目前为止、我已经在第1页的存储器部分对齐了共享 RAM 存储器。 但我看不到任何具有*。I10或*。i11扩展名的文件? 我只能看到一个*。hex 文件。  

    这是 Blinky Application 的*。cmd 文件  

     

    /*
    //######################################################################################################################
    //文件:F28M35H52C1_c28.cmd
    //标题:F28M35H52C1器件的链接器命令文件
    //######################################################################################################################
    //$TI 发行版:F28M35x 支持库 v201 $
    //$Release Date:星期五6月7日10:51:13 CDT 2013 $
    //######################################################################################################################
    *

    /*===================================================================
    //适用于 Code Composer Studio V2.2和更高版本
    //--------------------------------------------------------
    //除了该内存链接器命令文件外,
    //将头文件链接器命令文件直接添加到工程中。
    //链接时需要标头链接器命令文件
    //将外设结构设置到内部的适当位置
    //存储器映射。
    //在中找到了头文件链接器文件 \F28M35x_headers\cmd
    //对于 BIOS 应用程序添加:F28M35x_Headers_BIOS.cmd
    //对于非 BIOS 应用程序添加:F28M35x_Headers_nonBIOS.cmd
    =================================================================================================== *

    /*定义 F28M35x 的内存块开始/长度
    PAGE 0将用于组织程序段
    第1页将用于组织数据段

    注:
    F28M35x 上的存储器块是一致的(也是相同的
    物理存储器)。
    不应该是相同的存储器区域
    同时为 PAGE 0和 PAGE 1定义。
    这样做将导致程序损坏
    和/或数据。

    可以是连续的 SARAM 存储器块或闪存扇区
    组合在一起以创建更大的存储器块。
    *

    存储器

    第0页:/*程序内存*/
    /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
    RAML0:origin = 0x008000、length = 0x001000 //片上 RAM 块 L0 */
    RAML1:origin = 0x009000,length = 0x001000 //片上 RAM 块 L1 */

    FLASHN:origin = 0x100000、length = 0x002000 //片上闪存*/
    FLASHM:origin = 0x102000、length = 0x002000 //片上闪存*/
    FLASHL:origin = 0x104000、length = 0x002000 //片上闪存*/
    FLASHK:origin = 0x106000、length = 0x002000 //片上闪存*/
    FLASHJ:origin = 0x108000、length = 0x008000 //片上闪存*/
    FLASHI:origin = 0x110000,length = 0x008000 //片上闪存*/
    FLASHH:origin = 0x118000,length = 0x008000 //片上闪存*/
    FLASHG:origin = 0x120000,length = 0x008000 //片上闪存*/
    FLASHF:origin = 0x128000、length = 0x008000 //片上闪存*/
    FLASHE:origin = 0x130000,length = 0x008000 //片上闪存*/
    FLASHD:origin = 0x138000、length = 0x002000 //片上闪存*/
    开始:origin = 0x13A000,length = 0x000002/*0x002000*/

    BootROM:origin = 0x3FEDA8,length = 0x001200 //引导 ROM */
    PIEMISHNDLR:origin = 0x3FFFBE,length = 0x000002/*部分引导 ROM *
    复位:origin = 0x3FFFC0,length = 0x000002 //引导 ROM 的部分*/
    向量:origin = 0x3FFFC2,length = 0x00003E //引导 ROM 的部分*/

    第1页:
    /*数据存储器*/
    /*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
    /*寄存器保留在第1页中*/
    BOOT_RSVD:origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/
    RAMM0:origin = 0x000050、length = 0x0003B0 //片上 RAM 块 M0 *
    RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
    RAML2:origin = 0x00A000、length = 0x001000 //片上 RAM 块 L2 */
    RAML3:origin = 0x00B000、length = 0x001000 //片上 RAM 块 L3 *
    RAMS0:origin = 0x00C000、length = 0x001000 //片上共享 RAM 块 S0 */
    RAMS1:origin = 0x00D000、length = 0x001000 //片上共享 RAM 块 S1 *
    RAMS2:origin = 0x00E000、length = 0x001000 //片上共享 RAM 块 S2 *
    RAMS3:origin = 0x00F000、length = 0x001000 //片上共享 RAM 块 S3 *
    RAMS4:origin = 0x010000,length = 0x001000 //片上共享 RAM 块 S4 */
    RAMS5:origin = 0x011000,length = 0x001000 //片上共享 RAM 块 S5 */
    RAMS6:origin = 0x012000,length = 0x001000 //片上共享 RAM 块 S6 */
    RAMS7:origin = 0x013000、length = 0x001000 //片上共享 RAM 块 S7 *

    CTOMRAM:origin = 0x03F800,length = 0x000380 // C28 to M3 Message RAM */
    MTOCRAM:origin = 0x03FC00,length = 0x000380 // M3到 C28消息 RAM */

    /*将段分配给内存块。
    注:
    DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
    闪存时执行
    ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
    *

    部分

    /*分配计划领域:*/
    .cinit:> FLASHD PAGE = 0
    .pinit:> FLASHD,page = 0
    .text:> FLASHE PAGE = 0
    codestart:> begin page = 0
    ramfuncs:load = FLASHE,
    运行= RAML0、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0

    /*使用 IPC API 驱动程序时需要以下部分定义*/
    组:> CTOMRAM,页= 1

    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX

    组:> MTOCRAM,页= 1

    GETBUFFER:TYPE = DSECT
    GETWRITEIDX:TYPE = DSECT
    PUTREADIDX:TYPE = DSECT


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

    /*初始化段进入闪存*/
    /*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
    econst:> FLASHD PAGE = 0
    .switch:> FLASHD PAGE = 0

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

    /*
    *

    [报价 USER="EK"]如果下载正常、则调试 APP+bootloader 时不会出现问题、您可以随时从不同的*。out 文件加载或添加调试符号、调试不会出现问题。

    您能澄清两点吗?  

    1.如何验证我的引导加载程序加载的内容和 CCS 加载的内容? 我是否可以使用某些工具,或者是否应该使用闪存 API 读取闪存扇区?

    2.如何在运行时随时从不同的*。out 文件中加载或添加调试符号? 您能帮我提供更多详细信息吗?

    谢谢  

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

    使用您显示的 cmd 文件*。i1? 文件不应存在。 如果在第1页移动了一些闪存段后您有一些常量数据、则会出现这种情况。 (常量数据是数据、而不是命令赞扬中指定的程序、请不要介意)。

    1.可以使用 Uniflash 进行验证、请执行验证而不是程序。 也可以使用 CCS 来实现。 在引导加载 myprog.hex 后、您需要使用 myprog.out 通过 JTAG 执行验证操作。

    2.请参阅 CCS 调试视图中的加载按钮、choces 是加载、加载(仅)符号、添加(仅)符号。 加载符号后、您可以从引导加载程序开始调试、并继续从引导加载程序跳转到应用程序、所有符号和源代码都应该可见。

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

    首先、我运行的是 Linux 主机笔记本电脑、因此 Uniflash 根本无法启动! 以下是我根据您的建议尝试做的事情!

    1.在引导加载程序应用程序中对 blinky_28.hex 进行编程后,我再次使用 CCS 工具选项将存储器保存为.hex!
    2、现在我使用 JTAG 独立加载了 blinky_28.hex、并再次将存储器保存为.hex。

    注意:两者的起始地址为0x0013000,长度一直到16000000!

    我使用差分校验器对这两者进行了比较、完全没有区别!!

    您能否确认这是否正是您希望我尝试的结果?

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

    如果 C28x 内核卡在地址0x3FF66B 中、则表明 C28x 卡在空闲模式中。 默认情况下、M3从复位状态释放 C28x 后、C28x 将执行初始化并进入空闲模式。 请查看 www.ti.com/.../spruhe8d.pdf 的 PG:580中的器件启动流程图

    C28x 等待 M3的 IPC 命令。 在 M3代码中、您是否发送 IPC 命令以引导至闪存以运行您的应用程序代码?

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

    下面是我启动调试会话的方法:

    1.我在 M3引导加载程序应用程序中注释掉引导至控制系统调用。
    2.我启动 M3调试会话、然后在运行 M3内核之前、我连接到 C28内核并加载 c28的引导加载程序应用程序。 现在我运行了
    我的 C28引导加载程序、然后运行我的 M3引导加载程序。
    3.现在、通过 C28引导加载程序对 C28闪烁应用程序进行编程后、我跳转至0x0013A000地址、其中"代码启动"闪烁
    应用程序驻留。

    现在,在上面的哪个步骤中,我应该考虑发送设备以引导流经 IPC? 因为在我跳转至地址0x0013A000之后,我不明白为什么它会再次进入空闲状态? 因此,如果在更新后包含要通过 M3中的 IPC 引导的设备,我将再次启动 c28引导加载程序,不是吗?

    请告诉我我的理解是否正确?

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

    我的方面对你到底要做什么不清楚。

    根据您之前的消息、看起来好像您正在尝试使用自定义引导加载程序在 C28x 端加载应用程序代码。 但是、您最近的消息似乎表明您只是在尝试运行 C2000Ware 中提供的 Blinky 示例代码。 因此、请澄清。

    您是否使用 JTAG (或)自定义引导加载程序对 C28x 端进行编程?

    如何对 C28x 端进行编程? C28x 端是否有自定义引导加载程序? 您是否正在尝试在 C28x 端对闪存进行编程? 如果是、是否使用自定义引导加载程序正确编程闪存?

    每当您使用 JTAG 连接到器件时、它都会执行调试器复位、这将同时复位 M3和 C28x。 这是因为 CCS 中提供了 GEL 文件。

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

    您好 、Pretham、

    我想知道如何将其保存为十六进制。 使用内存浏览器保存菜单? 在 CCS for Windows 中、我看不到另存为 heh 的选项。 二进制、COFF 和两个 TI 选项。

    使用 CCS 验证更简单。 下面是我之前提到的菜单。 请参阅加载程序...、加载符号... 和验证程序...  引导加载程序加载代码后、您应该验证程序... 并指定加载程序的*。out 文件的路径。

    Edward

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

    您好、Manoj、

    [引用 user="Manoj Santha Mohan"]我的侧边对您尝试的具体操作缺乏清晰的理解。

    很抱歉!

    在回答您的问题之前、让我尝试并通过详细介绍我为 C28引导加载程序应用程序和 C28闪烁应用程序分配的存储器边界、为您提供一些具体的问题所在。 (我将在末尾为两者附加.cmd 文件)

    a)对于我的 C28引导加载程序应用程序:我使用闪存扇区 A 和 B。在 MEMORY 内部部分和 PAGE 0下的开始部分指向中的0x13FFF0       Turn 保留"codestart"地址。 现在,C28引导 ROM 引导至该闪存地址并启动 C28引导加载程序应用程序...直到此处一切正常      如 TRM 中所示。

    b)对于我的 C28 Blinky 应用程序:我使用闪存 D 至 N 的其余闪存扇区。闪存 C 扇区用于开始部分、该部分从0x13A000开始、    长度为0x000002。 现在、在我从引导加载程序完成对该应用程序的编程后、我尝试跳转到0x13A000、这是闪烁开始的地方          驻留! 现在、这就是问题所在。 当我执行此跳转时、我希望我的应用程序通过使 LED 闪烁来执行。 但这不会发生      C28内核会进入这个空闲状态!

    [引用 user="Manoj Santha Mohan">根据您之前的消息、您会感觉自己是在尝试使用自定义引导加载程序在 C28x 端加载应用程序代码。 但是、您最近的消息似乎表明您只是在尝试运行 C2000Ware 中提供的 Blinky 示例代码。 因此、请澄清。

    因此、根据我之前的帖子、您的理解是正确的。 我尝试通过 C28自定义引导加载程序应用程序对 C28闪烁应用程序进行编程。 因此、我不会在任何情况下使用任何 C2000Ware 工具。  

    [引用 USER="Manoj Santha Mohan)]您是否使用 JTAG (或)自定义引导加载程序对 C28x 端进行编程? [/报价]

    实际上、根据故障排除场景、我将使用这两种方法。  

    因此、最初、当我通过 C28引导加载程序对闪烁应用程序进行编程并尝试进行跳转时、我会遇到上文 B 点所述的问题。 这是我尝试使用相同的.cmd 文件通过 JTAG 进行闪烁编程的时候、我看到 LED 在独立模式下是否正常闪烁、但令我惊讶的是、它确实闪烁正常!

    [引用 USER="Manoj Santha Mohan)]您如何对 C28x 端进行编程? [/报价]

    我有两个独立的引导加载程序、一个用于 M3、一个用于 C28。 M3侧处理与主机的串行通信、以接收.hex 内容并发送 ACK。 除了串行通信 M3引导加载程序、还使用共享 RAM 存储器和 IPC 中断来处理带有 C28的 IPC。  

    现在、在 C28引导加载程序侧、在我使用 IPC 接收到闪烁应用的十六进制数据后、我使用 F021库支持的闪存 API 对该十六进制内容进行编程。  

    但是、要对 M3和 C28引导加载程序应用本身进行编程、从现在起、我将通过 JTAG 端口进行编程。  

    [引用 user="Manoj Santha Mohan"]C28x 端是否有自定义引导加载程序? [/报价]

    是的、我有一个用于 M3和 C28的自定义引导加载程序、该引导加载程序驻留在闪存中并从闪存执行、闪存 API 相关函数除外。  

    [引用 user="Manoj Santha Mohan"]您是否正在尝试在 C28x 端对闪存进行编程?[/quot]

    是的、我使用 C28自定义引导加载程序的最终目标是对旨在用于 C28应用(在这种情况下为闪烁应用)的闪存扇区进行编程。

    [引用 USER="Manoj Santha Mohan)]如果是,是否使用自定义引导加载程序正确编程闪存?
    [/报价]

    我在编程时未收到任何闪存错误、因此我认为它应该已经过良好的编程。 您建议的其他方法有哪些?

    [引用 USER="Manoj Santha Mohan">每当您使用 JTAG 连接到器件时、它都会执行调试器复位、这将同时复位 M3和 C28x。 这是因为 CCS 中提供了 GEL 文件。 [/报价]

    在这种情况下、C28在独立模式下通过 JTAG 进行调试时如何闪烁应用程序! 因为它的起始地址为0x13A000,而这不是 C28引导 ROM 引导至 RITE 的位置?  

    感谢您的耐心、感谢您在这里为我提供帮助、感谢您的付出、时间和努力!  

    编辑:门户不允许我附加*。cmd、因此我将复制过、请与我一起!

    C28闪烁应用的.cmd

    /*
    //######################################################################################################################
    //文件:F28M35H52C1_c28.cmd
    //标题:F28M35H52C1器件的链接器命令文件
    //######################################################################################################################
    //$TI 发行版:F28M35x 支持库 v201 $
    //$Release Date:星期五6月7日10:51:13 CDT 2013 $
    //######################################################################################################################
    *

    /*===================================================================
    //适用于 Code Composer Studio V2.2和更高版本
    //--------------------------------------------------------
    //除了该内存链接器命令文件外,
    //将头文件链接器命令文件直接添加到工程中。
    //链接时需要标头链接器命令文件
    //将外设结构设置到内部的适当位置
    //存储器映射。
    //在中找到了头文件链接器文件 \F28M35x_headers\cmd
    //对于 BIOS 应用程序添加:F28M35x_Headers_BIOS.cmd
    //对于非 BIOS 应用程序添加:F28M35x_Headers_nonBIOS.cmd
    =================================================================================================== *

    /*定义 F28M35x 的内存块开始/长度
    PAGE 0将用于组织程序段
    第1页将用于组织数据段

    注:
    F28M35x 上的存储器块是一致的(也是相同的
    物理存储器)。
    不应该是相同的存储器区域
    同时为 PAGE 0和 PAGE 1定义。
    这样做将导致程序损坏
    和/或数据。

    可以是连续的 SARAM 存储器块或闪存扇区
    组合在一起以创建更大的存储器块。
    *

    存储器

    第0页:/*程序内存*/
    /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
    RAML0:origin = 0x008000、length = 0x001000 //片上 RAM 块 L0 */
    RAML1:origin = 0x009000,length = 0x001000 //片上 RAM 块 L1 */

    FLASHN:origin = 0x100000、length = 0x002000 //片上闪存*/
    FLASHM:origin = 0x102000、length = 0x002000 //片上闪存*/
    FLASHL:origin = 0x104000、length = 0x002000 //片上闪存*/
    FLASHK:origin = 0x106000、length = 0x002000 //片上闪存*/
    FLASHJ:origin = 0x108000、length = 0x008000 //片上闪存*/
    FLASHI:origin = 0x110000,length = 0x008000 //片上闪存*/
    FLASHH:origin = 0x118000,length = 0x008000 //片上闪存*/
    FLASHG:origin = 0x120000,length = 0x008000 //片上闪存*/
    FLASHF:origin = 0x128000、length = 0x008000 //片上闪存*/
    FLASHE:origin = 0x130000,length = 0x008000 //片上闪存*/
    FLASHD:origin = 0x138000、length = 0x002000 //片上闪存*/
    开始:origin = 0x13A000,length = 0x000002/*0x002000*/

    BootROM:origin = 0x3FEDA8,length = 0x001200 //引导 ROM */
    PIEMISHNDLR:origin = 0x3FFFBE,length = 0x000002/*部分引导 ROM *
    复位:origin = 0x3FFFC0,length = 0x000002 //引导 ROM 的部分*/
    向量:origin = 0x3FFFC2,length = 0x00003E //引导 ROM 的部分*/

    第1页:
    /*数据存储器*/
    /*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
    /*寄存器保留在第1页中*/
    BOOT_RSVD:origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/
    RAMM0:origin = 0x000050、length = 0x0003B0 //片上 RAM 块 M0 *
    RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
    RAML2:origin = 0x00A000、length = 0x001000 //片上 RAM 块 L2 */
    RAML3:origin = 0x00B000、length = 0x001000 //片上 RAM 块 L3 *
    RAMS0:origin = 0x00C000、length = 0x001000 //片上共享 RAM 块 S0 */
    RAMS1:origin = 0x00D000、length = 0x001000 //片上共享 RAM 块 S1 *
    RAMS2:origin = 0x00E000、length = 0x001000 //片上共享 RAM 块 S2 *
    RAMS3:origin = 0x00F000、length = 0x001000 //片上共享 RAM 块 S3 *
    RAMS4:origin = 0x010000,length = 0x001000 //片上共享 RAM 块 S4 */
    RAMS5:origin = 0x011000,length = 0x001000 //片上共享 RAM 块 S5 */
    RAMS6:origin = 0x012000,length = 0x001000 //片上共享 RAM 块 S6 */
    RAMS7:origin = 0x013000、length = 0x001000 //片上共享 RAM 块 S7 *

    CTOMRAM:origin = 0x03F800,length = 0x000380 // C28 to M3 Message RAM */
    MTOCRAM:origin = 0x03FC00,length = 0x000380 // M3到 C28消息 RAM */

    /*将段分配给内存块。
    注:
    DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
    闪存时执行
    ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
    *

    部分

    /*分配计划领域:*/
    .cinit:> FLASHD PAGE = 0
    .pinit:> FLASHD,page = 0
    .text:> FLASHE PAGE = 0
    codestart:> begin page = 0
    ramfuncs:load = FLASHE,
    运行= RAML0、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0

    /*使用 IPC API 驱动程序时需要以下部分定义*/
    组:> CTOMRAM,页= 1

    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX

    组:> MTOCRAM,页= 1

    GETBUFFER:TYPE = DSECT
    GETWRITEIDX:TYPE = DSECT
    PUTREADIDX:TYPE = DSECT


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

    /*初始化段进入闪存*/
    /*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
    econst:> FLASHD PAGE = 0
    .switch:> FLASHD PAGE = 0

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

    /*
    *

    C28引导加载程序应用程序的.cmd

    /*
    //######################################################################################################################
    //文件:F28M35H52C1_c28.cmd
    //标题:F28M35H52C1器件的链接器命令文件
    //######################################################################################################################
    //$TI 发行版:F28M35x 支持库 v201 $
    //$Release Date:星期五6月7日10:51:13 CDT 2013 $
    //######################################################################################################################
    *

    /*===================================================================
    //适用于 Code Composer Studio V2.2和更高版本
    //--------------------------------------------------------
    //除了该内存链接器命令文件外,
    //将头文件链接器命令文件直接添加到工程中。
    //链接时需要标头链接器命令文件
    //将外设结构设置到内部的适当位置
    //存储器映射。
    //在中找到了头文件链接器文件 \F28M35x_headers\cmd
    //对于 BIOS 应用程序添加:F28M35x_Headers_BIOS.cmd
    //对于非 BIOS 应用程序添加:F28M35x_Headers_nonBIOS.cmd
    =================================================================================================== *

    /*定义 F28M35x 的内存块开始/长度
    PAGE 0将用于组织程序段
    第1页将用于组织数据段

    注:
    F28M35x 上的存储器块是一致的(也是相同的
    物理存储器)。
    不应该是相同的存储器区域
    同时为 PAGE 0和 PAGE 1定义。
    这样做将导致程序损坏
    和/或数据。

    可以是连续的 SARAM 存储器块或闪存扇区
    组合在一起以创建更大的存储器块。
    *

    存储器

    第0页:/*程序内存*/
    /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
    RAML0:origin = 0x008000、length = 0x001000 //片上 RAM 块 L0 */
    RAML1:origin = 0x009000,length = 0x001000 //片上 RAM 块 L1 */

    开始:origin = 0x13FFF0,length = 0x000002
    FLASHA:origin = 0x13E000、length = 0x001F80 //片上闪存*/

    FPUTABLES:origin = 0x3FD258,length = 0x0006A0 //引导 ROM 中的 FPU 表*/
    IQTABLES:origin = 0x3FD8F8,length = 0x000B50 //引导 ROM 中的 IQMath 表*
    IQTABLES2:origin = 0x3FE448,length = 0x00008C //引导 ROM 中的 IQMath 表*
    IQTABLES3:origin = 0x3FE4D4,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/

    BootROM:origin = 0x3FEDA8,length = 0x001200 //引导 ROM */
    PIEMISHNDLR:origin = 0x3FFFBE,length = 0x000002/*部分引导 ROM *
    复位:origin = 0x3FFFC0,length = 0x000002 //引导 ROM 的部分*/
    向量:origin = 0x3FFFC2,length = 0x00003E //引导 ROM 的部分*/

    第1页:/*数据存储器*/
    /*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
    /*寄存器保留在第1页中*/
    BOOT_RSVD:origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/
    RAMM0:origin = 0x000050、length = 0x0003B0 //片上 RAM 块 M0 *
    RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *

    /*C28密钥寄存器内存区域*/
    DEV_EMU:origin = 0x000880,length = 0x000180 //器件仿真寄存器*/
    CSM:origin = 0x000AE0,length = 0x000020 //代码安全模块寄存器*/

    ADC1_RESULT:origin = 0x000B00,length = 0x000020 // ADC1结果寄存器*/
    ADC2_RESULT:origin = 0x000B40,length = 0x000020 // ADC2结果寄存器*/

    CPU_TIMER0:origin = 0x000C00,length = 0x000008 // CPU Timer0寄存器*/
    CPU_Timer1:origin = 0x000C08,length = 0x000008 // CPU Timer1寄存器*/
    CPU_TIMER2:origin = 0x000C10,length = 0x000008 // CPU Timer2寄存器*/

    PIE_CTRL:origin = 0x000CE0,length = 0x000020 // PIE 控制寄存器*/
    PIE_VECT:origin = 0x000D00,length = 0x000100 // PIE 矢量表*/
    PIE_VECT_CP:origin = 0x000E00,length = 0x000100 // PIE 矢量表复制*/

    DMA:origin = 0x001000、length = 0x000200 // DMA 寄存器*/

    ASHSCTRLCONFIG:origin = 0x001700,length = 0x000080 //模拟系统控制配置寄存器*/

    FLASH_REGS:origin = 0x004000、length = 0x000300 //闪存控制寄存器*/
    FLASH_ECC:origin = 0x004300、length = 0x000040 //闪存/OTP ECC 错误日志寄存器*/

    M3PLL:origin = 0x004400,length = 0x000010 // M3 PLL 时钟配置寄存器*/

    EPI_REGS:origin = 0x004430,length = 0x000010 // EPI 寄存器*

    RAM_REGS:origin = 0x004900,length = 0x000080 // RAM Control registers *
    RAM_ERR_regs:origin = 0x004A00,length = 0x000080 // RAM ECC/奇偶校验/访问错误日志寄存器*/

    CM_MC_IPC:origin = 0x004E00,length = 0x000040 // C28 Control to Master IPC registers */

    MCBSPA:origin = 0x005000、length = 0x000040 // McBSP-A 寄存器*/

    EPWM1:origin = 0x005100,length = 0x000080 // EPWM1 + HRPWM 寄存器*/
    EPWM2:origin = 0x005180、length = 0x000080 // EPWM2 + HRPWM 寄存器*/
    EPWM3:origin = 0x005200,length = 0x000080 // EPWM3 + HRPWM 寄存器*/
    EPWM4:origin = 0x005280、length = 0x000080 // EPWM4 + HRPWM 寄存器*/
    EPWM5:origin = 0x005300、length = 0x000080 // EPWM5+ HRPWM 寄存器*/
    EPWM6:origin = 0x005380、length = 0x000080 // EPWM6+ HRPWM 寄存器*/
    EPWM7:origin = 0x005400、length = 0x000080 // EPWM7 + HRPWM 寄存器*/
    EPWM8:origin = 0x005480、length = 0x000080 // EPWM8 + HRPWM 寄存器*/
    EPWM9:origin = 0x005500、length = 0x000080 // EPWM9寄存器(无 HRPWM)*/

    eCAP1:origin = 0x005A00,length = 0x000020 //增强型捕捉1寄存器*/
    ECAP2:origin = 0x005A20、length = 0x000020 //增强型捕捉2寄存器*/
    ECAP3:origin = 0x005A40,length = 0x000020 //增强型捕捉3寄存器*/
    ECAP4:origin = 0x005A60,length = 0x000020 //增强型捕捉4寄存器*/
    ECAP5:origin = 0x005A80,length = 0x000020 //增强型捕捉5寄存器*/
    ECAP6:origin = 0x005AA0,length = 0x000020 //增强型捕捉6寄存器*/

    EQEP1:origin = 0x005B00,length = 0x000040 //增强型 QEP 1寄存器*/
    EQEP2:origin = 0x005B40,length = 0x000040 //增强型 QEP 2寄存器*/
    EQEP3:origin = 0x005B80、length = 0x000040 //增强型 QEP 3寄存器*/

    GPIOG1CTRL:origin = 0x005F80,length = 0x000040 // GPIO 控制寄存器
    GPIOG1DAT:origin = 0x005FC0,length = 0x000020 // GPIO 数据寄存器*/
    GPIOG1TRIP:origin = 0x005FE0,length = 0x000020 // GPIO TRIP/LPM 寄存器*/

    COMP1:origin = 0x006400、length = 0x000020 //比较器+ DAC 1寄存器*/
    COMP2:origin = 0x006420、length = 0x000020 //比较器+ DAC 2寄存器*/
    COMP3:origin = 0x006440、length = 0x000020 //比较器+ DAC 3寄存器*/
    COMP4:origin = 0x006460、length = 0x000020 //比较器+ DAC 4寄存器*/
    COMP5:origin = 0x006480、length = 0x000020 //比较器+ DAC 5寄存器*/
    COMP6:origin = 0x0064A0、length = 0x000020 //比较器+ DAC 6寄存器*/

    GPIOG2CTRL:origin = 0x006F80,length = 0x000040 // GPIO 控制寄存器
    GPIOG2DAT:origin = 0x006FC0,length = 0x000020 // GPIO 数据寄存器*/

    系统:origin = 0x007010,length = 0x000020 //系统控制寄存器*/

    SPIA:origin = 0x007040,length = 0x000010 /* SPI-A 寄存器*/
    SCIA:origin = 0x007050、length = 0x000010 //* SCI-A 寄存器*/

    NMIINTRUPT:origin = 0x007060,length = 0x000010 // NMI 安全装置中断寄存器*/
    XINTRUPT:origin = 0x007070,length = 0x000010 //外部中断寄存器*/

    ADC1:origin = 0x007100、length = 0x000080 // ADC1寄存器*/
    ADC2:origin = 0x007180,length = 0x000080 // ADC2寄存器*/

    I2CA:origin = 0x007900,length = 0x000040 // I2C-A 寄存器*/

    /*C28密文区域结束和 RAM 部分开始*/

    RAML2:origin = 0x00A000、length = 0x001000 //片上 RAM 块 L2 */
    RAML3:origin = 0x00B000、length = 0x001000 //片上 RAM 块 L3 *
    RAMS0:origin = 0x00C000、length = 0x001000 //片上共享 RAM 块 S0 */
    RAMS1:origin = 0x00D000、length = 0x001000 //片上共享 RAM 块 S1 *
    RAMS2:origin = 0x00E000、length = 0x001000 //片上共享 RAM 块 S2 *
    RAMS3:origin = 0x00F000、length = 0x001000 //片上共享 RAM 块 S3 *
    RAMS4:origin = 0x010000,length = 0x001000 //片上共享 RAM 块 S4 */
    RAMS5:origin = 0x011000,length = 0x001000 //片上共享 RAM 块 S5 */
    RAMS6:origin = 0x012000,length = 0x001000 //片上共享 RAM 块 S6 */
    RAMS7:origin = 0x013000、length = 0x001000 //片上共享 RAM 块 S7 *

    CTOMRAM:origin = 0x03F800,length = 0x000380 // C28 to M3 Message RAM */
    MTOCRAM:origin = 0x03FC00,length = 0x000380 // M3到 C28消息 RAM */

    FLASHB:origin = 0x13C000、length = 0x002000 //片上闪存*/

    FLASH_EXT_ONLY:origin = 0x13FFF2,length = 0x000002/*仅闪存执行位置*/
    ECSL_PWL:origin = 0x13FFF4,length = 0x000004 //闪存 ECSL 密码位置*/
    CSM_PWL:origin = 0x13FFF8,length = 0x000008 //闪存 CSM 密码位置。 *

    /*将段分配给内存块。
    注:
    DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
    闪存时执行
    ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
    *

    部分

    /*** PIE Vect 表和引导 ROM 变量结构***/
    UNION RUN = PI_VECT、PAGE = 1

    PieVectTableFile


    EMUKeyVar
    EMUBModeVar
    FlashCallbackVar
    FlashScalingVar

    /*分配计划领域:*/
    .cinit:> FLASHA PAGE = 0
    .pinit:> FLASHA,page = 0
    .text:> FLASHA PAGE = 0
    codestart:> begin page = 0



    ramfuncs
    {-l F021_API_C28x_FPU32.lib}

    }负载= FLASHA,
    运行= RAML0、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0

    /*
    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000


    .TI.ramfunc
    {-l F021_API_C28x_FPU32.lib}

    }负载= FLASHA,
    运行= RAML0、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    run_start (_RamfuncsRunStart)、
    PAGE = 0
    其他


    ramfuncs
    {-l F021_API_C28x_FPU32.lib}

    }负载= FLASHA,
    运行= RAML0、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    run_start (_RamfuncsRunStart)、
    PAGE = 0
    #endif
    #endif
    *

    /*flashexeonly :>flash_EXE_only_P0 page = 0
    ecslpasswds:>ECSL_PWL_P0 page = 0
    csmpasswds:>csm_PWL_P0 page = 0
    csm_rsvd:>csm_RSVD page = 0*/
    /***外设帧0寄存器结构***/
    DevEmuRegsFile :>DEV_EMU,PAGE = 1.
    CsmRegsFile :>CSM,page = 1.
    UNION RUN = ADC1_RESULT、PAGE = 1

    AdcResultFile
    Adc1ResultFile

    Adc2ResultFile :>ADC2_Result,page = 1.
    CpuTimer0RegsFile:>CPU_TIMER0,PAGE = 1
    CpuTimer1RegsFile:>CPU_Timer1,page = 1
    CpuTimer2RegsFile:>CPU_TIMER2,PAGE = 1
    PieCtrlRegsFile :> PIE_CTRL,PAGE = 1.
    PieVectTableCopyFile :> PIE_VECT_CP,page = 1.
    DmaRegsFile:> DMA,page = 1.
    AnalogSysctrlRegsFile:> ASHSCTRLCONFIG,PAGE = 1.

    /***外设帧1寄存器结构***/
    FlashCtrlRegsFile:> flash_regs,page = 1.
    FlashEccRegsFile:> flash_ecc,page = 1.
    M3PllRegsFile:>M3PLL,PAGE = 1.
    EpiRegsFile:>EPI_REGS PAGE = 1.
    RAMRegsFile :>RAM_REGS,PAGE = 1.
    RAMErrRegsFile :>RAM_ERR_REGS,PAGE = 1.
    CtoMIPCRegsFile :>CM_MC_IPC,page = 1.

    /***外设帧2寄存器结构***/
    SysCtrlRegsFile:>系统,PAGE = 1.
    SpiaRegsFile :>SPIA,page = 1.
    SciaRegsFile:>SCIA,page = 1.
    NmiIntertRegsFile:>NMIINTRUPT、PAGE = 1
    XIntertRegsFile :>XINTRUPT,PAGE = 1.
    UNION RUN = ADC1、PAGE = 1

    AdcRegsFile
    Adc1RegsFile

    Adc2RegsFile :>ADC2,PAGE = 1.
    I2caRegsFile:>I2CA,page = 1.

    /***外设帧3寄存器结构***/
    McbspaRegsFile :>MCBSPA,page = 1.
    EPwm1RegsFile:> EPWM1,PAGE = 1
    EPwm2RegsFile:> EPWM2,PAGE = 1
    EPwm3RegsFile:> EPWM3,PAGE = 1
    EPwm4RegsFile:> EPWM4,PAGE = 1
    EPwm5RegsFile:> EPWM5,PAGE = 1
    EPwm6RegsFile:> EPWM6,PAGE = 1
    EPwm7RegsFile:> EPWM7,PAGE = 1
    EPwm8RegsFile:> EPWM8,PAGE = 1
    EPWM9RegsFile:> EPWM9,PAGE = 1
    ECap1RegsFile:> ECAP1,page = 1.
    ECap2RegsFile:> ECAP2,page = 1.
    ECap3RegsFile:> ECAP3,page = 1.
    ECap4RegsFile:>ECAP4,PAGE = 1.
    ECap5RegsFile:> ECAP5,page = 1.
    ECap6RegsFile:> ECAP6,page = 1.
    EQep1RegsFile:> EQEP1,PAGE = 1.
    EQep2RegsFile:> EQEP2,PAGE = 1
    EQep3RegsFile:> EQEP3,PAGE = 1
    UNION RUN = GPIOG1CTRL、PAGE = 1

    GpioCtrlRegsFile
    GpioG1CtrlRegsFile

    UNION RUN = GPIOG1DAT、PAGE = 1

    GpioDataRegsFile
    GpioG1DataRegsFile

    UNION RUN = GPIOG1TRIP、PAGE = 1

    GpioTripRegsFile
    GpioG1TripRegsFile

    COMP1RegsFile:> COMP1,PAGE = 1
    COMP2RegsFile:> COMP2,PAGE = 1
    COMP3RegsFile:> COMP3,PAGE = 1
    COMP4RegsFile:> COMP4,PAGE = 1
    COMP5RegsFile:> COMP5,PAGE = 1
    COMP6RegsFile:> COMP6,PAGE = 1
    GpioG2CtrlRegsFile:> GPIOG2CTRL,PAGE = 1
    GpioG2DataRegsFile:> GPIOG2DAT,page = 1.

    /*使用 IPC API 驱动程序时需要以下部分定义*/

    组:> CTOMRAM,页= 1

    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX

    组:> MTOCRAM,页= 1

    GETBUFFER:TYPE = DSECT
    GETWRITEIDX:TYPE = DSECT
    PUTREADIDX:TYPE = DSECT


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

    /*初始化段进入闪存*/
    /*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
    econst:> FLASHA PAGE = 0
    .switch:> FLASHA PAGE = 0

    /*分配 IQ 数学区域:*/
    IQMath:> FLASHA page = 0 /*数学代码*/
    IQmathTables :>IQTABLES,PAGE = 0,TYPE = NOLOAD

    /*分配 FPU 数学区域:*/
    FPUmathTables:> FPUTABLES,PAGE = 0,TYPE = NOLOAD

    DMARAML2:>RAML2,PAGE = 1
    DMARAML3:>RAML3,PAGE = 1

    /*如果调用 IQNexp()或 IQexp(),请取消注释以下部分
    库中的函数、以便利用
    引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
    1个等待状态)。 如果此部分未注释、则为 IQmathTables2
    将被加载到其他存储器(SARAM、闪存等)中并将采用
    上行空间、但0等待状态是可能的。
    *
    /*
    IQmathTables2:> IQTABLES2,PAGE = 0,TYPE = NOLOAD

    IQMath.lib (IQmathTablesRam)


    *
    /*如果调用 IQNasin ()或 IQasin (),请取消注释以下部分
    库中的函数、以便利用
    引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
    1个等待状态)。 如果此部分未注释、则为 IQmathTables2
    将被加载到其他存储器(SARAM、闪存等)中并将采用
    上行空间、但0等待状态是可能的。
    *
    /*
    IQmathTables3:> IQTABLES3,PAGE = 0,TYPE = NOLOAD

    IQMath.lib (IQmathTablesRam)


    *

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


    /***代码安全模块注册结构***/
    FlashExeOnlyFile:> FLASH_EXT_ONLY,PAGE = 1.
    EcslPwlFile:> ECSL_PWL,PAGE = 1.
    CsmPwlFile:>csm_PWL,page = 1.

    /*
    *

     

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

    哇! 这是一条很长的消息。 至少需要10 - 15分钟才能了解问题。如果我是您、这就是我继续调试的方法。

    步骤1:使用 JTAG 对 C28x 引导加载程序代码和闪烁代码进行编程、并检查 C28x 闪烁代码在独立模式下运行时是否正常工作。 当我是说独立模式时、器件应该从 JTAG 上断开。

    步骤2:使用 M3和 C28引导加载程序对闪烁代码进行编程。 是否一切正常。 然后、使用 Step1时、C28x 闪存内容应与闪存内容相同。

    第3步:如果闪烁代码在第2步中不起作用。 在0x13A000处设置断点、并确保 C28x 达到该点。 如果您不需要检查您的 M3和 C28自定义引导加载程序代码。

    注意:如果您没有使用 JTAG 连接到器件、则您处于独立模式。 一旦、您使用 JTAG 连接到器件。 GEL 文件将发出调试器复位。

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

    Manoj、

    以下是我的观察结果。  

    [引用用户="Manoj Santha Mohan"]WOW! 这是一条很长的消息。 至少需要10 - 15分钟才能了解问题。如果我是您、这就是我继续调试的方法。

    很抱歉发帖很长。 但很高兴我能传达这种铁氧体的东西。  

    [引用 user="Manoj Santha Mohan"]Step1:使用 JTAG 对 C28x 引导加载程序代码和闪烁代码进行编程、并检查 C28x 闪烁代码在独立模式下运行时是否正常工作。 当我指的是独立模式时、器件应与 JTAG 断开连接。

    我按照您的建议、将 C28引导加载程序和闪烁编程到相应的闪存空间。 现在、我退出了调试模式(图片中没有 JTAG)并对评估板进行了电源复位。 M3引导加载程序将 IPC 引导推送到 C28引导加载程序的闪存中、并在跳转到闪烁应用程序后使 LED 闪烁。  

    [引用 user="Manoj Santha Mohan"]Step2:使用 M3和 C28引导加载程序对闪烁代码进行编程。 是否一切正常。 然后、使用 Step1时、C28x 闪存内容应与闪存内容相同。

    在此步骤中、如何验证我的闪存内容是否与步骤1中的闪存内容相同。 我是否应该读取两个实例中的内存段并使用一些比较比较来比较它们???

    [引用 user="Manoj Santha Mohan"]Step3:如果闪烁代码在 Step2中不起作用。 在0x13A000处设置断点、并确保 C28x 达到该点。 如果您不需要检查 M3和 C28自定义引导加载程序代码。[/quot]

    断点命中 0x13A000地址、当我单步执行时、它也会从闪烁的程序空间执行一些指令。 但是、当我恢复运行并暂停时、反汇编窗口处于空闲状态。  

    [引用 USER="Manoj Santha Mohan">注意:如果您不使用 JTAG 连接到器件、则您将处于独立模式。 一旦、您使用 JTAG 连接到器件。 GEL 文件将发出调试器复位命令。[/quot]

    感谢您的澄清!  

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

    好的、这些实验确认 M3引导加载程序和 C28x 自定义引导加载程序正在成功加载闪烁代码。 我们需要确认是否正确编程了完整的闪烁码。

    您能否在步骤1实验后下载闪存的内容并在步骤2 (或)步骤3之后比较存储器的内容?

    如果步骤1和步骤3闪存的内容与100%匹配、则只有选项是加载符号并继续单步执行代码以找出问题根源。

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

    Manoj、

    需要一些提示来执行您建议的上述步骤!

    首先: [引用 user="Manoj Santha Mohan"]您能否在步骤1实验后下载闪存内容并比较步骤2 (或)步骤3之后的存储器内容?

    如何下载闪存的内容以及下载的格式? 您能否告诉我 CCS 中可以从何处完成此操作? 是否有任何工具可以检查闪存内容并提供一些日志消息?

    [引用 user="Manoj Santha Mohan"]如果步骤1和步骤3闪存的内容匹配100%,则只有选项是加载符号并继续将代码步进至根导致问题。

    我以前没有尝试过这种方法。 您能不能详细解释一下我如何在我的结尾尝试它,或者如果有 wiki,请给我指一下。  

    谢谢

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

    以下主题将向您展示如何下载存储器的内容。

    e2e.ti.com/.../131573

    在您使用 Step1和 Step3下载 C28x 闪存内容之后。 您可以使用任何比较工具来比较.dat 文件

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

    Manoj、

    因此、我能够为步骤1和步骤2提取.dat 文件。 我使用 kdiff3来查看文件之间的差异。  

    根据我的观察结果、我在 blinky.hex 文件中对实际十六进制代码进行编程时未发现任何问题或不匹配。

    但我想我看到的是校验和或 ECC 半字中的差异?   

    例:步骤1提取的.dat 文件在某些位置包含 FCD4,而步骤2提取的.dat 文件则包含 FCDE。 但还有其他此类半字不来自实际 blinky.hex 文件。  

    我已附加从步骤1和步骤2中提取的.dat 文件。 您能否在结束时查看并向我提供反馈?  

    blinky.dat 来自步骤1  

    blinky_bl.dat 来自步骤2  

    e2e.ti.com/.../blinky.dat

    e2e.ti.com/.../blinky_5F00_bl.dat

    谢谢

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

    您的内存转储太大、它从错误的闪存地址开始。 我还发现 sectora 的许多存储器内容是不同的。 请再次尝试重新执行实验、并检查与以下参数的差异

    格式 =十六进制
    起始地址= 0x100000
    Memory Page =数据
    长度 = 0x040000
    类型大小 = 16位

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

    Manoj、

    [引用 user="Manoj Santha Mohan">请再次尝试重新执行实验、并检查与以下参数的差异

    格式=十六进制
    起始地址= 0x100000
    Memory Page =数据
    长度= 0x040000
    TYPE-SIZE = 16位[/引用]

    根据您的建议、我在考虑列出的参数时、再次执行整个调试会话。 同样、kdiff3工具仅表明差异可能与校验和字节类似。  

    [引用 user="Manoj Santha Mohan"]我还发现 sectora 的许多存储器内容不同

    我正在将扇区 A 用于引导加载程序、因此我可以在不加载引导加载程序的情况下运行步骤1、当然也可以在引导加载程序中运行步骤2、因此这就是您可能看到差异的原因!

    我将再次在此处附加.dat 文件以供您参考。  

    e2e.ti.com/.../0250.blinky.dat

    e2e.ti.com/.../4405.blinky_5F00_bl.dat

    谢谢

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

    Preetham、

    我比较了您发送的两个.dat 文件。 它似乎有很多差异。 请检查。

    e2e.ti.com/.../0250.blinky.dat-vs-4405.blinky_5F00_bl.dat.txt

    此致、

    曼诺伊

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

    很抱歉耽误您的回答、感谢您仔细阅读这些说明、指出了差异。

    查看您的附加文件、我可以看到大部分差异都来自扇区 A。这是我刷写 C28引导加载程序应用程序的地方!
    这部分应用程序是否会影响应用程序进一步闪烁的行为?

    此外、我无法准确理解扇区 A 的每个地址块之间几乎有什么差异

    我使用 CCS Studio 集成 JTAG 支持来刷写引导加载程序。 当完成步骤1和步骤2时,它有何不同?

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

    在这里、我只想提及我在 C28引导加载程序处执行的单个步骤、以跳转到地址0x13A000。

    静态空转移控制(空){

    ASM (" lb 0x0013A000"); //0013 A000–0013 BFFF ->扇区 C

    返回;



    这就是我要跳的一切! 我是否应该考虑执行除此之外的任何其他步骤?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Preetham、

    您是否确定 C28x 闪烁应用代码被限制在 C28x 引导加载程序之外的扇区中? 我感觉当您对闪烁应用程序代码进行编程时、会损坏 C28x 引导加载程序扇区。

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

    通常、任何自定义引导加载程序代码都会决定它们是否需要更新应用程序代码(或)、只需根据主机指定的签名运行现有应用程序代码。

    假设当特定 GPIO 被拉高时、我想更新我的应用程序代码、下面是我可以如何构建我的代码:-

    1) 1)检查 GPIO 的状态
    2) 2)如果 GPIO 上拉为高电平、则擦除用于应用代码的扇区并更新新的应用代码
    3) 3)如果 GPIO 下拉为低电平、则无需更新应用代码、只需跳转至应用代码的起始地址并继续运行应用代码。

    附加的代码片段足以跳转到应用代码并运行它。

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

    Manoj、

    根据我使用加载符号操作执行的一些故障排除、我有一些更新可供您使用。  

    第一:

    我通过 JTAG 和引导加载程序加载了 C28引导加载程序、我对 C28闪烁应用程序进行了编程、并直接跳转到闪烁应用程序的"_c_int00"。  

    请参阅下面的屏幕截图、其中显示我确实跳转到了该地址、而在该位置进行了分解即可看出这一点。 (此时我加载了符号)

    现在,我在闪烁的 main()处放置了另一个断点,该断点位于0x001301a0位置。  

    现在,当我第一次将调试器从 _c_int00()恢复运行时,我希望它在 main ()处中断!

    但令我惊讶的是,我从未到达 main (),而应用程序在  _c_int00和 main ()之间的某个位置发生了故障。

    因此,我再次启动了整个会话,这次当我单击 _c_int00 ()时,我开始单步执行代码。 这使我进入了 boot28.inc 文件中的一些符号。 在单步执行几分钟后,当我进入  _copy_in ()并尝试再次单步执行时,代码中断,我想我又回到了引导 ROM regin!  

    因此,不能完全确定该地区发生了什么错误? 请参阅下面的屏幕截图  

    您能不能给我一些提示,告诉我在这里可能会发生什么情况?  

    谢谢

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

    这很奇怪。 我不太理解只有在使用 C28x 引导加载程序对闪烁代码进行编程时、而不是在使用 JTAG 对闪烁代码进行编程时、您才会看到问题。 此外、C28x 引导加载程序在步骤1和步骤2之间有何不同。 我没有太多的链接可以提供有意义的建议。

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

    如果我们可以通过团队观看者会议或 WebEx 进行联系、那能帮您解决什么问题。 因此、当我们谈论时、我可以共享我的屏幕、并实时向您展示我所做的工作、这可能会为您提供更好的图片。

    如果这是可行的计划,请告诉我,我可以与负责为我们公司提供 TI 产品支持的 Zaki nadeem (TI,FAE)联系,并请他帮助我们设置初始呼叫。

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Preetham、
    请给我发送电子邮件@ r-kalsi@ti.com 以进行进一步讨论
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此问题是否已解决? 我可以关闭此主题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Manoj、

    问题仍然存在。 但是、为了避免线程延长、我可能会创建一个新线程、并在此处发布我的观察结果和疑虑。 现在、我要说的是、加载符号导致我遇到问题的答案为我提供了一些进展、因此我将把它标记为解决方案。

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的。 希望您能够解决内存转储中的差异。

    -Manoj
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我要关闭此主题。 如果您仍有疑问、请打开新主题。