我的板子是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 |
|