Sample code for how to erase/write LPC1768, LPC11U24, LPC1114, LPC812 and LPC824 internal flash memory. This program uses IAP call of MCU's ROM routines. The IAP library also supports read/write of EEPROM in LPC11U24.

Dependencies:   mbed IAP

Sample code for how to erase/write LPC1768, LPC11U24, LPC1114, LPC812 and LPC824 internal flash memory. This program uses IAP call of MCU's ROM routines.

No filesystem interface available. This program is just an interface to flash erasing and writing. User need manage where to store the data in the flash area.

This IAP library supports read/write of EEPROM in LPC11U24.

More information available in
http://mbed.org/users/okano/notebook/iap-in-application-programming-internal-flash-eras/

Committer:
okano
Date:
Mon Nov 26 04:02:14 2012 +0000
Revision:
1:a85b51eeb446
Parent:
0:b802bd2f4cc9
Child:
2:c22f0c87fee6
sample code for IAP class library for LPC1768 and LPC11U24

Who changed what in which revision?

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