This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28335: On the fly programming of controller

Part Number: TMS320F28335


Hi Everyone..!!!

I am new to this so let me explain my case:

1. I flashed a code of LED blinking(Using timer1)

2. Code which is already flashed is having the Flash APIs configured. The flash APIs execution is controlled by an external command by switch(GPIO59)

3. After switch operation, I am getting correct version of lib file, also my erase, program(Random data) and verify is getting passed(Using CCS and Debugger for flashing)

4. I am using a buffer in the code to create the random data which is getting flashed (Using a different sector of Flash form the sector in which code is running, for this experiment)

Question: I am trying to burn my controller on the fly. What part of new hex file should be programmed and How should I start writing new hex file into the flash. Is it like the complete hex file needs to be written in flash, if yes then how to divide the hex file for each sector...?

Your Support will be appreciated.

Thank You in advance,

Regards,

RS

  • RS,

    Please take a look at this app note https://www.ti.com/lit/sprabv4 , while it is focused on serial bootloaders I think it will have the details on creating the image for flashing that you are referencing.  Let me know if you need more info.

    Best

    Matthew

  • Hi,

    Thanks for the support...!!!

    I have gone through the document and what I found is, it describes about the kernels using serial. Are you suggesting me to use kernels...?

    My case I think is little different. I already have one code running and on the fly(without reboot) I want to update my flash. Is it not possible without kernels..?

    The document at page 5 and point 7 is talking about application code transfer block by block. The application code is the complete hex file or what...?

    At last, as I already have a code in controller, I am eligible to receive data over serial and can put in buffer. The data received in buffer is then flashed using APIs. Question is how to send the hex file over serial so I can write word by word in flash..? what should be the start location in the flash from which I should start writing flash...?  and what portion should be kept in which sector of flash..?

    I am attaching my linker command for your reference:

    MEMORY
    {
    PAGE 0:    /* Program Memory */
               /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
    
       ZONE0       : origin = 0x004000, length = 0x001000     /* XINTF zone 0 */
       RAML0       : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0 */
       RAML1       : origin = 0x009000, length = 0x001000     /* on-chip RAM block L1 */
       RAML2       : origin = 0x00A000, length = 0x001000     /* on-chip RAM block L2 */
       RAML3       : origin = 0x00B000, length = 0x001000     /* on-chip RAM block L3 */
       ZONE6       : origin = 0x0100000, length = 0x100000    /* XINTF zone 6 */ 
       ZONE7A      : origin = 0x0200000, length = 0x00FC00    /* XINTF zone 7 - program space */ 
       FLASHH      : origin = 0x300000, length = 0x008000     /* on-chip FLASH */
       FLASHG      : origin = 0x308000, length = 0x008000     /* on-chip FLASH */
       FLASHF      : origin = 0x310000, length = 0x008000     /* on-chip FLASH */
       FLASHE      : origin = 0x318000, length = 0x008000     /* on-chip FLASH */
       FLASHD      : origin = 0x320000, length = 0x008000     /* on-chip FLASH */
       FLASHC      : origin = 0x328000, length = 0x008000     /* on-chip FLASH */
       FLASHA      : origin = 0x338000, length = 0x007F80     /* on-chip FLASH */
       CSM_RSVD    : origin = 0x33FF80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */
       BEGIN       : origin = 0x33FFF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */
       CSM_PWL     : origin = 0x33FFF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */
       OTP         : origin = 0x380400, length = 0x000400     /* on-chip OTP */
       ADC_CAL     : origin = 0x380080, length = 0x000009     /* ADC_cal function in Reserved memory */
       
       IQTABLES    : origin = 0x3FE000, length = 0x000b50     /* IQ Math Tables in Boot ROM */
       IQTABLES2   : origin = 0x3FEB50, length = 0x00008c     /* IQ Math Tables in Boot ROM */  
       FPUTABLES   : origin = 0x3FEBDC, length = 0x0006A0     /* FPU Tables in Boot ROM */
       ROM         : origin = 0x3FF27C, length = 0x000D44     /* Boot ROM */        
       RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */
       VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */
    
    PAGE 1 :   /* Data Memory */
               /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
               /* Registers remain on PAGE1                                                  */
       
       BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */
       RAMM0       : origin = 0x000050, length = 0x0003B0     /* on-chip RAM block M0 */
       RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
       RAML4       : origin = 0x00C000, length = 0x001000     /* on-chip RAM block L1 */
       RAML5       : origin = 0x00D000, length = 0x001000     /* on-chip RAM block L1 */
       RAML6       : origin = 0x00E000, length = 0x001000     /* on-chip RAM block L1 */
       RAML7       : origin = 0x00F000, length = 0x001000     /* on-chip RAM block L1 */
       ZONE7B      : origin = 0x20FC00, length = 0x000400     /* XINTF zone 7 - data space */
       FLASHB      : origin = 0x330000, length = 0x008000     /* on-chip FLASH */
    }
    
    /* Allocate sections to memory blocks.
       Note:
             codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code 
                       execution when booting to flash
             ramfuncs  user defined section to store functions that will be copied from Flash into RAM
    */ 
     
    SECTIONS
    {
     
       /* Allocate program areas: */
       /* The Flash API functions can be grouped together as shown below.
          The defined symbols _Flash28_API_LoadStart, _Flash28_API_LoadEnd
          and _Flash28_API_RunStart are used to copy the API functions out
          of flash memory and into SARAM */
    
       Flash28_API:
       {
            -lFlash28335_API_V210.lib(.econst) 
            -lFlash28335_API_V210.lib(.text)
       }                   LOAD = FLASHD, 
                           RUN = RAML0,  
                           LOAD_START(_Flash28_API_LoadStart),
                           LOAD_END(_Flash28_API_LoadEnd),
                           RUN_START(_Flash28_API_RunStart),
                           PAGE = 0
       .cinit              : > FLASHA      PAGE = 0
       .pinit              : > FLASHA,     PAGE = 0
       .text               : > FLASHA      PAGE = 0
       codestart           : > BEGIN       PAGE = 0
       ramfuncs            : LOAD = FLASHD, 
                             RUN = RAML0, 
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_END(_RamfuncsLoadEnd),
                             RUN_START(_RamfuncsRunStart),
                             PAGE = 0
    
       csmpasswds          : > CSM_PWL     PAGE = 0
       csm_rsvd            : > CSM_RSVD    PAGE = 0
       
       /* Allocate uninitalized data sections: */
       .stack              : > RAMM1       PAGE = 1
       .ebss               : > RAML4       PAGE = 1
       .esysmem            : > RAMM1       PAGE = 1
    
       /* Initalized sections go in Flash */
       /* For SDFlash to program these, they must be allocated to page 0 */
       .econst             : > FLASHA      PAGE = 0
       .switch             : > FLASHA      PAGE = 0      
    
       /* Allocate IQ math areas: */
       IQmath              : > FLASHC      PAGE = 0                  /* Math Code */
       IQmathTables     : > IQTABLES,  PAGE = 0, TYPE = NOLOAD 
       IQmathTables2    : > IQTABLES2, PAGE = 0, TYPE = NOLOAD 
       FPUmathTables    : > FPUTABLES, PAGE = 0, TYPE = NOLOAD 
             
       /* Allocate DMA-accessible RAM sections: */
       DMARAML4         : > RAML4,     PAGE = 1
       DMARAML5         : > RAML5,     PAGE = 1
       DMARAML6         : > RAML6,     PAGE = 1
       DMARAML7         : > RAML7,     PAGE = 1
       
       /* Allocate 0x400 of XINTF Zone 7 to storing data */
       ZONE7DATA        : > ZONE7B,    PAGE = 1
    
       /* .reset is a standard section used by the compiler.  It contains the */ 
       /* the address of the start of _c_int00 for C Code.   /*
       /* When using the boot ROM this section and the CPU vector */
       /* table is not needed.  Thus the default type is set here to  */
       /* DSECT  */ 
       .reset              : > RESET,      PAGE = 0, TYPE = DSECT
       vectors             : > VECTORS     PAGE = 0, TYPE = DSECT
       
       /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
       .adc_cal     : load = ADC_CAL,   PAGE = 0, TYPE = NOLOAD
    
    }

    Your Support will be appriciated. 

    Thank You in advance.

    Regards,

    RS

  • RS,

    Thanks for the additional color on you requirement/use case.  We have app notes that detail the process of live FW update that should be more inline to what you want to do:

    https://www.ti.com/lit/spruiu8

    and

    https://www.ti.com/lit/spruiu9

    You will see mention in both these app notes of single or dual flash banks.  The F2833x device has a single flash bank so you'll want to keep that in mind when go through the app notes.

    Best,
    Matthew

  • Hi...

    Generated hex file in ascii format which gave me direct data of flash.

    Thank You,