AnsweredAssumed Answered

Writing to RAM resets the MPC5668G

Question asked by Pierre SCHMIDT on Oct 10, 2013
Latest reply on Oct 15, 2013 by Mark Elson



I have a programm in assembly language which generates a reset on the MPC5668G (the DS3 red LED on the MPC5668EVB turns on) when writing into RAM.


There is word 0x015A0000 at 0x10000 which is a correct RCHW so that execution starts in flash at address 0x1001C (__start) with following code:


                                                     ; nop statements included to allow debugging with iSystem debugger
                                                     ; jump to the second nop statement to test resets
   e_ori r0,r0,00000000
   e_ori r0,r0,00000000

; Setup exception registers
   e_lis       r1, _ivor@ha                              ; Load address of exception handler
   e_add16i    r1, r1, _ivor@l
   mtspr       63, r1                                    ; Initialize IVPR with high word
   mtspr       400, r1                                   ; Initialize IVOR0 with low word
   mtspr       401, r1                                   ; IVOR1
   mtspr       402, r1                                   ; ...
   mtspr       403, r1
   mtspr       404, r1
   mtspr       405, r1
   mtspr       406, r1
   mtspr       407, r1
   mtspr       408, r1
   mtspr       409, r1
   mtspr       410, r1
   mtspr       411, r1
   mtspr       412, r1
   mtspr       413, r1
   mtspr       414, r1                                   ; ...
   mtspr       415, r1                                   ; IVOR15
   mtspr       528, r1                                   ; IVOR32
   mtspr       529, r1                                   ; ...
   mtspr       530, r1                                   ; IVOR34

; Initialize memory pointer registers
   e_lis       r1, __SP_INIT@ha                          ; Initialize stack pointer r1 to
   e_add16i    r1, r1, __SP_INIT@l                       ; value in linker command file.
   e_lis       r13, _SDA_BASE_@ha                        ; Initialize r13 to sdata base
   e_add16i    r13,r13,_SDA_BASE_@l                      ; (provided by linker).
   e_lis       r2, _SDA2_BASE_@ha                        ; Initialize r2 to sdata2 base
   e_add16i    r2, r2,_SDA2_BASE_@l                      ; (provided by linker)

                                                         ; Set GPR9 to the count of the SRAM load size
   e_lis       r3, __ROM_COPY_SIZE@ha                    ; Load upper SRAM load size (# of bytes) into R9
   e_add16i    r3,r3, __ROM_COPY_SIZE@l                  ; Load lower SRAM load size into R9
                                                         ;  The "." sets the condition flag
   e_cmp16i    r3,0

   e_bc        01,02,_romcopy_end                              ; Exit cfg_ROMCPY if size is zero

   e_andi      r6, r3, 0x03

   se_srwi     r3, 2
   mtctr       r3                                        ; Store # of bytes to be moved in spr CTR

   e_lis       r10, __TEXT_ROM@ha                        ; Load address of first SRAM load into R10
   e_add16i    r10,r10, __TEXT_ROM@l                     ; Load lower address of SRAM load into R10
   e_addi      r10,r10, - 4                              ; Decrement address to prepare for ROMCPYLOOP   

   e_lis       r5, __DATA_RAM_START@ha                   ; Load upper SRAM address into R5
   e_add16i    r5, r5, __DATA_RAM_START@l                ; Load lower SRAM address into R5
   se_subi     r5,4                                      ; Decrement address to prepare for ROMCPYLOOP

   e_lwzu      r4, 4(r10)                                ; Load data byte at R10 into R4,incrementing (update) ROM address
  e_stwu      r4, 4(r5)                                 ; Store R4 data byte into SRAM at R5 and update SRAM address
   e_bc        02,00,_romcopy_dataloop                   ; Branch if more bytes to load from ROM

   e_cmp16i    r6,0
   e_bc        01,02,_romcopy_end


The instruction which causes the reset is e_stwu      r4, 4(r5) which writes contents of R4 to the location pointed by R5+4


Is there a special initilisation to do prior to writing in RAM??


Thanks a lot.