Newsgroup: it.hobby.elettronica.digitale
Titolo: LPC1114,scrivere flash durante escuzione

Ciao
non riesco a trovare esempi su come utilizzare l'IAP per scrivere in flash 
durante l'esecuzione,e su come riservare dei settori per le variabili da 
scrivere e cancellare.Qualcuno può darmi dei riferimenti?
Grazie 

 ha scritto nel messaggio 
news:j2qrfm$qer$1...@speranza.aioe.org...

Ho visto questo post un po' in ritardo...
 
Se non hai già risolto altrimenti ti posso postare un po' di codice che 
usavo per l' IAP degli LPC2000... immagino che sia la stessa. 
 
 

 ha scritto nel messaggio 
news:j5c1gj$ak5$1...@dont-email.me...



 
Questo è parte del codice che usavo per l' LPC2378 (è testato e 
funzionante).
stai attento a:
 
allineamento in RAM del buffer sorgente
allineamento dell' indirizzo in FLASH dove vai a scrivere
dimensione del buffer
 
Le limitazioni dovrebbero essere tutte scritte nella sezione IAP del manuale
 
Altre cose non mi vengono in mente.
 
ciao
 
----------------------------------------
 
struct iap_in {
  unsigned int cmd;
  unsigned int par[4];
};
 
typedef void (*IAP)(struct iap_in *in, unsigned int *result);
#define iap_entry ((IAP) 0x7FFFFFF1)            // IAP entry point
 
 
unsigned int get_secnum(void *addr)  //converte un address in un numero di 
settore
{
//prende pari pari dal manuale dell' LPC2378
 
if        (((unsigned long)(addr)) >= 0x0007D000) return 27;
else if   (((unsigned long)(addr)) >= 0x0007C000) return 26;
else if   (((unsigned long)(addr)) >= 0x0007B000) return 25;
else if   (((unsigned long)(addr)) >= 0x0007A000) return 24;
else if   (((unsigned long)(addr)) >= 0x00079000) return 23;
else if   (((unsigned long)(addr)) >= 0x00078000) return 22;
else if   (((unsigned long)(addr)) >= 0x00070000) return 21;
else if   (((unsigned long)(addr)) >= 0x00068000) return 20;
else if   (((unsigned long)(addr)) >= 0x00060000) return 19;
else if   (((unsigned long)(addr)) >= 0x00058000) return 18;
else if   (((unsigned long)(addr)) >= 0x00050000) return 17;
else if   (((unsigned long)(addr)) >= 0x00048000) return 16;
else if   (((unsigned long)(addr)) >= 0x00040000) return 15;
else if   (((unsigned long)(addr)) >= 0x00038000) return 14;
else if   (((unsigned long)(addr)) >= 0x00030000) return 13;
else if   (((unsigned long)(addr)) >= 0x00028000) return 12;
else if   (((unsigned long)(addr)) >= 0x00020000) return 11;
else if   (((unsigned long)(addr)) >= 0x00018000) return 10;
else if   (((unsigned long)(addr)) >= 0x00010000) return 9;
else if   (((unsigned long)(addr)) >= 0x00008000) return 8;
else if   (((unsigned long)(addr)) >= 0x00007000) return 7;
else if   (((unsigned long)(addr)) >= 0x00006000) return 6;
else if   (((unsigned long)(addr)) >= 0x00005000) return 5;
else if   (((unsigned long)(addr)) >= 0x00004000) return 4;
else if   (((unsigned long)(addr)) >= 0x00003000) return 3;
else if   (((unsigned long)(addr)) >= 0x00002000) return 2;
else if   (((unsigned long)(addr)) >= 0x00001000) return 1;
else if   (((unsigned long)(addr)) >= 0x00000000) return 0;
 
// sector number
}
 
//------------------------------------------------------------------------------------------
 
 
/*
 * Erase Sector between 'start' and 'end'
 * Return:  IAP error code (0 when OK)
 * NOTES:  start needs to be a 256 byte boundary
 *         size should be 256, 512, 1024 or 4089
 */
unsigned int EraseFlashSector(void* start, void* end)
{
//N.B. DISABILITARE INTERRUPT
 
struct iap_in  iap;                      // IAP input parameters
unsigned int result[16];                 // IAP results
 
iap.cmd = 50;                            // IAP Command: Prepare Sectors for 
Write
iap.par[0] = get_secnum(start);         // start sector
iap.par[1] = get_secnum(end);           // end sector
iap_entry (&iap, result);                // call IAP function
if (result[0])  goto exit;               // an error occured?
iap.cmd = 52;                            // IAP command: Erase Flash
iap.par[0] = get_secnum(start);         // start sector
iap.par[1] = get_secnum(end);           // end sector
iap.par[2] = HW_Config.CpuClock;                       // CPU clock in *Hz*
iap_entry (&iap, result);                // call IAP function
exit:
 
 
for (int mah=0; mah<255; mah++); //add some delay
 
//N.B. RIABILITARE INTERRUPT
 
return (result[0]);
}
 
//--------------------------------------------------------------------------------------------------
 
 
/*
 * Program *data to flash_addr. number of bytes specified by size
 * Return:  IAP error code (0 when OK)
 * Note:
 */
 
unsigned int WriteFlash(void *flash_addr, void *data,unsigned int size)
{
//N.B. DISABILITARE INTERRUPT
 
 
struct iap_in  iap;                      // IAP input parameters
unsigned int result[16];                 // IAP results
iap.cmd = 50;                            // IAP Command: Prepare Sectors for 
Write
iap.par[0] = get_secnum(flash_addr);    // start sector
iap.par[1] = iap.par[0];                 // end Sektor
iap_entry (&iap, result);                // call IAP function
if (result[0])  goto exit;               // an error occured?
iap.cmd = 51;                            // IAP Command: Copy RAM to Flash
iap.par[0] = (unsigned int) flash_addr;  // destination-addr
iap.par[1] = (unsigned int) data;        // source-addr
iap.par[2] = size;                       // number of bytes
iap.par[3] = HW_Config.CpuClock;                       // CPU clock in *Hz*
iap_entry (&iap, result);                // call IAP function
exit:
 
 
//N.B. RIABILITARE INTERRUPT
 
return (result[0]);
}
 
 
 

 funzionante).
 
molte grazie,non stasera ma presto lo proverò e cercherò di capire cosa mi 
mancava
 
buona serata