打印

C2000 F2810 加密CSM功能以后程序不运行问题

[复制链接]
402|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2023-2-8 13:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的板子是C2000的F2810,不用加密功能时候debug/release都可以调试/运行程序,起码可以看到SCI串口通信数据。



但是增加了加密功能CSM以后,发现RAML0区域保存的数据不能够准确读取,导致后面程序无法运行,求助大神给予指导。

报错位置如下

if (result != (U16)~pSafe->not_x)   --》 pSafe 位于0x8634 RAML0
    {
        SciaRegs.SCITXBUF=pSafe->x;
        SciaRegs.SCITXBUF=pSafe->not_x;                             -> 尝试读取pSafe->x数据,发现加密读不出来,为0;不加密就可以读取到。求原因
        CRITICAL_ERROR1(ERR_MEMORY_CORRUPTED);  -->加密以后就会进到此函数里,导致后面程序无法执行。
    }

CMD 文件如下:

MEMORY
{
PAGE 0 :
   RAMM0    : origin = 0x000000, length = 0x000400
   RAML1    : origin = 0x009000, length = 0x001000   
   CRC      : origin = 0x3F0000, length = 0x000001
   FLASH    : origin = 0x3F0001, length = 0x007F7F

   CSM_RSVD    : origin = 0x3F7F80, length = 0x000076
   BEGIN_FLASH : origin = 0x3F7FF6, length = 0x000002
   CSM_PWL     : origin = 0x3F7FF8, length = 0x000008

   //BEGIN_H0  : origin = 0x3F8000, length = 0x000002
   RAMH0     : origin = 0x3F8000, length = 0x002000 /*2b00*/
   BOOTROM   : origin = 0x3FF000, length = 0x000FC0
   RESET     : origin = 0x3FFFC0, length = 0x000002
         
PAGE 1 :
   RAMM1    : origin = 0x000400,   length = 0x000480
   RAML0    : origin = 0x008000,   length = 0x001000
}


SECTIONS
{
/* CSM Password Locations */
   passwords         : > CSM_PWL,     PAGE = 0
   csm_rsvd          : > CSM_RSVD,    PAGE = 0


   codestart_rom    : > BEGIN_FLASH, PAGE = 0
  .romtext         : > FLASH,      PAGE = 0

/* DSECT  */
    .reset           : > RESET,      PAGE = 0, TYPE = DSECT
    //vectors         : > VECTORS         PAGE = 0, TYPE = DSECT

/*** Uninitialized Sections ***/
    /* Allocate data areas: */
   .stack           : > RAMM1,       PAGE = 1
   //.ebss           :  > RAMM1|RAML0,     PAGE = 1
   .ebss1           : {
                        .\selftest\post.obj (.ebss)
                        .\error\error.obj (.ebss)
                      } > RAMM1,     PAGE = 1
   .ebss2           : {
                        ebss_start = .;
                        *(.ebss)
                        ebss_end = .;
                      } > RAML0,       PAGE = 1

   .sysmem          : > RAML0,       PAGE = 1

/*** Initialized Sections ***/
   .cinit           : > FLASH,       PAGE = 0
   .switch          : > FLASH,      PAGE = 0

    /*.econst         : {* (.econst)}
                      LOAD = FLASH, PAGE = 0
                      RUN  = RAML0,  PAGE = 1
                      RUN_START(_econst_run_start),
                      LOAD_START(_econst_load_start),
                      LOAD_END(_econst_load_end)*/

   .econst1         : {
                         //.\selftest\crc16.obj (.econst)
                      } > FLASH,    PAGE = 0

   .econst2         : {* (.econst)}
                         LOAD = FLASH, PAGE = 0
                      RUN = RAML0,  PAGE = 1
                      RUN_START(_econst_run_start),
                      LOAD_START(_econst_load_start),
                      LOAD_END(_econst_load_end)

   /*.text           : {*(.text)}
                      LOAD = FLASH, PAGE = 0
                      RUN = RAMH0,  PAGE = 0
                      RUN_START(_text_h0_run_start),
                      LOAD_START(_text_h0_load_start),
                      LOAD_END(_text_h0_load_end)*/

   .text1           : {
                         .\app\rfapp.obj (.text)
                         .\driver\sci_drv.obj (.text)
                         .\error\error.obj (.text)
                         .\selftest\post.obj (.text)
                         .\selftest\background.obj (.text)
                         //.\selftest\crc16.obj (.text)
                         .\driver\eeprom_drv.obj (.text)
                         .\param\param.obj (.text)
                      } > FLASH, PAGE = 0

   .text2           : {
                        .\control\control.obj (.text)
                      } LOAD = FLASH, PAGE = 0
                      RUN = RAML1,  PAGE = 0
                      RUN_START(_text_l1_run_start),
                      LOAD_START(_text_l1_load_start),
                      LOAD_END(_text_l1_load_end)

   .text3           : {*(.text)}
                      LOAD = FLASH, PAGE = 0
                      RUN = RAMH0,  PAGE = 0
                      RUN_START(_text_h0_run_start),
                      LOAD_START(_text_h0_load_start),
                      LOAD_END(_text_h0_load_end)

   .CRC_keep        : > CRC, PAGE = 0

   IQmath           : LOAD = FLASH, PAGE = 0
                      RUN = RAMM0,  PAGE = 0
                      RUN_START(_iqmath_run_start),
                      LOAD_START(_iqmath_load_start),
                      LOAD_END(_iqmath_load_end)

   IQmathTables     : LOAD = BOOTROM, PAGE = 0, TYPE=NOLOAD
}



