Part Number: TMS320F28386D
Other Parts Discussed in Thread: C2000WARE
Hi,
I want to jump to CM entry address and restart the main() program. How can I do?
I defined below:
#define BOOTMODE_ENTRY_POINT_CM 0x00200000
void (*BootfuncPtr)(void) = (void (*)(void))BOOTMODE_ENTRY_POINT_CM;
And I called:
(*BootfuncPtr)();
However it go into faultISR() infinite loop.
It is my CM .cmd
MEMORY
{
/* Flash sectors */
CMBANK0_RESETISR : origin = 0x00200000, length = 0x00000008 /* Boot to Flash Entry Point */
/* Start : Bootloader */
/* CMBANK0_SECTOR0 : origin = 0x00200008, length = 0x00003FF8 */
/* CMBANK0_SECTOR1 : origin = 0x00204000, length = 0x00004000 */
CMBANK0_SECTOR01 : origin = 0x00200010, length = 0x00007F70
CMBANK0_SECTOR_BOOTINFO : origin = 0x00207F80, length = 0x00000080
/* End : Bootloader */
/* CMBANK0_SECTOR2 : origin = 0x00208000, length = 0x00004000 */
/* CMBANK0_SECTOR3 : origin = 0x0020C000, length = 0x00004000 */
/* CMBANK0_SECTOR4 : origin = 0x00210000, length = 0x00010000 */
/* CMBANK0_SECTOR5 : origin = 0x00220000, length = 0x00010000 */
/* CMBANK0_SECTOR6 : origin = 0x00230000, length = 0x00010000 */
/* CMBANK0_SECTOR7 : origin = 0x00240000, length = 0x00010000 */
/* CMBANK0_SECTOR8 : origin = 0x00250000, length = 0x00010000 */
/* CMBANK0_SECTOR9 : origin = 0x00260000, length = 0x00010000 */
/* CMBANK0_SECTOR10 : origin = 0x00270000, length = 0x00004000 */
/* CMBANK0_SECTOR11 : origin = 0x00274000, length = 0x00004000 */
/* CMBANK0_SECTOR12 : origin = 0x00278000, length = 0x00004000 */
/* CMBANK0_SECTOR13 : origin = 0x0027C000, length = 0x00003FA0 */
/* CMBANK0_APPINFO : origin = 0x0027FFA0, length = 0x00000060 */
C1RAM : origin = 0x1FFFC000, length = 0x00002000
C0RAM : origin = 0x1FFFE000, length = 0x00002000
BOOT_RSVD : origin = 0x20000000, length = 0x00000800 /* Part of S0, BOOT rom will use this for stack */
S0RAM : origin = 0x20000800, length = 0x00003800
/* S1RAM : origin = 0x20004000, length = 0x00004000
S2RAM : origin = 0x20008000, length = 0x00004000
S3RAM : origin = 0x2000C000, length = 0x00004000*/
S1S3RAM : origin = 0x20004000, length = 0x0000C000
E0RAM : origin = 0x20010000, length = 0x00004000
CPU1TOCMMSGRAM1 : origin = 0x20080000, length = 0x00000600
CPU1TOCMMSGRAM2 : origin = 0x20080600, length = 0x00000A00
CMTOCPU1MSGRAM1 : origin = 0x20082000, length = 0x00000600
CMTOCPU1MSGRAM2 : origin = 0x20082600, length = 0x00000A00
CPU2TOCMMSGRAM1 : origin = 0x20084000, length = 0x00000600
CPU2TOCMMSGRAM2 : origin = 0x20084600, length = 0x00000A00
CMTOCPU2MSGRAM1 : origin = 0x20086000, length = 0x00000600
CMTOCPU2MSGRAM2 : origin = 0x20086600, length = 0x00000A00
}
SECTIONS
{
.resetisr : > CMBANK0_RESETISR, ALIGN(16)
.vftable : > CMBANK0_SECTOR01, ALIGN(16) /* Application placed vector table in Flash*/
.vtable : > S0RAM /* Application placed vector table in RAM*/
.text : > CMBANK0_SECTOR01, ALIGN(16)
.cinit : > CMBANK0_SECTOR01, ALIGN(16)
.pinit : > CMBANK0_SECTOR01, ALIGN(16)
.switch : > CMBANK0_SECTOR01, ALIGN(16)
.sysmem : > S1S3RAM
.stack : > C0RAM
.ebss : > C1RAM
.econst : > CMBANK0_SECTOR01, ALIGN(16)
.esysmem : > C1RAM
.data : > S1S3RAM
.bss : > S1S3RAM
.const : > CMBANK0_SECTOR01, ALIGN(16)
ramfuncs : {} LOAD = CMBANK0_SECTOR01,
RUN = E0RAM,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(16)
/* BootInfo */
BootInfoFiles : > CMBANK0_SECTOR_BOOTINFO, ALIGN(16)
GROUP : > CMTOCPU1MSGRAM1
{
PUSHBUFFER_CPU1
PUSHWRITEIDX_CPU1
POPREADIDX_CPU1
SENDDATA_CPU1
PUTBUFFER_CPU1
PUTWRITEIDX_CPU1
GETREADIDX_CPU1
}
GROUP : > CPU1TOCMMSGRAM1
{
POPBUFFER_CPU1 : TYPE = DSECT
POPWRITEIDX_CPU1 : TYPE = DSECT
PUSHREADIDX_CPU1 : TYPE = DSECT
RCVDATA_CPU1 : TYPE = DSECT
GETBUFFER_CPU1 : TYPE = DSECT
GETWRITEIDX_CPU1 : TYPE = DSECT
PUTREADIDX_CPU1 : TYPE = DSECT
}
GROUP : > CMTOCPU2MSGRAM1
{
PUSHBUFFER_CPU2
PUSHWRITEIDX_CPU2
POPREADIDX_CPU2
SENDDATA_CPU2
PUTBUFFER_CPU2
PUTWRITEIDX_CPU2
GETREADIDX_CPU2
}
GROUP : > CPU2TOCMMSGRAM1
{
POPBUFFER_CPU2 : TYPE = DSECT
POPWRITEIDX_CPU2 : TYPE = DSECT
PUSHREADIDX_CPU2 : TYPE = DSECT
RCVDATA_CPU2 : TYPE = DSECT
GETBUFFER_CPU2 : TYPE = DSECT
GETWRITEIDX_CPU2 : TYPE = DSECT
PUTREADIDX_CPU2 : TYPE = DSECT
}
GROUP : > CPU1TOCMMSGRAM2
{
CPU1RefVariableFiles : TYPE = DSECT
MIII_StationAddrFiles : TYPE = DSECT
MIII_MsgRbuffFiles : TYPE = DSECT
}
GROUP : > CMTOCPU1MSGRAM2
{
CMRefVariableCPU1Files
MIII_MsgSbuffFiles
}
GROUP : > CPU2TOCMMSGRAM2
{
CPU2RefVariableFiles : TYPE = DSECT
}
GROUP : > CMTOCPU2MSGRAM2
{
CMRefVariableCPU2Files
}
}
/*
//===========================================================================
// End of file.
//===========================================================================
*/
In CPU1 and CPU2, this method works perfectly to restart the main(), like below:
#define BOOTMODE_ENTRY_POINT 0x080000
void (*BootfuncPtr)(void) = (void (*)(void))BOOTMODE_ENTRY_POINT;
(*BootfuncPtr)();
How can I do in CM?
