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.

[参考译文] TMS320F280037C:在已安装引导加载程序时通过调试器上传应用程序

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1359231/tms320f280037c-uploading-application-through-debugger-when-there-is-a-bootloader-already-installed

器件型号:TMS320F280037C
主题中讨论的其他器件:SysConfig

您好!

在我们的应用中、我们有两个单独的代码:位于闪存入口点的引导加载程序和位于 bank1中的应用程序代码。 当我们尝试通过调试器而不是引导加载程序来上传应用程序时、我们已经解决了一个奇怪的问题。 在调试和下电上电后、该应用似乎与预期的应用不匹配、例如、LED 无法按预期工作、电机未按预期移动等。

我正在对此问题进行故障排除、我想问一些有关引导加载流程和调试的问题。

-如何影响通过调试器上载代码而不是通过引导加载程序上载,过程应该像在引导加载程序中一样简单的上传.txt 文件?

-在项目之间,我有不同的.cmd 和.asm。 例如、我有一个.asm 文件供 DCSM 模块修改引导加载程序项目中的默认引导模式。 这些文件由编译器转换为.obj 格式、并且始终在电源循环后执行、即使我使用调试器上传了应用程序也是如此?

-例如在 bootloader 的.asm 文件中、在分支到应用程序之前、bootloader 应该将 CPU 寄存器复位并清空堆栈。 在 MCU 进行下电上电时、应该始终不执行此操作? 无论我是通过调试器上传了应用程序代码、还是在这里遗漏了一些内容、都应该是如此?

我大致遵循了 sci 示例中引导加载程序基础的示例。

谢谢。此致、

