Other Parts Discussed in Thread: UNIFLASH, C2000WARE
Hi,
I'm using the universal_motor_control (UMC) example from the TI motorcontrol SDK together with the DFU example.
The UMC seems to have a pretty advanced linker file and is missing the { -l FlashAPI_F28002x_FPU32.lib} command:
/* // FILE: f28002x_flash_lib_is_eabi.cmd // // TITLE: Linker Command File For F280025 examples that run out of Flash // // // Keep in mind that L4, L5,L6 and L7 are protected by the code // security module. // // What this means is in most cases you will want to move to // another memory map file which has more memory defined. // */ MEMORY { BEGIN : origin = 0x00084000, length = 0x00000002 BOOT_RSVD : origin = 0x00000002, length = 0x00000126 /* RAMLS5 : origin = 0x0000A800, length = 0x00000800 */ /* RAMLS6 : origin = 0x0000B000, length = 0x00000800 */ /* RAMLS7 : origin = 0x0000B800, length = 0x00000800 */ RAMLS567 : origin = 0x0000A600, length = 0x00001A00 /* Flash sectors */ /* BANK 0 */ /* FLASHBANK0_SECT0 : origin = 0x00080002, length = 0x00000FFE */ FLASHBANK0_BOOT : origin = 0x00084002, length = 0x00000FFE /* remote update */ /* FLASHBANK0_SECT1 : origin = 0x00081000, length = 0x00001000 */ /* FLASHBANK0_SECT2 : origin = 0x00082000, length = 0x00001000 */ /* FLASHBANK0_SECT3 : origin = 0x00083000, length = 0x00001000 */ /* FLASHBANK0_SECT4 : origin = 0x00084000, length = 0x00001000 */ /* FLASHBANK0_SECT5 : origin = 0x00085000, length = 0x00001000 */ /* FLASHBANK0_SECT6 : origin = 0x00086000, length = 0x00001000 */ /* FLASHBANK0_SECT7 : origin = 0x00087000, length = 0x00001000 */ /* FLASHBANK0_SECT8 : origin = 0x00088000, length = 0x00001000 */ /* FLASHBANK0_SECT9 : origin = 0x00089000, length = 0x00001000 */ /* FLASHBANK0_SECT10 : origin = 0x0008A000, length = 0x00001000 */ /* FLASHBANK0_SECT11 : origin = 0x0008B000, length = 0x00001000 */ /* FLASHBANK0_SECT12 : origin = 0x0008C000, length = 0x00001000 */ /* FLASHBANK0_SECT13 : origin = 0x0008D000, length = 0x00001000 */ FLASHBANK0_CODE : origin = 0x00085000, length = 0x00008000 /* control code */ /* FLASHBANK0_SECT14 : origin = 0x0008E000, length = 0x00001000 */ FLASHBANK0_DATA : origin = 0x0008D000, length = 0x00001000 /* constant data */ FLASHBANK0_SECT15 : origin = 0x0008F000, length = 0x000FF0 FLASHBANK0_SEC15_RSVD : origin = 0x08FFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ BOOTROM : origin = 0x003F0000, length = 0x00008000 BOOTROM_EXT : origin = 0x003F8000, length = 0x00007FC0 RESET : origin = 0x003FFFC0, length = 0x00000002 RAMM0S : origin = 0x00000128, length = 0x00000118 /* stack, on-chip RAM block M0 part */ RAMM1D : origin = 0x00000240, length = 0x000005B8 /* on-chip RAM block M0 part & M1 */ RAMM1_RSVD : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ RAMGS0 : origin = 0x0000C000, length = 0x000007F8 RAMGS0_RSVD : origin = 0x0000C7F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ RAMLS4 : origin = 0x0000A000, length = 0x00000600 } SECTIONS { .reset : > RESET, TYPE = DSECT codestart : > BEGIN, ALIGN(8) .text : > FLASHBANK0_CODE, ALIGN(8) .cinit : > FLASHBANK0_CODE, ALIGN(8) .switch : > FLASHBANK0_CODE, ALIGN(8) .cio : > FLASHBANK0_CODE .pinit : > FLASHBANK0_CODE, ALIGN(8) .const : > FLASHBANK0_CODE, ALIGN(8) .init_array : > FLASHBANK0_CODE, ALIGN(8) GROUP { #if defined(SFRA_ENABLE) .TI.ramfunc { -l sfra_f32_tmu_eabi.lib<sfra_f32_tmu_collect.obj> (.text) -l sfra_f32_tmu_eabi.lib<sfra_f32_tmu_inject.obj> (.text) } #else .TI.ramfunc /*{ -l FlashAPI_F28002x_FPU32.lib}*/ #endif ramfuncs /* Digital Controller Library functions */ dclfuncs dcl32funcs } LOAD = FLASHBANK0_CODE RUN = RAMLS567, LOAD_START(RamfuncsLoadStart), LOAD_SIZE(RamfuncsLoadSize), LOAD_END(RamfuncsLoadEnd), RUN_START(RamfuncsRunStart), RUN_SIZE(RamfuncsRunSize), RUN_END(RamfuncsRunEnd), ALIGN(2) ctrlfuncs : { } LOAD = FLASHBANK0_CODE RUN = RAMLS567, LOAD_START(ctrlfuncsLoadStart), LOAD_SIZE(ctrlfuncsLoadSize), LOAD_END(ctrlfuncsLoadEnd), RUN_START(ctrlfuncsRunStart), RUN_SIZE(ctrlfuncsRunSize), RUN_END(ctrlfuncsRunEnd), ALIGN(2) .stack : > RAMM0S .bss : > RAMM1D .bss:output : > RAMM1D .bss:cio : > RAMM1D .data : > RAMM1D .sysmem : > RAMM1D est_data : > RAMLS4 } SECTIONS { prms_data : > FLASHBANK0_DATA GROUP { user_data foc_data } LOAD = RAMM1D LOAD_START(ctrlVarsLoadStart), LOAD_SIZE(ctrlVarsLoadSize), LOAD_END(ctrlVarsLoadEnd) GROUP { sys_data ctrl_data motor_data } LOAD = RAMGS0 LOAD_START(motorVarsLoadStart), LOAD_SIZE(motorVarsLoadSize), LOAD_END(motorVarsLoadEnd) GROUP { vibc_data dmaBuf_data datalog_data graph_data sfra_data SFRA_F32_Data } LOAD = RAMGS0 LOAD_START(extVarsLoadStart), LOAD_SIZE(extVarsLoadSize), LOAD_END(extVarsLoadEnd) } /* //=========================================================================== // End of file. //=========================================================================== */
So, when I flash this application with the bootloader and choose a start address of 0x084000, this example does not work (crashs somehow). So I have choosen the blinky example and added this linker script to it and flashed it with the bootloader and there is the same behaviour (seems to jump to another address and after a restart, I cannot see anything in the flash with UNIFLASH except the bootloader). When I'm flashing the blinky example with the standard linker script and the bootloader, everything works just fine and I can restart the application from the bootloader without any trouble.
Standard Linker Script that works:
-stack 0x380 MEMORY { BEGIN : origin = 0x084000, length = 0x000002 BOOT_RSVD : origin = 0x00000002, length = 0x00000126 RAMM0 : origin = 0x00000128, length = 0x000002D8 RAMM1 : origin = 0x00000400, length = 0x000003F8 /* on-chip RAM block M1 */ // RAMM1_RSVD : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ /* RAMLS4 : origin = 0x0000A000, length = 0x00000800 RAMLS5 : origin = 0x0000A800, length = 0x00000800 RAMLS6 : origin = 0x0000B000, length = 0x00000800 RAMLS7 : origin = 0x0000B800, length = 0x00000800*/ /* Combining all the LS RAMs */ RAMLS4567 : origin = 0x0000A000, length = 0x00002000 RAMGS0 : origin = 0x0000C000, length = 0x000007F8 // RAMGS0_RSVD : origin = 0x0000C7F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ BOOTROM : origin = 0x003F0000, length = 0x00008000 BOOTROM_EXT : origin = 0x003F8000, length = 0x00007FC0 /*RESET : origin = 0x003FFFC0, length = 0x00000002*/ RESET : origin = 0x003FFFC0, length = 0x00000002 /* Flash sectors */ /* BANK 0 */ FLASH_BANK0_SEC0 : origin = 0x080002, length = 0x000FFE /* on-chip Flash */ FLASH_BANK0_SEC1 : origin = 0x081000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC2 : origin = 0x082000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC3 : origin = 0x083000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC4 : origin = 0x084002, length = 0x000FFE /* on-chip Flash */ FLASH_BANK0_SEC5 : origin = 0x085000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC6 : origin = 0x086000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC7 : origin = 0x087000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC8 : origin = 0x088000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC9 : origin = 0x089000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC10 : origin = 0x08A000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC11 : origin = 0x08B000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC12 : origin = 0x08C000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC13 : origin = 0x08D000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC14 : origin = 0x08E000, length = 0x001000 /* on-chip Flash */ FLASH_BANK0_SEC15 : origin = 0x08F000, length = 0x000FF0 /* on-chip Flash */ // FLASH_BANK0_SEC15_RSVD : origin = 0x08FFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ } SECTIONS { .reset : > RESET, TYPE = DSECT /* not used, */ codestart : > BEGIN, ALIGN(8) /*Necessary, otherwise it will not restart */ .text : >> FLASH_BANK0_SEC5, ALIGN(8) .cinit : > FLASH_BANK0_SEC6, ALIGN(8) .switch : > FLASH_BANK0_SEC6, ALIGN(8) .stack : > RAMM1 .init_array : > FLASH_BANK0_SEC6, ALIGN(8) .bss : > RAMLS4567 .bss:output : > RAMLS4567 .bss:cio : > RAMGS0 .const : > FLASH_BANK0_SEC6, ALIGN(8) .data : > RAMLS4567 .sysmem : > RAMLS4567 ramgs0 : > RAMGS0 GROUP { .TI.ramfunc { -l FlashAPI_F28002x_FPU32.lib} }LOAD = FLASH_BANK0_SEC6, RUN = RAMLS4567, LOAD_START(RamfuncsLoadStart), LOAD_SIZE(RamfuncsLoadSize), LOAD_END(RamfuncsLoadEnd), RUN_START(RamfuncsRunStart), RUN_SIZE(RamfuncsRunSize), RUN_END(RamfuncsRunEnd), ALIGN(8) DataBufferSection : > RAMGS0, ALIGN(8) } /* //=========================================================================== // End of file. //=========================================================================== */ /* //=========================================================================== // End of file. //=========================================================================== */
I then adjusted the linker script by adding the { -l FlashAPI_F28002x_FPU32.lib} in the blinky example and voila, everything works as expected. So I think I also need to add this to the UMC example, but it seems gives me out some random linker errors when i add this library.
So, what exactly does the { -l FlashAPI_F28002x_FPU32.lib} do and can I add it to the UMC?