Codestart更改如下



.def    _start
      .ref    _c_int00
      .ref    __STACK_SIZE
      .ref    _PostExec
     
      .ref    ebss_start
      .ref    ebss_end
      
      .IF     (_DEBUG == 0)
      .ref    _text_h0_run_start
      .ref    _text_h0_load_start
      .ref    _text_h0_load_end
      .ref    _text_l1_run_start
      .ref    _text_l1_load_start
      .ref    _text_l1_load_end
      .ref    _econst_run_start
      .ref    _econst_load_start
      .ref    _econst_load_end
      .ref    _iqmath_run_start
      .ref    _iqmath_load_start
      .ref    _iqmath_load_end
      .ENDIF

;
; If we are in debug mode then jump straight to _c_int00 because the
; debugger has already transferred all of the code from flash to RAM
;
       .if    (_DEBUG == 0)
       .sect  "codestart_rom"
       LB     _start
       .else
       .sect  "codestart_h0"
       LB     _start
       .endif

       .IF    (_DEBUG == 0)
      .sect   "passwords"
      .int    0xFFFF           ; PWL0 (LSW of 128-bit password)
      .int    0xFFFF
      .int    0xFFFF
      .int    0xFFFF
      .int    0xFFFF
      .int    0xFFFF
      .int    0xFFFF
      .int    0xFFFF           ; PWL7 (MSW of 128-bit password)

       .sect   ".CRC_keep"
       .int    0x4B52

      .sect   "csm_rsvd"
      .loop   (0x3F7FF5 - 0x3F7F80 + 1)
      .int    0x0000
      .endloop
      .ENDIF

;-----------------------------------------------
; This function copies the code from the ROM and into
; the RAM. It then transfers control to _c_int00.
;-----------------------------------------------
      .sect   ".romtext"
_start:
      MOV     @SP,#0x0400     ; Initialize the stack pointer
      SETC    OBJMODE
      CLRC    AMODE
      SETC    M0M1MAP
      CLRC    PAGE0
      
      ;----------------------------------------------------------------------
      ; disable the internal watchdog.
      ; We only use the external watchdog.
      ;----------------------------------------------------------------------
      EALLOW
      MOVZ    DP,#0x7028>>6   ; Set data page for WDCR register
      MOV     @0x7029,#0x0068 ; Set WDDIS bit in WDCR to disable WD
      
      ;----------------------------------------------------------------------
      ; On TMX samples, to get the best performance of on chip RAM blocks
      ; M0/M1/L0/L1/H0 internal control registers bit have to be enabled.
      ; The bits are in Device emulation registers.
      ;----------------------------------------------------------------------      
      ; DevEmuRegs.M0RAMDFT = 0x0300;
      ; DevEmuRegs.M1RAMDFT = 0x0300;
      ; DevEmuRegs.L0RAMDFT = 0x0300;
      ; DevEmuRegs.L1RAMDFT = 0x0300;
      ; DevEmuRegs.H0RAMDFT = 0x0300;
              
      ; Initalize PLL
      MOVW    DP,#0x7010>>6
      MOV     @0x7021,#0x000A
   
      ; Wait for PLL to lock  
      MOV     AR0,#5000
