sample of erasing sector 7 on LPC1768

Dependencies:   IAP mbed

Fork of IAP_internal_flash_write by Tedd OKANO

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 }