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.

TMS320F2800137: DCSM加密,烧写报错

Part Number: TMS320F2800137
Other Parts Discussed in Thread: SYSCONFIG

当我在c2000.syscfg中加入DCSM,未做其他操作。

再次烧写程序,会报如下错误。

当我从c2000.syscfg去掉DCSM,就能正常烧写,

请问一下,该如何解决。

  • 直接添加DCSM支持后,DCSM中的配置都是默认配置。

    试着根据需求修改之后再尝试烧录。

    建议对DCSM有一定了解之后,再使能并配置DCSM。

  • 您好,加入DCSM后,密码为默认配置,也并未选择安全区,所有区域配置的都是Unsecure。为什么烧写会失败?

  • DCSM部分都是OTP(One Time Programable)Flash,因为和初始值没有任何的变化,所以会烧录失败(这个只是我的推测,因为DCSM部分的实验我只做过一部分,因为太废片子了)。

    DCSM设计了LinkerPointer机制,其中的一个原因就是可以重新配置不同的加密配置。

    你可以先试一下不改变LinkerPointer的情况下,更改密码再烧录试一下;之后将Linker Pointer指向下一个ZSB,并更改相应的密码,进行实验。

    更改了密码之后,便使能了相应的加密功能,相应的RAM和FLASH也要进行分配。

  • 将SYSCONFIG自动生成的DCSM.asm文件贴出来看一下

  • ;----------------------------------------------------------------------
    ; Zone 1
    ;----------------------------------------------------------------------
         .sect "dcsm_otp_z1_linkpointer"
          .retain
          .long 0x00003FFE
          .long 0x00003FFE
          .long 0x00003FFE
        
         .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_rsvd"
          .retain
          .long 0x7FFFFFFF     ;Reserved
      
    ;;     .sect "dcsm_otp_z1_gpreg"
    ;;      .retain
    ;;      .long 0x5AFF1820     ;Z1OTP_GPREG1 = Z1_BOOTPIN
    ;;      .long 0x5AFFFFff     ;Z1OTP_GPREG2
    ;;      .long 0x00000000     ;Z1OTP_GPREG3 = Z1OTP_BOOTDEF_LOW
    ;;      .long 0xFFFFFFFF     ;Z1OTP_GPREG4 = Z1OTP_BOOTDEF_HIGH
         .sect "dcsm_zsel_z1"
          .retain
          .long 0xFFFFFFFF     ;Z1OTP_CSMPSWD0 (LSW of 128-bit password)
          .long 0x4D7FFFFF     ;Z1OTP_CSMPSWD1
          .long 0xFFFFFFFF     ;Z1OTP_CSMPSWD2
          .long 0xFFFFFFFF     ;Z1OTP_CSMPSWD3 (MSW of 128-bit password)
     
          .long 0xAAAAAAAA     ;Z1OTP_GRABSECT1
          .long 0xAAAA5555     ;Z1OTP_GRABSECT2
          .long 0xAAAAAA00     ;Z1OTP_GRABSECT3
          .long 0x0000AAAA     ;Z1OTP_GRABRAM1
          .long 0xFFFFFFFF     ;Reserved
          .long 0xFFFFFFFF     ;Reserved
     
          .long 0xFFFFFFFF     ;Z1OTP_EXEONLYSECT1
          .long 0x0000FFF0     ;Z1OTP_EXEONLYSECT2
          .long 0x000000FF     ;Z1OTP_EXEONLYRAM1
          .long 0xFFFFFFFF     ;Reserved
          .long 0xFFFFFFFF     ;Z1OTP_JTAGPSWDL0
          .long 0x27FFFFFF     ;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 0x00003FFF
          .long 0x00003FFF
          .long 0x00003FFF
    
         .sect "dcsm_rsvd_z2"
          .retain
          .long 0xFFFFFFFF     ;Reserved
         .sect "dcsm_otp_z2_pswdlock"
          .retain
          .long 0x1F7FFFFF
          
         .sect "dcsm_otp_z2_crclock_rsvd"
          .retain
          .long 0x3FFFFFFF     ;Reserved
                
    ;;     .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     ;Reserved
          .long 0xFFFFFFFF     ;Reserved
    
         .sect "dcsm_zsel_z2"
          .retain
          .long 0xFFFFFFFF     ;Z2OTP_CSMPSWD0 (LSW of 128-bit password)
          .long 0x1F7FFFFF     ;Z2OTP_CSMPSWD1
          .long 0xFFFFFFFF     ;Z2OTP_CSMPSWD2
          .long 0xFFFFFFFF     ;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
    ;----------------------------------------------------------------------

  •   .sect "dcsm_otp_z1_linkpointer"
    .retain
    .long 0x00003FFE
    .long 0x00003FFE
    .long 0x00003FFE

    上面明显错误,0x78000开始处的默认值应该是下面的值才对

    0x00078000 1FFFFFFF FFFFFFFF 1FFFFFFF FFFFFFFF 1FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF

    建议你在DCSM配置中,勾选一个配置Zone1,但是采用默认值

  • 2800137  z1_linkpointer 的默认值不是0x00003FFF吗? ,就像我z2区域也没改,也是0x00003FFF.

  • 不好意思,我没有看00137的,直接拿280049来说了。

    asm文件看起来没有问题,Z1_linkpointer = 0x3FFE

    .sect "dcsm_otp_z1_linkpointer"
    .retain
    .long 0x00003FFE

    在不编译sysconfig文件的情况,debug一下,然后看看0x78000地址处的内存值是怎样的

  • 您好,0x78000地址处的内存值如下

    另外我尝试使用zone2,不配置zone1,已经成功实现相应flash区域的加密

  • 读出来的是3FFF,说明使用的是ZSB0,0x78022和23处的PSWD1=0x4D7FFFFF也佐证这一点。

    但是在上传的asm文件中,linkpointer指向了3FFE(ZSB1),但是PSWD1密码使用的还是3FFF(ZSB0)的。我想这就是烧录失败的原因,因为产生了冲突。

    不同于PSWD0、PSWD2以及PSWD3,PSWD1的初始值并不是全1(0xFFFFFFFF),而是由TI设定的一个值。不同ZSB的值各不相同。DCSM使用的OTP FLASH只能由1写0(擦除操作)。可以从这个方面来看一下。

    非常感谢提供的思路及方向~