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:
Fri Mar 12 10:24:57 2010 +0000
Revision:
0:b802bd2f4cc9

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 0:b802bd2f4cc9 1 /** IAP : internal Flash memory access library
okano 0:b802bd2f4cc9 2 *
okano 0:b802bd2f4cc9 3 * The internal Flash memory access is described in the LPC1768 usermanual.
okano 0:b802bd2f4cc9 4 * http://www.nxp.com/documents/user_manual/UM10360.pdf
okano 0:b802bd2f4cc9 5 *
okano 0:b802bd2f4cc9 6 * Chapter 2: "LPC17xx Memory map"
okano 0:b802bd2f4cc9 7 * Chapter 32: "LPC17xx Flash memory interface and programming"
okano 0:b802bd2f4cc9 8 * refering Rev. 01 - 4 January 2010
okano 0:b802bd2f4cc9 9 *
okano 0:b802bd2f4cc9 10 * Released under the MIT License: http://mbed.org/license/mit
okano 0:b802bd2f4cc9 11 *
okano 0:b802bd2f4cc9 12 * revision 1.0 09-Mar-2010 1st release
okano 0:b802bd2f4cc9 13 * revision 1.1 12-Mar-2010 chaged: to make possible to reserve flash area for user
okano 0:b802bd2f4cc9 14 * it can be set by USER_FLASH_AREA_START and USER_FLASH_AREA_SIZE in IAP.h
okano 0:b802bd2f4cc9 15 */
okano 0:b802bd2f4cc9 16
okano 0:b802bd2f4cc9 17 #ifndef MBED_IAP
okano 0:b802bd2f4cc9 18 #define MBED_IAP
okano 0:b802bd2f4cc9 19
okano 0:b802bd2f4cc9 20 #include "mbed.h"
okano 0:b802bd2f4cc9 21
okano 0:b802bd2f4cc9 22 #define USER_FLASH_AREA_START FLASH_SECTOR_29
okano 0:b802bd2f4cc9 23 #define USER_FLASH_AREA_SIZE (FLASH_SECTOR_SIZE_16_TO_29 * 1)
okano 0:b802bd2f4cc9 24
okano 0:b802bd2f4cc9 25 /*
okano 0:b802bd2f4cc9 26 * memory map information is available in next URL also.
okano 0:b802bd2f4cc9 27 * http://mbed.org/projects/libraries/svn/mbed/trunk/LPC1768/LPC17xx.h
okano 0:b802bd2f4cc9 28 */
okano 0:b802bd2f4cc9 29
okano 0:b802bd2f4cc9 30 /** Table for start adress of sectors
okano 0:b802bd2f4cc9 31 *
okano 0:b802bd2f4cc9 32 * LPC1768 internal flash memory sector numbers and addresses
okano 0:b802bd2f4cc9 33 *
okano 0:b802bd2f4cc9 34 * LPC1768 flash memory are and sector number/size
okano 0:b802bd2f4cc9 35 * Table 568 "Sectors in a LPC17xx device", Section 5. "Sector numbers", usermanual
okano 0:b802bd2f4cc9 36 *
okano 0:b802bd2f4cc9 37 * 0x00000000 - 0x0007FFFF flash (29 sectors)
okano 0:b802bd2f4cc9 38 *
okano 0:b802bd2f4cc9 39 * Sector0: 0x00000000 - 0x00000FFF 4K
okano 0:b802bd2f4cc9 40 * Sector1: 0x00001000 - 0x00001FFF 4K
okano 0:b802bd2f4cc9 41 * Sector2: 0x00002000 - 0x00002FFF 4K
okano 0:b802bd2f4cc9 42 * Sector3: 0x00003000 - 0x00003FFF 4K
okano 0:b802bd2f4cc9 43 * Sector4: 0x00004000 - 0x00004FFF 4K
okano 0:b802bd2f4cc9 44 * Sector5: 0x00005000 - 0x00005FFF 4K
okano 0:b802bd2f4cc9 45 * Sector6: 0x00006000 - 0x00006FFF 4K
okano 0:b802bd2f4cc9 46 * Sector7: 0x00007000 - 0x00007FFF 4K
okano 0:b802bd2f4cc9 47 * Sector8: 0x00008000 - 0x00008FFF 4K
okano 0:b802bd2f4cc9 48 * Sector9: 0x00009000 - 0x00009FFF 4K
okano 0:b802bd2f4cc9 49 * Sector10: 0x0000A000 - 0x0000AFFF 4K
okano 0:b802bd2f4cc9 50 * Sector11: 0x0000B000 - 0x0000BFFF 4K
okano 0:b802bd2f4cc9 51 * Sector12: 0x0000C000 - 0x0000CFFF 4K
okano 0:b802bd2f4cc9 52 * Sector13: 0x0000D000 - 0x0000DFFF 4K
okano 0:b802bd2f4cc9 53 * Sector14: 0x0000E000 - 0x0000EFFF 4K
okano 0:b802bd2f4cc9 54 * Sector15: 0x0000F000 - 0x0000FFFF 4K
okano 0:b802bd2f4cc9 55 *
okano 0:b802bd2f4cc9 56 * Sector16: 0x00010000 - 0x00017FFF 32K
okano 0:b802bd2f4cc9 57 * Sector17: 0x00018000 - 0x0001FFFF 32K
okano 0:b802bd2f4cc9 58 * Sector18: 0x00020000 - 0x00027FFF 32K
okano 0:b802bd2f4cc9 59 * Sector19: 0x00028000 - 0x0002FFFF 32K
okano 0:b802bd2f4cc9 60 * Sector20: 0x00030000 - 0x00037FFF 32K
okano 0:b802bd2f4cc9 61 * Sector21: 0x00038000 - 0x0003FFFF 32K
okano 0:b802bd2f4cc9 62 * Sector22: 0x00040000 - 0x00047FFF 32K
okano 0:b802bd2f4cc9 63 * Sector23: 0x00048000 - 0x0004FFFF 32K
okano 0:b802bd2f4cc9 64 * Sector24: 0x00050000 - 0x00057FFF 32K
okano 0:b802bd2f4cc9 65 * Sector25: 0x00058000 - 0x0005FFFF 32K
okano 0:b802bd2f4cc9 66 * Sector26: 0x00060000 - 0x00067FFF 32K
okano 0:b802bd2f4cc9 67 * Sector27: 0x00068000 - 0x0006FFFF 32K
okano 0:b802bd2f4cc9 68 * Sector28: 0x00070000 - 0x00077FFF 32K
okano 0:b802bd2f4cc9 69 * Sector29: 0x00078000 - 0x0007FFFF 32K
okano 0:b802bd2f4cc9 70 */
okano 0:b802bd2f4cc9 71
okano 0:b802bd2f4cc9 72 #define FLASH_SECTOR_0 0x00000000
okano 0:b802bd2f4cc9 73 #define FLASH_SECTOR_1 0x00001000
okano 0:b802bd2f4cc9 74 #define FLASH_SECTOR_2 0x00002000
okano 0:b802bd2f4cc9 75 #define FLASH_SECTOR_3 0x00003000
okano 0:b802bd2f4cc9 76 #define FLASH_SECTOR_4 0x00004000
okano 0:b802bd2f4cc9 77 #define FLASH_SECTOR_5 0x00005000
okano 0:b802bd2f4cc9 78 #define FLASH_SECTOR_6 0x00006000
okano 0:b802bd2f4cc9 79 #define FLASH_SECTOR_7 0x00007000
okano 0:b802bd2f4cc9 80 #define FLASH_SECTOR_8 0x00008000
okano 0:b802bd2f4cc9 81 #define FLASH_SECTOR_9 0x00009000
okano 0:b802bd2f4cc9 82 #define FLASH_SECTOR_10 0x0000A000
okano 0:b802bd2f4cc9 83 #define FLASH_SECTOR_11 0x0000B000
okano 0:b802bd2f4cc9 84 #define FLASH_SECTOR_12 0x0000C000
okano 0:b802bd2f4cc9 85 #define FLASH_SECTOR_13 0x0000D000
okano 0:b802bd2f4cc9 86 #define FLASH_SECTOR_14 0x0000E000
okano 0:b802bd2f4cc9 87 #define FLASH_SECTOR_15 0x0000F000
okano 0:b802bd2f4cc9 88 #define FLASH_SECTOR_16 0x00010000
okano 0:b802bd2f4cc9 89 #define FLASH_SECTOR_17 0x00018000
okano 0:b802bd2f4cc9 90 #define FLASH_SECTOR_18 0x00020000
okano 0:b802bd2f4cc9 91 #define FLASH_SECTOR_19 0x00028000
okano 0:b802bd2f4cc9 92 #define FLASH_SECTOR_20 0x00030000
okano 0:b802bd2f4cc9 93 #define FLASH_SECTOR_21 0x00038000
okano 0:b802bd2f4cc9 94 #define FLASH_SECTOR_22 0x00040000
okano 0:b802bd2f4cc9 95 #define FLASH_SECTOR_23 0x00048000
okano 0:b802bd2f4cc9 96 #define FLASH_SECTOR_24 0x00050000
okano 0:b802bd2f4cc9 97 #define FLASH_SECTOR_25 0x00058000
okano 0:b802bd2f4cc9 98 #define FLASH_SECTOR_26 0x00060000
okano 0:b802bd2f4cc9 99 #define FLASH_SECTOR_27 0x00068000
okano 0:b802bd2f4cc9 100 #define FLASH_SECTOR_28 0x00070000
okano 0:b802bd2f4cc9 101 #define FLASH_SECTOR_29 0x00078000
okano 0:b802bd2f4cc9 102
okano 0:b802bd2f4cc9 103 #define FLASH_SECTOR_SIZE_0_TO_15 ( 4 * 1024)
okano 0:b802bd2f4cc9 104 #define FLASH_SECTOR_SIZE_16_TO_29 (32 * 1024)
okano 0:b802bd2f4cc9 105
okano 0:b802bd2f4cc9 106 static char * sector_start_adress[] = {
okano 0:b802bd2f4cc9 107 (char *)FLASH_SECTOR_0,
okano 0:b802bd2f4cc9 108 (char *)FLASH_SECTOR_1,
okano 0:b802bd2f4cc9 109 (char *)FLASH_SECTOR_2,
okano 0:b802bd2f4cc9 110 (char *)FLASH_SECTOR_3,
okano 0:b802bd2f4cc9 111 (char *)FLASH_SECTOR_4,
okano 0:b802bd2f4cc9 112 (char *)FLASH_SECTOR_5,
okano 0:b802bd2f4cc9 113 (char *)FLASH_SECTOR_6,
okano 0:b802bd2f4cc9 114 (char *)FLASH_SECTOR_7,
okano 0:b802bd2f4cc9 115 (char *)FLASH_SECTOR_8,
okano 0:b802bd2f4cc9 116 (char *)FLASH_SECTOR_9,
okano 0:b802bd2f4cc9 117 (char *)FLASH_SECTOR_10,
okano 0:b802bd2f4cc9 118 (char *)FLASH_SECTOR_11,
okano 0:b802bd2f4cc9 119 (char *)FLASH_SECTOR_12,
okano 0:b802bd2f4cc9 120 (char *)FLASH_SECTOR_13,
okano 0:b802bd2f4cc9 121 (char *)FLASH_SECTOR_14,
okano 0:b802bd2f4cc9 122 (char *)FLASH_SECTOR_15,
okano 0:b802bd2f4cc9 123 (char *)FLASH_SECTOR_16,
okano 0:b802bd2f4cc9 124 (char *)FLASH_SECTOR_17,
okano 0:b802bd2f4cc9 125 (char *)FLASH_SECTOR_18,
okano 0:b802bd2f4cc9 126 (char *)FLASH_SECTOR_19,
okano 0:b802bd2f4cc9 127 (char *)FLASH_SECTOR_20,
okano 0:b802bd2f4cc9 128 (char *)FLASH_SECTOR_21,
okano 0:b802bd2f4cc9 129 (char *)FLASH_SECTOR_22,
okano 0:b802bd2f4cc9 130 (char *)FLASH_SECTOR_23,
okano 0:b802bd2f4cc9 131 (char *)FLASH_SECTOR_24,
okano 0:b802bd2f4cc9 132 (char *)FLASH_SECTOR_25,
okano 0:b802bd2f4cc9 133 (char *)FLASH_SECTOR_26,
okano 0:b802bd2f4cc9 134 (char *)FLASH_SECTOR_27,
okano 0:b802bd2f4cc9 135 (char *)FLASH_SECTOR_28,
okano 0:b802bd2f4cc9 136 (char *)FLASH_SECTOR_29
okano 0:b802bd2f4cc9 137 };
okano 0:b802bd2f4cc9 138
okano 0:b802bd2f4cc9 139
okano 0:b802bd2f4cc9 140 /** Error code by IAP routine
okano 0:b802bd2f4cc9 141 *
okano 0:b802bd2f4cc9 142 * Table 588 "ISP Return Codes Summary", Section 7.15 "ISP Return Codes", usermanual
okano 0:b802bd2f4cc9 143 */
okano 0:b802bd2f4cc9 144
okano 0:b802bd2f4cc9 145 enum error_code
okano 0:b802bd2f4cc9 146 {
okano 0:b802bd2f4cc9 147 CMD_SUCCESS,
okano 0:b802bd2f4cc9 148 INVALID_COMMAND,
okano 0:b802bd2f4cc9 149 SRC_ADDR_ERROR,
okano 0:b802bd2f4cc9 150 DST_ADDR_ERROR,
okano 0:b802bd2f4cc9 151 SRC_ADDR_NOT_MAPPED,
okano 0:b802bd2f4cc9 152 DST_ADDR_NOT_MAPPED,
okano 0:b802bd2f4cc9 153 COUNT_ERROR,
okano 0:b802bd2f4cc9 154 INVALID_SECTOR,
okano 0:b802bd2f4cc9 155 SECTOR_NOT_BLANK,
okano 0:b802bd2f4cc9 156 SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION,
okano 0:b802bd2f4cc9 157 COMPARE_ERROR,
okano 0:b802bd2f4cc9 158 BUSY,
okano 0:b802bd2f4cc9 159 PARAM_ERROR,
okano 0:b802bd2f4cc9 160 ADDR_ERROR,
okano 0:b802bd2f4cc9 161 ADDR_NOT_MAPPED,
okano 0:b802bd2f4cc9 162 CMD_LOCKED,
okano 0:b802bd2f4cc9 163 INVALID_CODE,
okano 0:b802bd2f4cc9 164 INVALID_BAUD_RATE,
okano 0:b802bd2f4cc9 165 INVALID_STOP_BIT,
okano 0:b802bd2f4cc9 166 CODE_READ_PROTECTION_ENABLED
okano 0:b802bd2f4cc9 167 };
okano 0:b802bd2f4cc9 168
okano 0:b802bd2f4cc9 169
okano 0:b802bd2f4cc9 170
okano 0:b802bd2f4cc9 171 /*
okano 0:b802bd2f4cc9 172 * IAP routine entry
okano 0:b802bd2f4cc9 173 *
okano 0:b802bd2f4cc9 174 * Chapter 8. "IAP commands", usermanual
okano 0:b802bd2f4cc9 175 */
okano 0:b802bd2f4cc9 176
okano 0:b802bd2f4cc9 177 #define IAP_LOCATION 0x1fff1ff1
okano 0:b802bd2f4cc9 178 typedef void (*IAP_call)(unsigned int [], unsigned int []);
okano 0:b802bd2f4cc9 179
okano 0:b802bd2f4cc9 180 /** IAP class
okano 0:b802bd2f4cc9 181 *
okano 0:b802bd2f4cc9 182 * Interface for internal flash memory access
okano 0:b802bd2f4cc9 183 */
okano 0:b802bd2f4cc9 184
okano 0:b802bd2f4cc9 185
okano 0:b802bd2f4cc9 186 class IAP {
okano 0:b802bd2f4cc9 187 public:
okano 0:b802bd2f4cc9 188
okano 0:b802bd2f4cc9 189 /*
okano 0:b802bd2f4cc9 190 * SystemCoreClock ??? :
okano 0:b802bd2f4cc9 191 * http://mbed.org/forum/mbed/topic/229/
okano 0:b802bd2f4cc9 192 * http://mbed.org/users/simon/programs/SystemCoreClock/16mhsh/
okano 0:b802bd2f4cc9 193 */
okano 0:b802bd2f4cc9 194
okano 0:b802bd2f4cc9 195
okano 0:b802bd2f4cc9 196 /** Constructor for IAP
okano 0:b802bd2f4cc9 197 *
okano 0:b802bd2f4cc9 198 */
okano 0:b802bd2f4cc9 199
okano 0:b802bd2f4cc9 200 IAP() : iap_entry( reinterpret_cast<IAP_call>(IAP_LOCATION) ), cclk_kHz( SystemCoreClock / 1000 ) {}
okano 0:b802bd2f4cc9 201 int read_ID( void );
okano 0:b802bd2f4cc9 202 int read_serial( void );
okano 0:b802bd2f4cc9 203 int blank_check( int start, int end );
okano 0:b802bd2f4cc9 204 int erase( int start, int end );
okano 0:b802bd2f4cc9 205 int prepare( int start, int end );
okano 0:b802bd2f4cc9 206 int write( char *source_addr, char *target_addr, int size );
okano 0:b802bd2f4cc9 207 int compare( char *source_addr, char *target_addr, int size );
okano 0:b802bd2f4cc9 208
okano 0:b802bd2f4cc9 209 char *reserved_flash_area_start( void );
okano 0:b802bd2f4cc9 210 int reserved_flash_area_size( void );
okano 0:b802bd2f4cc9 211
okano 0:b802bd2f4cc9 212 private:
okano 0:b802bd2f4cc9 213 IAP_call iap_entry;
okano 0:b802bd2f4cc9 214 unsigned int IAP_command[ 5 ];
okano 0:b802bd2f4cc9 215 unsigned int IAP_result[ 5 ];
okano 0:b802bd2f4cc9 216 int cclk_kHz;
okano 0:b802bd2f4cc9 217
okano 0:b802bd2f4cc9 218 //int cpu_clock( void );
okano 0:b802bd2f4cc9 219 }
okano 0:b802bd2f4cc9 220 ;
okano 0:b802bd2f4cc9 221
okano 0:b802bd2f4cc9 222 #endif // #ifndef MBED_IAP