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.

[参考译文] TMS320F2800155-Q1:导入 DCSM 模块后、程序无法正常运行。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1625411/tms320f2800155-q1-after-importing-the-dcsm-module-the-program-cannot-run-properly

器件型号: TMS320F2800155-Q1

为什么使用仿真器进行调试时加密成功并且代码可以运行并已烧录到闪存中、但当第二次接通电源时、代码无法再运行?

注意:我的代码调试始终是使用 flash.cmd 完成的、这意味着我的代码不在 RAM 中、并且不会出现代码在断电时消失的情况。

同时、我已验证、即使未导入 DCSM 模块并且电源被切断、程序也可以正常运行。

我的相应配置如下所示

;----------------------------------------------------------------------
; Zone 1
;----------------------------------------------------------------------
     .sect "dcsm_otp_z1_linkpointer"
      .retain
      .long 0x00003FE0
      .long 0x00003FE0
      .long 0x00003FE0
    
         .retain
      .long 0xFFFF0000     ;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 0xFFFFFFFF     ;Z1OTP_CMACKEY0
;;      .long 0xFFFFFFFF     ;Z1OTP_CMACKEY1
;;      .long 0xFFFFFFFF     ;Z1OTP_CMACKEY2
;;      .long 0xFFFFFFFF     ;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 0x5AFF1820     ;Z1OTP_GPREG1 = Z1_BOOTPIN
;;      .long 0x5Affffff     ;Z1OTP_GPREG2
;;      .long 0x0A24040A     ;Z1OTP_GPREG3 = Z1OTP_BOOTDEF_LOW
;;      .long 0xFFFFFFFF     ;Z1OTP_GPREG4 = Z1OTP_BOOTDEF_HIGH
    .sect "dcsm_zsel_z1"
      .retain
      .long 0x12345678     ;Z1OTP_CSMPSWD0 (LSW of 128-bit password)
      .long 0x17fFFFFF     ;Z1OTP_CSMPSWD1
      .long 0x12345678     ;Z1OTP_CSMPSWD2
      .long 0x12345678     ;Z1OTP_CSMPSWD3 (MSW of 128-bit password)
 
      .long 0x55555555     ;Z1OTP_GRABSECT1
      .long 0x55555555     ;Z1OTP_GRABSECT2
      .long 0x55555500     ;Z1OTP_GRABSECT3
      ..long 0x0000AAAA     ;Z1OTP_GRABRAM1
      .long 0xFFFFFFFF     ;Reserved
      .long 0xFFFFFFFF     ;Reserved
 
      .long 0xFFFF0000     ;Z1OTP_EXEONLYSECT1
      .long 0x0000FFF0     ;Z1OTP_EXEONLYSECT2
      .long 0x000000FF     ;Z1OTP_EXEONLYRAM1
      .long 0xFFFFFFFF     ;Reserved
      .long 0x12345678     ;Z1OTP_JTAGPSWDL0
      .long 0x6f7fffff     ;Z1OTP_JTAGPSWDL1
;----------------------------------------------------------------------

; For code security operation,after development has completed, prior to
; production, all other zone select block locations should be programmed
; to 0x0000 for maximum security.        
; If the first zone select block at offset 0x10 is used, the section 
; "dcsm_rsvd_z1" can be used to program these locations to 0x0000.
; This code is commented out for development.

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


;----------------------------------------------------------------------
; Zone 2
;----------------------------------------------------------------------
    .sect "dcsm_otp_z2_linkpointer"
      .retain
      .long 0x00003FE0
      .long 0x00003FE0
      .long 0x00003FE0

     .sect "dcsm_rsvd_z2"
      .retain
      .long 0xFFFFFFFF     ;Reserved
     .sect "dcsm_otp_z2_pswdlock"
      .retain
      .long 0x1F7FFFFF
      
     .sect "dcsm_otp_z2_crclock"
      .retain
      .long 0x3FFFFFFF
