IAP program sample to write sector28 (address 0x00070000)

Dependencies:   mbed

Committer:
okano
Date:
Fri Jan 20 08:56:34 2012 +0000
Revision:
0:34dda9d8ed01
Just a sample to confirm the behavior

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 0:34dda9d8ed01 1 /** IAP demo : demo code for internal Flash memory access library
okano 0:34dda9d8ed01 2 *
okano 0:34dda9d8ed01 3 * The internal Flash memory access is described in the LPC1768 usermanual.
okano 0:34dda9d8ed01 4 * http://www.nxp.com/documents/user_manual/UM10360.pdf
okano 0:34dda9d8ed01 5 *
okano 0:34dda9d8ed01 6 * Chapter 2: "LPC17xx Memory map"
okano 0:34dda9d8ed01 7 * Chapter 32: "LPC17xx Flash memory interface and programming"
okano 0:34dda9d8ed01 8 * refering Rev. 01 - 4 January 2010
okano 0:34dda9d8ed01 9 *
okano 0:34dda9d8ed01 10 * This main.cpp demonstrates how the flash can be erased and wrote.
okano 0:34dda9d8ed01 11 *
okano 0:34dda9d8ed01 12 * This program tries to...
okano 0:34dda9d8ed01 13 * 0. read device ID and serial#
okano 0:34dda9d8ed01 14 * 1. check if the targat sector blank
okano 0:34dda9d8ed01 15 * 2. erase the sector if it was not blank
okano 0:34dda9d8ed01 16 * 3. write into the flash (prepare before write)
okano 0:34dda9d8ed01 17 * 4. verify the data by IAP command
okano 0:34dda9d8ed01 18 * 5. show the content of the flash
okano 0:34dda9d8ed01 19 *
okano 0:34dda9d8ed01 20 * The Flash must be erased as sectors. No overwrite can be done like SRAM.
okano 0:34dda9d8ed01 21 * So erase should be done in size of 4K or 32K.
okano 0:34dda9d8ed01 22 *
okano 0:34dda9d8ed01 23 * Writing sector can be done with size of 256, 512, 1024 or 4096.
okano 0:34dda9d8ed01 24 * If other size is used, the IAP returns an error.
okano 0:34dda9d8ed01 25 * The SRAM memory should be allocated in
okano 0:34dda9d8ed01 26 *
okano 0:34dda9d8ed01 27 *
okano 0:34dda9d8ed01 28 * Released under the MIT License: http://mbed.org/license/mit
okano 0:34dda9d8ed01 29 *
okano 0:34dda9d8ed01 30 * revision 1.0 09-Mar-2010 1st release
okano 0:34dda9d8ed01 31 * revision 1.1 12-Mar-2010 chaged: to make possible to reserve flash area for user
okano 0:34dda9d8ed01 32 * it can be set by USER_FLASH_AREA_START and USER_FLASH_AREA_SIZE in IAP.h
okano 0:34dda9d8ed01 33 */
okano 0:34dda9d8ed01 34
okano 0:34dda9d8ed01 35 #include "mbed.h"
okano 0:34dda9d8ed01 36 #include "IAP.h"
okano 0:34dda9d8ed01 37
okano 0:34dda9d8ed01 38 #define MEM_SIZE 256
okano 0:34dda9d8ed01 39 #define TARGET_SECTOR 28
okano 0:34dda9d8ed01 40
okano 0:34dda9d8ed01 41 void memdump( char *p, int n );
okano 0:34dda9d8ed01 42 int isprint( int c );
okano 0:34dda9d8ed01 43
okano 0:34dda9d8ed01 44 IAP iap;
okano 0:34dda9d8ed01 45
okano 0:34dda9d8ed01 46
okano 0:34dda9d8ed01 47 int main() {
okano 0:34dda9d8ed01 48 char mem[ MEM_SIZE ]; // memory, it should be aligned to word boundary
okano 0:34dda9d8ed01 49 int r;
okano 0:34dda9d8ed01 50
okano 0:34dda9d8ed01 51 printf( "\r\n\r\n\r\nIAP: Flash memory writing test\r\n" );
okano 0:34dda9d8ed01 52 printf( " device-ID = 0x%08X, serial# = 0x%08X, CPU running %dkHz\r\n", iap.read_ID(), iap.read_serial(), SystemCoreClock / 1000 );
okano 0:34dda9d8ed01 53 printf( " user reserved flash area: start_address=0x%08X, size=%d bytes\r\n", iap.reserved_flash_area_start(), iap.reserved_flash_area_size() );
okano 0:34dda9d8ed01 54
okano 0:34dda9d8ed01 55 for ( int i = 0; i < MEM_SIZE; i++ )
okano 0:34dda9d8ed01 56 mem[ i ] = i & 0xFF;
okano 0:34dda9d8ed01 57
okano 0:34dda9d8ed01 58 // blank check: The mbed will erase all flash contents after downloading new executable
okano 0:34dda9d8ed01 59
okano 0:34dda9d8ed01 60 r = iap.blank_check( TARGET_SECTOR, TARGET_SECTOR );
okano 0:34dda9d8ed01 61 printf( "blank check result = 0x%08X\r\n", r );
okano 0:34dda9d8ed01 62
okano 0:34dda9d8ed01 63 // erase sector, if required
okano 0:34dda9d8ed01 64
okano 0:34dda9d8ed01 65 if ( r == SECTOR_NOT_BLANK ) {
okano 0:34dda9d8ed01 66 iap.prepare( TARGET_SECTOR, TARGET_SECTOR );
okano 0:34dda9d8ed01 67 r = iap.erase( TARGET_SECTOR, TARGET_SECTOR );
okano 0:34dda9d8ed01 68 printf( "erase result = 0x%08X\r\n", r );
okano 0:34dda9d8ed01 69 }
okano 0:34dda9d8ed01 70
okano 0:34dda9d8ed01 71 // copy RAM to Flash
okano 0:34dda9d8ed01 72
okano 0:34dda9d8ed01 73 iap.prepare( TARGET_SECTOR, TARGET_SECTOR );
okano 0:34dda9d8ed01 74 r = iap.write( mem, sector_start_adress[ TARGET_SECTOR ], MEM_SIZE );
okano 0:34dda9d8ed01 75 printf( "copied: SRAM(0x%08X)->Flash(0x%08X) for %d bytes. (result=0x%08X)\r\n", mem, sector_start_adress[ TARGET_SECTOR ], MEM_SIZE, r );
okano 0:34dda9d8ed01 76
okano 0:34dda9d8ed01 77 // compare
okano 0:34dda9d8ed01 78
okano 0:34dda9d8ed01 79 r = iap.compare( mem, sector_start_adress[ TARGET_SECTOR ], MEM_SIZE );
okano 0:34dda9d8ed01 80 printf( "compare result = \"%s\"\r\n", r ? "FAILED" : "OK" );
okano 0:34dda9d8ed01 81
okano 0:34dda9d8ed01 82 //#define WRITE_NEXT_BLOCK
okano 0:34dda9d8ed01 83 #ifdef WRITE_NEXT_BLOCK
okano 0:34dda9d8ed01 84
okano 0:34dda9d8ed01 85 // copy RAM to Flash
okano 0:34dda9d8ed01 86
okano 0:34dda9d8ed01 87 iap.prepare( TARGET_SECTOR, TARGET_SECTOR );
okano 0:34dda9d8ed01 88 r = iap.write( mem, sector_start_adress[ TARGET_SECTOR ] + 256, MEM_SIZE );
okano 0:34dda9d8ed01 89 printf( "copied: SRAM(0x%08X)->Flash(0x%08X) for %d bytes. (result=0x%08X)\n", mem, sector_start_adress[ TARGET_SECTOR ], MEM_SIZE, r );
okano 0:34dda9d8ed01 90
okano 0:34dda9d8ed01 91 // compare
okano 0:34dda9d8ed01 92
okano 0:34dda9d8ed01 93 r = iap.compare( mem, sector_start_adress[ TARGET_SECTOR ] + 256, MEM_SIZE );
okano 0:34dda9d8ed01 94 printf( "compare result = \"%s\"\r\n", r ? "FAILED" : "OK" );
okano 0:34dda9d8ed01 95
okano 0:34dda9d8ed01 96 #endif
okano 0:34dda9d8ed01 97
okano 0:34dda9d8ed01 98 printf( "showing the flash contents...\n" );
okano 0:34dda9d8ed01 99 memdump( sector_start_adress[ TARGET_SECTOR ], MEM_SIZE );
okano 0:34dda9d8ed01 100 }
okano 0:34dda9d8ed01 101
okano 0:34dda9d8ed01 102
okano 0:34dda9d8ed01 103 void memdump( char *base, int n ) {
okano 0:34dda9d8ed01 104 unsigned int *p;
okano 0:34dda9d8ed01 105
okano 0:34dda9d8ed01 106 printf( " memdump from 0x%08X for %d bytes", (unsigned long)base, n );
okano 0:34dda9d8ed01 107
okano 0:34dda9d8ed01 108 p = (unsigned int *)((unsigned int)base & ~(unsigned int)0x3);
okano 0:34dda9d8ed01 109
okano 0:34dda9d8ed01 110 for ( int i = 0; i < (n >> 2); i++, p++ ) {
okano 0:34dda9d8ed01 111 if ( !(i % 4) )
okano 0:34dda9d8ed01 112 printf( "\r\n 0x%08X :", (unsigned int)p );
okano 0:34dda9d8ed01 113
okano 0:34dda9d8ed01 114 printf( " 0x%08X", *p );
okano 0:34dda9d8ed01 115 }
okano 0:34dda9d8ed01 116
okano 0:34dda9d8ed01 117 printf( "\r\n" );
okano 0:34dda9d8ed01 118 }