Bootloader for S12P128

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Bootloader for S12P128

3,050 Views
Cmux
Contributor II

I am trying to implement a bootloader for S12P. I downloaded the AN3275SW which claims to work for all S12 microcontrollers. But when I flash my microcontroller with the code provided, it hangs in the startup file itself. I modified the code to make it deliberately jump to main. It does so but then it hangs as soon as it comes across any function call. Can you tell me what could be wrong? Are there any software updates for AN3275 or are there any changes I need to do in the Standard Settings in CodeWarrior?

 

-- 

Cmux

Labels (1)
0 Kudos
Reply
6 Replies

1,662 Views
J2MEJediMaster
Specialist I

As designed, CodeWarrior points the reset vector to the _Startup routine, whose code is located in Start12.c. _Startup's purpose is to set up the stack, initialize key processor registers, and other stuff that sets up the C run time environment. After that, _Startup calls main(). If you by-pass that routine, none of the crucial initializations take place, and the MCU soon goes out into the weeds. You are dying on a function call because the stack and its pointer have not been set up.

 

---Tom

0 Kudos
Reply

1,662 Views
Cmux
Contributor II

Oh I am sorry for the confusion. I flashed the AN3275SW code as it was provided on the freescale site also. That too used to hang. I ran the code in the debugger one step at a time and found that it used to hang in the Start12.c file before it could jump to main(). Did anyone else too face this problem when implementing the bootloader?

 

-- 

Cmux

0 Kudos
Reply

1,662 Views
Cmux
Contributor II
 #if defined(__SET_RESET_VECTOR__)
void __interrupt 0 _Startup(void) {
#else
void _Startup(void) {
#endif
/*  purpose:    1)  initialize the stack
                2)  initialize the RAM, copy down init data etc (Init)
                3)  call main;
    parameters: NONE
    called from: _PRESTART-code generated by the Linker
                 or directly referenced by the reset vector */

  /* Enable the Digital input buffer for bit0 */
  ATD0DIEN = 0x01;
  /* wait 2 cycles */
  asm PSHA;
  asm PSHA;
 
  if(PORTAD0_BIT0)
  //if(PORTE & 0x20)
  {
    asm JMP [0xFFFE-BootBlkSize,pcr]/* Run user Program */
  }
  else
  {
    _DISABLE_COP();
    /* My Working RAM is from 0x5000 - 0x57FF */
    INITRM = 0x50;
    INITEE = 0x21;   /* EEPROM if available is located from 0x2000 */
   /* initialize the stack pointer */
   INIT_SP_FROM_STARTUP_DESC(); /*lint !e522 asm code */ /* HLI macro definition in hidef.h */

//   Init(); /* zero out, copy down, call constructors */
   __asm {
ZeroOut:
             LDX   _startupData.pZeroOut    ; *pZeroOut
             LDY   _startupData.nofZeroOuts ; nofZeroOuts
             BEQ   CopyDown                 ; if nothing to zero out

NextZeroOut: PSHY                           ; save nofZeroOuts
             LDY   2,X+                     ; start address and advance *pZeroOut (X = X+4)

             LDD   2,X+                     ; byte count
NextWord:    CLR   1,Y+                     ; clear memory byte
             DBNE  D, NextWord              ; dec byte count

             PULY                           ; restore nofZeroOuts
             DEY                            ; dec nofZeroOuts
             BNE  NextZeroOut
CopyDown:

             LDX   _startupData.toCopyDownBeg ; load address of copy down desc.

NextBlock:
             LDD   2,X+                     ; size of init-data -> D
             BEQ   funcInits                ; end of copy down desc.


             LDY   2,X+                     ; load destination address

Copy:        MOVB  1,X+,1,Y+                ; move a byte from ROM to the data area
             DBNE  D,Copy                   ; copy-byte loop

             BRA   NextBlock
funcInits:                                  ; call of global construtors is only in c++ necessary
   }
   /* Jump to main(); Use JMP instead of CALL to not use space on Stack*/
   asm JMP main;
  }
}

 

This is the Start12.c file that is included with the AN3275SW. When I run my code the microcontroller just hangs. I then set a breakpoint at asm JMP main and ran the code, it never reached the breakpoint and just hung. I am using S12P128. Are there any device-specific changes I need to make in the code to get it working?

 

-- 

Cmux

0 Kudos
Reply

1,662 Views
kef
Specialist I
AN3275 is not compatible with S12P. Compared to "classic" S12, flash module is different, no INITRM register, different memory map etc.
0 Kudos
Reply

1,662 Views
Cmux
Contributor II

Oh if that is the case, is there a bootloader software provided by Freescale for S12P or will I have to write it myself?

 

-- 

Cmux

0 Kudos
Reply

1,662 Views
J2MEJediMaster
Specialist I

I would begin by creating a project for the S12P and use the start12.c file it produces. Unless the app note does something very special in the startup code, the start12.c file generated by the wizard should work. If something must be modified to support the bootloader, you would edit this startup file.

 

---Tom

0 Kudos
Reply