Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@7:e140563d4aad, 2018-08-15 (annotated)
- Committer:
- okano
- Date:
- Wed Aug 15 07:42:33 2018 +0000
- Revision:
- 7:e140563d4aad
- Parent:
- 6:2357a04a16ff
- Child:
- 8:7d4d4edcb133
added: just minor feature in "memdump()" function
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| okano | 0:b802bd2f4cc9 | 1 | /** IAP demo : demo code for internal Flash memory access library |
| okano | 0:b802bd2f4cc9 | 2 | * |
| okano | 3:63a0993315e5 | 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 | 3:63a0993315e5 | 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 | 3:63a0993315e5 | 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 | 3:63a0993315e5 | 27 | * The Flash must be erased as sectors. No overwrite can be done like SRAM. |
| okano | 3:63a0993315e5 | 28 | * So erase should be done in size of 4K or 32K. |
| okano | 0:b802bd2f4cc9 | 29 | * |
| okano | 3:63a0993315e5 | 30 | * Writing sector can be done with size of 256, 512, 1024 or 4096. |
| okano | 3:63a0993315e5 | 31 | * If other size is used, the IAP returns an error. |
| okano | 3:63a0993315e5 | 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 | 2:c22f0c87fee6 | 41 | * revision 2.1 26-Nov-2012 EEPROM access code imported from Suga koubou san's (http://mbed.org/users/okini3939/) library |
| okano | 2:c22f0c87fee6 | 42 | * http://mbed.org/users/okini3939/code/M0_EEPROM_test/ |
| okano | 5:806960ca964e | 43 | * revision 3.0 09-Jan-2015 LPC812 and LPC824 support added |
| okano | 5:806960ca964e | 44 | * revision 3.1 13-Jan-2015 LPC1114 support added |
| okano | 5:806960ca964e | 45 | * revision 3.1.1 16-Jan-2015 Target MCU name changed for better compatibility across the platforms |
| okano | 6:2357a04a16ff | 46 | * revision 3.1.2 10-Mar-2015 merged with pull requests. reinvoke_isp() added and modified read_serial() to return a pointer. |
| okano | 7:e140563d4aad | 47 | * revision 3.1.2.1 15-Aug-2018 added: just minor feature in "memdump()" function |
| okano | 0:b802bd2f4cc9 | 48 | */ |
| okano | 0:b802bd2f4cc9 | 49 | |
| okano | 0:b802bd2f4cc9 | 50 | #include "mbed.h" |
| okano | 0:b802bd2f4cc9 | 51 | #include "IAP.h" |
| okano | 0:b802bd2f4cc9 | 52 | |
| okano | 0:b802bd2f4cc9 | 53 | #define MEM_SIZE 256 |
| okano | 1:a85b51eeb446 | 54 | |
| okano | 5:806960ca964e | 55 | #if defined(TARGET_LPC176X) |
| okano | 1:a85b51eeb446 | 56 | #define TARGET_SECTOR 29 // use sector 29 as target sector if it is on LPC1768 |
| okano | 5:806960ca964e | 57 | #elif defined(TARGET_LPC11UXX) || defined(TARGET_LPC11XX) |
| okano | 1:a85b51eeb446 | 58 | #define TARGET_SECTOR 7 // use sector 7 as target sector if it is on LPC11U24 |
| okano | 2:c22f0c87fee6 | 59 | #define TARGET_EEPROM_ADDRESS 64 |
| okano | 3:63a0993315e5 | 60 | #define TARGET_EEPROM_ADDRESS 64 |
| okano | 5:806960ca964e | 61 | #elif defined(TARGET_LPC81X) || defined(TARGET_LPC82X) |
| okano | 3:63a0993315e5 | 62 | #define TARGET_SECTOR 15 // use sector 15 as target sector if it is on LPC812 |
| okano | 1:a85b51eeb446 | 63 | #endif |
| okano | 0:b802bd2f4cc9 | 64 | |
| okano | 0:b802bd2f4cc9 | 65 | void memdump( char *p, int n ); |
| okano | 0:b802bd2f4cc9 | 66 | |
| okano | 0:b802bd2f4cc9 | 67 | IAP iap; |
| okano | 0:b802bd2f4cc9 | 68 | |
| okano | 0:b802bd2f4cc9 | 69 | |
| okano | 3:63a0993315e5 | 70 | int main() |
| okano | 3:63a0993315e5 | 71 | { |
| okano | 0:b802bd2f4cc9 | 72 | char mem[ MEM_SIZE ]; // memory, it should be aligned to word boundary |
| okano | 6:2357a04a16ff | 73 | int *serial_number; |
| okano | 0:b802bd2f4cc9 | 74 | int r; |
| okano | 0:b802bd2f4cc9 | 75 | |
| okano | 3:63a0993315e5 | 76 | printf( "\r\n\r\n=== IAP: Flash memory writing test ===\r\n" ); |
| okano | 6:2357a04a16ff | 77 | printf( " device-ID = 0x%08X\r\n", iap.read_ID() ); |
| okano | 6:2357a04a16ff | 78 | |
| okano | 6:2357a04a16ff | 79 | serial_number = iap.read_serial(); |
| okano | 6:2357a04a16ff | 80 | |
| okano | 6:2357a04a16ff | 81 | printf( " serial# =" ); |
| okano | 6:2357a04a16ff | 82 | for ( int i = 0; i < 4; i++ ) |
| okano | 6:2357a04a16ff | 83 | printf( " %08X", *(serial_number + i) ); |
| okano | 6:2357a04a16ff | 84 | printf( "\r\n" ); |
| okano | 6:2357a04a16ff | 85 | |
| okano | 6:2357a04a16ff | 86 | printf( " CPU running %dkHz\r\n", SystemCoreClock / 1000 ); |
| okano | 1:a85b51eeb446 | 87 | 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 | 88 | printf( " read_BootVer=0x%08X\r\r\n", iap.read_BootVer() ); |
| okano | 0:b802bd2f4cc9 | 89 | |
| okano | 0:b802bd2f4cc9 | 90 | for ( int i = 0; i < MEM_SIZE; i++ ) |
| okano | 0:b802bd2f4cc9 | 91 | mem[ i ] = i & 0xFF; |
| okano | 0:b802bd2f4cc9 | 92 | |
| okano | 0:b802bd2f4cc9 | 93 | // blank check: The mbed will erase all flash contents after downloading new executable |
| okano | 0:b802bd2f4cc9 | 94 | |
| okano | 0:b802bd2f4cc9 | 95 | r = iap.blank_check( TARGET_SECTOR, TARGET_SECTOR ); |
| okano | 1:a85b51eeb446 | 96 | printf( "blank check result = 0x%08X\r\n", r ); |
| okano | 0:b802bd2f4cc9 | 97 | |
| okano | 0:b802bd2f4cc9 | 98 | // erase sector, if required |
| okano | 3:63a0993315e5 | 99 | |
| okano | 0:b802bd2f4cc9 | 100 | if ( r == SECTOR_NOT_BLANK ) { |
| okano | 0:b802bd2f4cc9 | 101 | iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); |
| okano | 0:b802bd2f4cc9 | 102 | r = iap.erase( TARGET_SECTOR, TARGET_SECTOR ); |
| okano | 1:a85b51eeb446 | 103 | printf( "erase result = 0x%08X\r\n", r ); |
| okano | 0:b802bd2f4cc9 | 104 | } |
| okano | 3:63a0993315e5 | 105 | |
| okano | 0:b802bd2f4cc9 | 106 | // copy RAM to Flash |
| okano | 0:b802bd2f4cc9 | 107 | |
| okano | 0:b802bd2f4cc9 | 108 | iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); |
| okano | 0:b802bd2f4cc9 | 109 | r = iap.write( mem, sector_start_adress[ TARGET_SECTOR ], MEM_SIZE ); |
| okano | 1:a85b51eeb446 | 110 | 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 | 111 | |
| okano | 0:b802bd2f4cc9 | 112 | // compare |
| okano | 0:b802bd2f4cc9 | 113 | |
| okano | 0:b802bd2f4cc9 | 114 | r = iap.compare( mem, sector_start_adress[ TARGET_SECTOR ], MEM_SIZE ); |
| okano | 1:a85b51eeb446 | 115 | printf( "compare result = \"%s\"\r\n", r ? "FAILED" : "OK" ); |
| okano | 0:b802bd2f4cc9 | 116 | |
| okano | 0:b802bd2f4cc9 | 117 | //#define WRITE_NEXT_BLOCK |
| okano | 0:b802bd2f4cc9 | 118 | #ifdef WRITE_NEXT_BLOCK |
| okano | 0:b802bd2f4cc9 | 119 | |
| okano | 0:b802bd2f4cc9 | 120 | // copy RAM to Flash |
| okano | 0:b802bd2f4cc9 | 121 | |
| okano | 0:b802bd2f4cc9 | 122 | iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); |
| okano | 0:b802bd2f4cc9 | 123 | r = iap.write( mem, sector_start_adress[ TARGET_SECTOR ] + 256, MEM_SIZE ); |
| okano | 1:a85b51eeb446 | 124 | 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 | 125 | |
| okano | 0:b802bd2f4cc9 | 126 | // compare |
| okano | 0:b802bd2f4cc9 | 127 | |
| okano | 0:b802bd2f4cc9 | 128 | r = iap.compare( mem, sector_start_adress[ TARGET_SECTOR ] + 256, MEM_SIZE ); |
| okano | 1:a85b51eeb446 | 129 | printf( "compare result = \"%s\"\r\n", r ? "FAILED" : "OK" ); |
| okano | 0:b802bd2f4cc9 | 130 | |
| okano | 0:b802bd2f4cc9 | 131 | #endif |
| okano | 0:b802bd2f4cc9 | 132 | |
| okano | 1:a85b51eeb446 | 133 | printf( "showing the flash contents...\r\n" ); |
| okano | 0:b802bd2f4cc9 | 134 | memdump( sector_start_adress[ TARGET_SECTOR ], MEM_SIZE * 3 ); |
| okano | 3:63a0993315e5 | 135 | |
| okano | 3:63a0993315e5 | 136 | |
| okano | 5:806960ca964e | 137 | #if defined(TARGET_LPC81X) || defined(TARGET_LPC82X) |
| okano | 3:63a0993315e5 | 138 | iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); |
| okano | 3:63a0993315e5 | 139 | r = iap.erase_page( 241, 241 ); // 241 is page number for sector 7 with 64 byte offset |
| okano | 3:63a0993315e5 | 140 | |
| okano | 3:63a0993315e5 | 141 | printf( "\r\nerase page test\r\n" ); |
| okano | 3:63a0993315e5 | 142 | printf( "erase page result = \"%s\"\r\n", r ? "FAILED" : "OK" ); |
| okano | 3:63a0993315e5 | 143 | printf( "showing memory dump to confirm 0x00003C40 to 0x00003C7F are erased (should be changed to 0xFF)" ); |
| okano | 3:63a0993315e5 | 144 | |
| okano | 3:63a0993315e5 | 145 | memdump( sector_start_adress[ TARGET_SECTOR ], MEM_SIZE ); |
| okano | 3:63a0993315e5 | 146 | #endif |
| okano | 3:63a0993315e5 | 147 | |
| okano | 3:63a0993315e5 | 148 | |
| okano | 5:806960ca964e | 149 | #if defined(TARGET_LPC11UXX) // SAMPLE OF EEPROM ACCESS (LPC11U24 only) |
| okano | 2:c22f0c87fee6 | 150 | printf( "IAP: EEPROM writing test\r\n" ); |
| okano | 2:c22f0c87fee6 | 151 | char mem2[ MEM_SIZE ]; |
| okano | 2:c22f0c87fee6 | 152 | |
| okano | 2:c22f0c87fee6 | 153 | r = iap.write_eeprom( mem, (char*)TARGET_EEPROM_ADDRESS, MEM_SIZE ); |
| okano | 2:c22f0c87fee6 | 154 | printf( "copied: SRAM(0x%08X)->EEPROM(0x%08X) for %d bytes. (result=0x%08X)\r\n", mem, TARGET_EEPROM_ADDRESS, MEM_SIZE, r ); |
| okano | 3:63a0993315e5 | 155 | |
| okano | 2:c22f0c87fee6 | 156 | r = iap.read_eeprom( (char*)TARGET_EEPROM_ADDRESS, mem2, MEM_SIZE ); |
| okano | 2:c22f0c87fee6 | 157 | printf( "copied: EEPROM(0x%08X)->SRAM(0x%08X) for %d bytes. (result=0x%08X)\r\n", TARGET_EEPROM_ADDRESS, mem, MEM_SIZE, r ); |
| okano | 3:63a0993315e5 | 158 | |
| okano | 2:c22f0c87fee6 | 159 | // compare |
| okano | 2:c22f0c87fee6 | 160 | r = memcmp(mem, mem2, MEM_SIZE); |
| okano | 2:c22f0c87fee6 | 161 | printf( "compare result = \"%s\"\r\n", r ? "FAILED" : "OK" ); |
| okano | 3:63a0993315e5 | 162 | |
| okano | 2:c22f0c87fee6 | 163 | printf( "showing the EEPROM contents...\r\n" ); |
| okano | 2:c22f0c87fee6 | 164 | memdump( mem2, MEM_SIZE ); |
| okano | 2:c22f0c87fee6 | 165 | #endif |
| okano | 2:c22f0c87fee6 | 166 | |
| okano | 0:b802bd2f4cc9 | 167 | } |
| okano | 0:b802bd2f4cc9 | 168 | |
| okano | 0:b802bd2f4cc9 | 169 | |
| okano | 7:e140563d4aad | 170 | #include <ctype.h> |
| okano | 7:e140563d4aad | 171 | |
| okano | 3:63a0993315e5 | 172 | void memdump( char *base, int n ) |
| okano | 3:63a0993315e5 | 173 | { |
| okano | 0:b802bd2f4cc9 | 174 | unsigned int *p; |
| okano | 7:e140563d4aad | 175 | char s[17] = { '\x0' }; |
| okano | 0:b802bd2f4cc9 | 176 | |
| okano | 0:b802bd2f4cc9 | 177 | printf( " memdump from 0x%08X for %d bytes", (unsigned long)base, n ); |
| okano | 0:b802bd2f4cc9 | 178 | |
| okano | 0:b802bd2f4cc9 | 179 | p = (unsigned int *)((unsigned int)base & ~(unsigned int)0x3); |
| okano | 0:b802bd2f4cc9 | 180 | |
| okano | 0:b802bd2f4cc9 | 181 | for ( int i = 0; i < (n >> 2); i++, p++ ) { |
| okano | 7:e140563d4aad | 182 | if ( !(i % 4) ) { |
| okano | 7:e140563d4aad | 183 | printf( " : %s\r\n 0x%08X :", s, (unsigned int)p ); |
| okano | 0:b802bd2f4cc9 | 184 | |
| okano | 7:e140563d4aad | 185 | for ( int j = 0; j < 16; j++) |
| okano | 7:e140563d4aad | 186 | s[ j ] = isgraph( (int)(*((char *)p + j)) ) ? (*((char *)p + j)) : ' '; |
| okano | 7:e140563d4aad | 187 | } |
| okano | 0:b802bd2f4cc9 | 188 | printf( " 0x%08X", *p ); |
| okano | 0:b802bd2f4cc9 | 189 | } |
| okano | 7:e140563d4aad | 190 | printf( " : %s\r\n", s ); |
| okano | 0:b802bd2f4cc9 | 191 | } |
IAP (In-Application Programming)