大卫

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

    尊敬的 David:

    >如何影响通过调试器上载代码而不是通过引导加载程序上载,该过程应该像在引导加载程序中一样简单上传.txt 文件?

    通过调试器上传代码时、您正在将 .out 文件上传到器件中 、而 引导加载程序会接收到.txt。  

    >文件由编译器转换在.obj 中,并总是在电源循环后执行,即使我上传了一个应用程序与调试器?

    这些是从内核还是从应用转换的文件? 您能不能提供您使用的 DCSM .asm 文件的示例

    >当 MCU 重新上电时,应该始终不执行此操作? 无论我是通过调试器上传了应用程序代码、还是在这里遗漏了一些内容、都应该是如此?

    是的、复位后、堆栈也被清除。

    谢谢。此致、

    查尔斯

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

    您好 Charles、

    通过调试器上传代码时、您正在将 .out 文件上传到器件中 、而 引导加载程序会接收到.txt。  

    是的、但在本质上、代码应该是相同的、正确吗?

    文件是.cmd 文件、我使用 osme 级修改、或者是用于初始化器件或 DCSM 的.asm 文件、用于配置 DCSM 的.asm 文件如下所示(我从 SysConfig 获得):


    优点:
    ;区域1
    优点:
        .sect "dcsm_otp_z1_linkpointer"
         .retain
         .long 0x00003FFF
         .long 0x00003FFF
         .long 0x00003FFF

        .sect "Dcsm_OTP_Z1_JLM_ENABLE"
         .retain
         .long 0xFFFF000F    ;Z1OTP_JLM_ENABLE
    ;    .sect "Dcsm_OTP_Z1_JTAG_pswdh"
    ;;     .retain
    ;     .long 0x4BFFFFFF    ;Z1OTP_JTAGPSWDH0
    ;     .long 0x3FFFFFFF    ;Z1OTP_JTAGPSWDH1

        .sect "Dcsm_OTP_Z1_CMAC_key"
         .retain
         .long 0x00000000    ;Z1OTP_CMACKEY0
         .long 0x00000000    ;Z1OTP_CMACKEY1
         .long 0x00000000    ;Z1OTP_CMACKEY2
         .long 0x00000000    ;Z1OTP_CMACKEY3

        .sect "Dcsm_otp_z1_pswdlock"
         .retain
         .long 0xFB7FFFFF

        .sect "dcsm_otp_z1_crclock"
         .retain
         .long 0x7FFFFFFF

        .sect "dcsm_otp_z1_gpreg"
         .retain
         .long 0x5AFFFFFF    ;Z1OTP_GPREG1 = Z1_BOOTPIN
         .long 0x5AFFFFff    ;Z1OTP_GPREG2
         .long 0xFFFFFF03    ;Z1OTP_GPREG3 = Z1OTP_BOOTDEF_LOW
         .long 0xFFFFFFFF    ;Z1OTP_GPREG4 = Z1OTP_BOOTDEF_HIGH
        .sect "dcsm_zsel_z1"
         .retain
         .long 0xFFFFFFFF    ;Z1OTP_CSMPSWD0 (128位密码的 LSW)
         .long 0x4D7FFFFF    ;Z1OTP_CSMPSWD1
         .long 0xFFFFFFFF    ;Z1OTP_CSMPSWD2
         .long 0xFFFFFFFF    ;Z1OTP_CSMPSWD3 (128位密码的 MSW)

         .long 0xAAAAAA    ;Z1OTP_GRABSECT1
         .long 0xAAAAAA    ;Z1OTP_GRABSECT2
         .long 0xAAAAAA    ;Z1OTP_GRABSECT3
         .long 0x0000AAAA    ;Z1OTP_GRABRAM1
         .long 0xFFFFFFFF    ;保留
         .long 0xFFFFFFFF    ;保留

         .long 0xFFFFFFFF    ;Z1OTP_EXEONLYSECT1
         .long 0x0000FFFF    ;Z1OTP_EXEONLYSECT2
         .long 0x000000FF    ;Z1OTP_EXEONLYRAM1
         .long 0xFFFFFFFF    ;保留
         .long 0xFFFFFFFF    ;Z1OTP_JTAGPSWDL0
         .long 0x2BFFFFFF    ;Z1OTP_JTAGPSWDL1


    优点:

    ;代码安全操作,开发完成后,
    ;生产,所有其它区域选择块位置都应编程
    ;设置为0x0000,以获得最大安全性。
    ;如果使用偏移量0x10处的第一个区域选择块,该段
    ;可以使用"dcsm_rsvd_z1"将这些位置编程为0x0000。
    ;此代码为开发注释掉。

    ;      .sect "dcsm_rsvd_z1"
    ;       .loop (1e0h)
    ;             .int 0x0000
    ;       .endloop


    优点:
    ;区域2
    优点:
    ;    .sect "dcsm_otp_z2_linkpointer"
    ;;     .retain
    ;;     .long 0x00003FFF
    ;;     .long 0x00003FFF
    ;;     .long 0x00003FFF
    ;;
    ;    .sect "dcsm_rsvd_z2"
    ;;     .retain
    ;;     .long 0xFFFFFFFF    ;保留
    ;    .sect "dcsm_otp_z2_pswdlock"
    ;;     .retain
    ;;     .long 0x1F7FFFFF
    ;;
    ;;    .sect "dcsm_otp_z2_crclock"
    ;;     .retain
    ;;     .long 0x3FFFFFFF
    ;;
    ;    .sect "dcsm_otp_z2_gpreg"
    ;;     .retain
    ;     .long 0x5AFF1820    ;Z2OTP_GPREG1 = Z2_BOOTPIN
    ;     .long 0x5AFFFFff    ;Z2OTP_GPREG2
    ;     .long 0x00000000    ;Z2OTP_GPREG3 = Z2OTP_BOOTDEF_LOW
    ;     .long 0xFFFFFFFF    ;Z2OTP_GPREG4 = Z2OTP_BOOTDEF_HIGH
    ;    .sect "dcsm_rsvd1_z2"
    ;;     .retain
    ;;     .long 0xFFFFFFFF    ;保留
    ;;     .long 0xFFFFFFFF    ;保留
    ;;
    ;    .sect "dcsm_zsel_z2"
    ;;     .retain
    ;     .long 0xFFFFFFFF    ;Z2OTP_CSMPSWD0 (128位密码的 lsw)
    ;     .long 0x1F7FFFFF    ;Z2OTP_CSMPSWD1
    ;     .long 0xFFFFFFFF    ;Z2OTP_CSMPSWD2
    ;     .long 0xFFFFFFFF    ;Z2OTP_CSMPSWD3 (128位密码的 MSW)
    ;;
    ;     .long 0xAAAAAAAA    ;Z2OTP_GRABSECT1
    ;     .long 0xAAAAAAAA    ;Z2OTP_GRABSECT2
    ;     .long 0xAAAAAAAA    ;Z2OTP_GRABSECT3
    ;     .long 0x0000AAAA    ;Z2OTP_GRABRAM1
    ;;     .long 0xFFFFFFFF    ;保留
    ;;     .long 0xFFFFFFFF    ;保留
    ;;
    ;     .long 0xFFFFFFFF    ;Z2OTP_EXEONLYSECT1
    ;     .long 0x0000FFFF    ;Z2OTP_EXEONLYSECT2
    ;;     .long 0x000000FF    ; Z2OTP_EXEONLYRAM1
    ;;     .long 0xFFFFFFFF    ;保留
    ;;     .long 0xFFFFFFFF    ;保留
    ;;     .long 0xFFFFFFFF    ;保留


    优点:

    ;代码安全操作,开发完成后,
    ;生产,所有其它区域选择块位置都应编程
    ;设置为0x0000,以获得最大安全性。
    ;如果使用偏移量0x10处的第一个区域选择块,该段
    ;可以使用"dcsm_rsvd_z2"将这些位置编程为0x0000。
    ;此代码为开发注释掉。

    ;      .sect "dcsm_rsvd_z2"
    ;       .loop (1e0h)
    ;             .int 0x0000
    ;       .endloop


    优点:
    ;文件结尾
    优点:

    因此、我们来总结一下。 从调试器运行与从闪存运行应该没有什么不同

    此致、

    大卫

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

    >是的,但在本质上代码应该是相同的权利?

    可以。

    我需要更多时间与我的团队一起回顾此帖子的其余内容、下周早些时候会与您联系。

    谢谢。此致、
    查尔斯

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

    尊敬的 David:

    DCSM 模块生成的.asm.cmd 文件需要注意、当对 .asm 和 .cmd 文件本身进行编辑时、在重新生成工程时这些文件会被 SysConfig 内容覆盖。 您能否列出生成这些文件并将其添加到项目中的确切步骤?

    谢谢。此致、

    查尔斯

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

    您好 Charles、

    抱歉为方便起见、我误点了您的邮件、因为这解决了我的问题。 关于您的问题、DCSM 模块生成的.asm 文件是从另一个 SysConfig 复制的。 它是从应用程序工程中获得的。 在此之前、我仅复制了有关 DCSM 的.asm 和.cmd 文件、并将它们放入 bootlaoder 项目中。 但是、在引导加载程序 SysConfig 文件中、我没有配置 DCSM 模块

    此致、

    大卫

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

    尊敬的 David:

    对于发送至引导加载程序的生成的应用程序、您是否能够共享其映射和.txt 文件? 与使用调试器发送的内容相同吗?

    谢谢。此致、

    查尔斯

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

    您好 Charles、

    我检查了编译器生成的应用文件和调试器中使用的应用文件。 我发现有最小的推论,因此,不同的应用。 我将查看发生这种情况的原因。 现在、感谢您帮助解决此问题。

    此致、

    大卫