;;     .sect "dcsm_otp_z2_gpreg"
;;      .retain
;;      .long 0x5AFFFFFF     ;Z2OTP_GPREG1 = Z2_BOOTPIN
;;      .long 0x5AFFFFff     ;Z2OTP_GPREG2
;;      .long 0xFFFFFF0A     ;Z2OTP_GPREG3 = Z2OTP_BOOTDEF_LOW
;;      .long 0xFFFFFFFF     ;Z2OTP_GPREG4 = Z2OTP_BOOTDEF_HIGH
     .sect "dcsm_rsvd1_z2"
      .retain
      .long 0xFFFFFFFF     ;Reserved
      .long 0xFFFFFFFF     ;Reserved
  .sect "dcsm_zsel_z2"
      .retain
      .long 0x12345678     ;Z2OTP_CSMPSWD0 (LSW of 128-bit password)
      .long 0x5bfFFFFF     ;Z2OTP_CSMPSWD1
      .long 0x12345678     ;Z2OTP_CSMPSWD2
      .long 0x12345678     ;Z2OTP_CSMPSWD3 (MSW of 128-bit password)
 
      .long 0xAAAAAAAA     ;Z2OTP_GRABSECT1
      .long 0xAAAAAAAA     ;Z2OTP_GRABSECT2
      .long 0xAAAAAA00     ;Z2OTP_GRABSECT3
      .long 0x0000AAAA     ;Z2OTP_GRABRAM1
      .long 0xFFFFFFFF     ;Reserved
        .long 0xFFFFFFFF     ;Reserved
 
      .long 0xFFFFFFFF     ;Z2OTP_EXEONLYSECT1
      .long 0x0000FFF0     ;Z2OTP_EXEONLYSECT2
      .long 0x000000FF     ;Z2OTP_EXEONLYRAM1
      .long 0xFFFFFFFF     ;Reserved
      .long 0xFFFFFFFF     ;Reserved
      .long 0xFFFFFFFF     ;Reserved
;----------------------------------------------------------------------

; For code security operation,after development has completed, prior to
; production, all other zone select block locations should be programmed
; to 0x0000 for maximum security.        
; If the first zone select block at offset 0x10 is used, the section 
; "dcsm_rsvd_z2" can be used to program these locations to 0x0000.
; This code is commented out for development.

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


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

    您好、张:

    我已经邀请专家对此进一步评论。

    此致、

    Aishwarya

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

    您好:

    为什么使用仿真器进行调试时加密成功并且代码可以运行

    在启用 DCSM 的情况下运行应用程序时、您是执行 ECSL 还是 CSM 解锁? 如果您只执行 ECSL 解锁、应用程序是否会按预期工作?

    代码无法再运行?

    能否就问题的性质提供更多详细信息? 根据 DCSM 配置、 将链路指针递增到 0x3FE0。 您是否使用 dcsm.cmd 中的 ZSB 偏移量解决了这一问题?  

    此致、
    马特

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

    您好、Matt

    我已经确定了问题领域。目前,它似乎是由 EXEONLY 引起的。

    .long 0xFFFF0000     ;Z1OTP_EXEONLYSECT1

    当我没有设置 EXEONLY 时、只有闪存被加密、程序在断电后正常运行。 当我设置闪存扇区 1-15 时、程序在断电后无法运行。 这个时候,我的鸡巴还在不停地悸动着。 因为我没有禁用 ECSL、但它可以进行仿真、并且程序可以正常解密和烧录。 我认为程序卡在 BootRAM 中。 没有配置软件启动。 默认引脚用于启动、24 和 32 为高电平。 默认引脚用于启动、24 和 32 为高电平。 默认情况下是进入闪存。 我确认了这一点。 因此、设置 EXEONLY 似乎导致我的程序无法进入闪存。 可能的原因是什么?

    由于我需要执行安全启动、因此需要设置 EXEONLY。 您能告诉我这可能是什么原因、我该如何修改? 谢谢你。

    好极了。

    Zhang

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

    是否有人关注这个问题?

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

    您好:

    当我设置闪存扇区 1-15 时、程序在断电后无法运行。

    您共享的以下配置可配置扇区  0  15 作为 EXEONLY。 请确认这是有意为之。

    .long 0xFFFF0000 ;Z1OTP_EXEONLYSECT1

    当为任何安全闪存扇区或 RAM 块提供仅执行保护时、不允许从任何代码(甚至从安全代码)读取该闪存扇区或 RAM 块的数据。 由于隔离了此配置是导致错误的原因、因此必须审核代码以确保在扇区 0-15 中不执行任何读取。 这包括任何不安全的 memcpy () 调用、CRC 计算等

    此致、
    马特