PEmicro Blog

Save Data From Erase Module Using Preserve Range

Oct 10, 2008

The Erase Module function of PEmicro programming algorithms generally erases all data in a flash module. Sometimes a user may not wish to fully erase the flash. On algorithms which support selective erase functions (like Erase Object Ranges or Erase Range), those mechanisms can be used instead to only erase the regions desired. On algorithms which only support Erase Module, the algorithm itself can be modified to preserve certain ranges of flash memory. Before erasing the flash, the programmer looks at the ranges to be preserved, saves it, and reprograms it automatically after the Flash/EEPROM has been erased. Some settings in some flashes (like timing TRIM parameters) are automatically preserved.

The user can easily preserve their own specific flash ranges with a couple of modifications to the header of the programming algorithm. A flash programming algorithm is a text file which describes how a particular flash block is to be programmed. The algorithm contains a configuration section as well as some s-record data which implements the programming process. User's commonly will modify the configuration section to change the behavior of the programming algorithm, such as to add ranges of data to preserve.

Flash algorithms describe flash blocks as having either a fixed address (common for internal flash on a microcontroller) or a variable address (common for flash chips external to a microprocessor). Algorithms which do not have a fixed address for the flash will prompt the user for the base address of the flash at the time of programming. In either case, the algorithm can be used to specify ranges of flash to preserve relative to the start of the flash block.

For an algorithm with a fixed address for the flash block, the following line will indicate the flash block location:

NO_BASE_ADDRESS=NNNNNNNN/     ; NNNNNNNN is a Hexadecimal value indicating the start of flash

Do not modify the NO_BASE_ADDRESS line! You are simply going to add some lines after it which indicate that you wish to preserve certain ranges relative to the base address. The configuration line(s) you should add directly after the NO_BASE_ADDRESS line should have the following format (very strictly formatted - no spaces allowed and include all forward slashes):

PRESERVE_RANGE=SSSSSSSS/EEEEEEEE/     ; SSSSSSSS is the starting offset, EEEEEEEE is ending offset

Adding this line would preserve the following memory range : 

NNNNNNNN+SSSSSSSS to NNNNNNNN+EEEEEEEE.

Example:

If there was an algorithm which was designed to program a flash block with address range $4000-$FFFF, you would see the following configuration in the flash algorithm:

NO_BASE_ADDRESS=00004000/         ;Fixed at $4000
ADDR_RANGE=00000000/0000BFFF/00/FFFFFFC0/FFFFFE00/     ; $4000-$FFFF

 

Do not modify these lines! If you wanted to preserve a certain memory range, you would specify it after the line with the NO_BASE_ADDRESS command (which sets the base address) and before the lines with ADDR_RANGE. If you wanted to preserve the memory from address $F000-$F001, you would add the bolded line as follows:

NO_BASE_ADDRESS=00004000/         ;Fixed at $4000
PRESERVE_RANGE=0000B000/0000B001/     ; Preserve $0000F000-$0000F001
ADDR_RANGE=00000000/0000BFFF/00/FFFFFFC0/FFFFFE00/     ; $4000-$FFFF

Note that the preserve_range command requires the offset from the base address of your memory. If you add $4000 to $B000 and $B001, you have $F000 and $F001.

In addition, this functionality does not limit the user to preserving only 1 range or one address. The function can be called several times in the algorithm if several ranges and/or addresses need to be preserved, or if the Flash/EEPROM is segmented into several fields or extended into pages.

Example:

For the flash block above (from $4000 to $FFFF), if the user wished to preserve addresses $5001, $5006 and ranges $CCAA-$CCBB and $D123-$DFFF, the following segment would be added to the algorithm:

NO_BASE_ADDRESS=00004000/         ;Fixed at $4000
PRESERVE_RANGE=00001001/00001001/    ; 5001-4000
PRESERVE_RANGE=00001006/00001006/    ; 5006-4000
PRESERVE_RANGE=00008CAA/00008CBB/    ; CCAA-4000/CCBB-4000
PRESERVE_RANGE=00009123/00009FFF/    ; D123-4000/DFFF-4000
ADDR_RANGE=00000000/0000BFFF/00/FFFFFFC0/FFFFFE00/     ; $4000-$FFFF

Example:

It is also possible to preserve several different segments across different pages of Flash/EEPROM. The user should know how to access each page of memory logically in the software. Let's look at the HCS08 AC128. The paged Flash memory can be accessed with the following ranges. This will typcially be described in the configuration section of the programming algorithm.

$08000-$0BFFF --> Page 0
$18000-$1BFFF --> Page 1
$28000-$2BFFF --> Page 2 
$38000-$3BFFF --> Page 3 
etc.

If the user wanted to preserve memory on page 0 from $08000-$08005 and on page 3 from $38000-$38005, he would add the following commands :

NO_BASE_ADDRESS=000020F0/         ;Fixed at $20F0
PRESERVE_RANGE=00005F10/00005F15/    ; Preserve $08000-$08005
PRESERVE_RANGE=00035F10/00035F15/    ; Preserve $38000-$38005
ADDR_RANGE=00000000/0000DF0F/00/FFFFFFC0/FFFFFE00/     ; $20F0-$FFFF

Note again that the offset $20F0 is added to the parameters of the command to calculate the correct paged memory ranges to preserve. Add $20F0 to $5F10 to get $08000 and add $20F0 to $35F10 to get $38000.  

The PROG software will report a checksum error and warn that the algorithm has been modified. This error can be ignored. If you wish to remove the warning, please use our command-line ADDCRC utility to update the checksum.


The Blank Check command will now fail because of the preserved data. Also note that the Verify Module command will ignore the addresses that are preserved when comparing memory against an S-record.


Any information which follows a semicolon (;) on a configuration line is a comment.

PEmicro can provide more a detailed specification of flash algorithm construction upon request.

Tags related to this Blog Post

Cyclone     Cyclone FX     Multilink     Multilink FX     GDB Server     Prog ACMP     ARM     NXP     Production Programming     Debug