settle_loop:
      BANZ    settle_loop,AR0--     ; Loop until AR0 == 0, post-decrement AR0
      
      ; HISPCP/LOSPCP prescale register settings, normally it will be set to
      ; default values
      MOV     @0x701A,#0x0001        ; Set HISPCP
      MOV     @0x701B,#0x0000        ; Set LOSPCP

      ; Enable the periperal clocks
      MOV     @0x701C,#0x1509        ; Enable the MCBSP, SCIA, SPI, EVA, and ADC clocks

      EDIS

      ;----------------------------------------------------------------------
      ; Read the password locations - this will unlock the
      ; CSM only if the passwords are erased. Otherwise it
      ; will not have an effect.
      ;----------------------------------------------------------------------
      MOVL    XAR1,#0x3F7FF8;
      MOVL    XAR0,*XAR1++
      MOVL    XAR0,*XAR1++
      MOVL    XAR0,*XAR1++
      MOVL    XAR0,*XAR1
      
      ;----------------------------------------------------------------------
      ; Perform the Power On Self Test
      ;----------------------------------------------------------------------
      LCR     #_PostExec

      ;----------------------------------------------------------------------
      ; fill the stack
      ;----------------------------------------------------------------------
      MOVL    XAR5,#0x0400
      MOV     AL,#0xBEEF
      MOV     AR0,#__STACK_SIZE - 1

loop4:
      MOV     *XAR5++,AL
      BANZ    loop4,AR0--     ; Loop until count == 0, post-decrement count


      ;----------------------------------------------------------------------
      ; fill the ".ebss" segment with 0
      ;----------------------------------------------------------------------
      MOVL    XAR5,#ebss_start
      MOV     AL,#0x0
      MOV     AR0,#(ebss_end - ebss_start - 1)

loop9:
      MOV     *XAR5++,AL
      BANZ    loop9,AR0--     ; Loop until count == 0, post-decrement count

      ;----------------------------------------------------------------------
      ; copy the .text section from FLASH to RAM
      ;----------------------------------------------------------------------
      .if     (_DEBUG == 0)
      MOVL    XAR5,#_text_h0_run_start
      MOVL    XAR6,#_text_h0_load_start
      MOV     AR0,#(_text_h0_load_end - _text_h0_load_start - 1)
      MOV     ACC,AR0

      BF      endloop,EQ     ; if the counter is zero then skip over the copy

loop:
      MOV     ACC,*XAR6++
      MOV     *XAR5++,ACC
      BANZ    loop,AR0--     ; Loop until AR0 == 0, post-decrement AR0

endloop:

      MOVL    XAR5,#_text_l1_run_start
      MOVL    XAR6,#_text_l1_load_start
      MOV     AR0,#(_text_l1_load_end - _text_l1_load_start - 1)
      MOV     ACC,AR0

      BF      endloop99,EQ     ; if the counter is zero then skip over the copy

loop99:
      MOV     ACC,*XAR6++
      MOV     *XAR5++,ACC
      BANZ    loop99,AR0--     ; Loop until AR0 == 0, post-decrement AR0

endloop99:

      .endif

      ;----------------------------------------------------------------------
      ; copy the .econst section from FLASH to RAM
      ;----------------------------------------------------------------------
      .if     (_DEBUG == 0)
      MOVL    XAR5,#_econst_run_start
      MOVL    XAR6,#_econst_load_start
      MOV     AR0,#(_econst_load_end - _econst_load_start - 1)
      MOV     ACC,AR0

      BF      endloop2,EQ     ; if the counter is zero then skip over the copy

loop2:
      MOV     ACC,*XAR6++
      MOV     *XAR5++,ACC
      BANZ    loop2,AR0--     ; Loop until AR0 == 0, post-decrement AR0

endloop2:
      .endif

      ;----------------------------------------------------------------------
      ; copy the iqmath section from FLASH to RAM
      ;----------------------------------------------------------------------
      .if     (_DEBUG == 0)
      MOVL    XAR5,#_iqmath_run_start
      MOVL    XAR6,#_iqmath_load_start
      MOV     AR0,#(_iqmath_load_end - _iqmath_load_start - 1)
      MOV     ACC,AR0

      BF      endloop3,EQ     ; if the counter is zero then skip over the copy

loop3:
      MOV     ACC,*XAR6++
      MOV     *XAR5++,ACC
      BANZ    loop3,AR0--     ; Loop until AR0 == 0, post-decrement AR0

endloop3:
      .endif

      ;----------------------------------------------------------------------
      ; call the c run time initialization
      ;----------------------------------------------------------------------
      LB      _c_int00

      .sect   ".text"

      .def    _EnterCritical

_EnterCritical:      
      PUSH    DP:ST1     ; We don't card about the DP register,
                         ; but the POP ACC instruction will
                         ; remove 2 words from the stack, so
                         ; we need to put two words on the stack.
      POP     ACC
      DINT
      LRETR

      .def    _ExitCritical
_ExitCritical:
      AND     ACC,#1
      SB      SKIP,NEQ    ; branch if bit is set
      EINT
SKIP:
      LRETR

      .end

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1522

主题

4615

帖子

6

粉丝